Ek Çalışma — Bozuk Kod Havuzu
Bozuk kod havuzu
Her vaka için aynı dört adımı uygulayın:
- Programın amaçlanan davranışını okuyun.
- Hatanın bulunduğu satırı/yapıyı belirleyin.
- Nedenini kendi cümlenizle açıklayın.
- En küçük düzeltmeyi yapın ve en az bir sınır durumuyla yeniden deneyin.
A — Sınır ve off-by-one hataları (6 vaka)
A1 — 1’den 5’e kadar yazdır
Amaç: 1 2 3 4 5
for i in range(1, 5):
print(i, end=" ")Gözlenen: 1 2 3 4
A2 — 0 dahil 4 elemanı işle
Amaç: Listenin dört elemanını da yazdırmak.
sayilar = [10, 20, 30, 40]
for i in range(1, len(sayilar)):
print(sayilar[i])Gözlenen: 10 hiç yazdırılmıyor.
A3 — Metnin son karakterini de al
Amaç: Python metninin tamamını yazdırmak.
metin = "Python"
print(metin[0:len(metin) - 1])Gözlenen: Pytho; son karakter dilimin dışında kalıyor.
A4 — Yaş 18 ise yetişkin kabul et
yas = 18
if yas > 18:
print("Yetişkin")
else:
print("Koşul sağlanmadı")Gözlenen: Koşul sağlanmadı
A5 — Listenin son indeksini aşma
Amaç: Her elemanı indeksle yazdırmak.
sayilar = [4, 8, 12]
i = 0
while i <= len(sayilar):
print(sayilar[i])
i += 1Gözlenen: İlk üç değer yazıldıktan sonra IndexError.
A6 — 0 ve 100 geçerli puan olsun
puan = 100
if 0 < puan < 100:
print("Geçerli")
else:
print("Geçersiz")Gözlenen: 100 için Geçersiz.
- A1:
range(1, 6)kullanın;rangeüst sınırı dahil etmez. - A2:
range(len(sayilar))ile0dan başlayın veya daha Pythonik olarakfor sayi in sayilarkullanın. - A3: dilimin üst sınırı zaten dahil değildir; tüm metin için
metin[:]veyametin[0:len(metin)]kullanılabilir. - A4: sınır değeri dahilse
yas >= 18. - A5:
i < len(sayilar); son geçerli indekslen(...) - 1dir. - A6:
0 <= puan <= 100.
B — input() ve tür dönüşümü hataları (4 vaka)
B1 — Yaşa 1 ekle
yas = input("Yaş: ")
print(yas + 1)Gözlenen: TypeError.
B2 — İki sayıyı topla
Örnek girdi: 10 ve 20; amaç 30.
a = input("A: ")
b = input("B: ")
print(a + b)Gözlenen: 1020.
B3 — Ondalıklı fiyatı dönüştür
fiyat = input("Fiyat: ") # kullanıcı: 12.5
print(int(fiyat))Gözlenen: ValueError.
B4 — Sayısal olmayan girdiyi aralık kontrolüyle yakalama
puan = int(input("Puan: ")) # kullanıcı: abc
if 0 <= puan <= 100:
print("Geçerli")
else:
print("Geçersiz")Gözlenen: if satırına gelmeden ValueError.
- B1:
yas = int(input(...))veya dönüşümü ayrı satırda yapın. - B2: her iki girdiyi
int()/gereksinime görefloat()ile dönüştürün. - B3:
float(fiyat)kullanın; ondalıklı metin doğrudanint("12.5")olamaz. - B4: dönüşüm hatası aralık kontrolünden önce oluşur. 13. bölüm bilgisiyle
try/except ValueErrorkullanın; ardından 0–100 aralığını kontrol edin.
C — Aliasing ve kopyalama hataları (5 vaka)
C1 — Yedek listeyi bağımsız tut
notlar = [70, 80]
yedek = notlar
yedek.append(90)
print(notlar)Gözlenen: [70, 80, 90]; özgün liste de değişti.
C2 — İki öğrencinin not listesi ayrı olsun
ortak = []
ada = ortak
ece = ortak
ada.append(100)
print(ece)Gözlenen: [100].
C3 — Sığ kopyanın sınırı
a = [[1, 2], [3, 4]]
b = a.copy()
b[0].append(9)
print(a)Gözlenen: [[1, 2, 9], [3, 4]].
C4 — Fonksiyon özgün listeyi değiştirmesin
def sirala(veri):
veri.sort()
return veri
sayilar = [3, 1, 2]
sonuc = sirala(sayilar)
print(sayilar)Gözlenen: [1, 2, 3]; özgün liste de sıralandı.
C5 — “Kopya” değişkeni aslında aynı nesne
a = [1, 2]
b = a
print(a is b)Gözlenen: True; amaç bağımsız listeydi.
- C1:
yedek = notlar.copy()gibi sığ kopya oluşturun. - C2:
ada = []veece = []ayrı oluşturulmalı; aynı listeyi iki ada bağlamayın. - C3: sığ kopya yalnız dış listeyi ayırır. İç listelerin de bağımsız olması gerekiyorsa bu yapı için örneğin
[satir.copy() for satir in a]kullanılabilir; daha genel iç içe yapılarda derin kopya gereksinimini ayrıca değerlendirin. - C4: özgünü korumak isteniyorsa
return sorted(veri)kullanın veya önce kopya alın. - C5:
b = a.copy()(veya bağlama uygun başka kopyalama) gerekir.
D — Sonsuz döngü ve eksik ilerleme (4 vaka)
D1 — Sayaç hiç değişmiyor
sayac = 1
while sayac <= 5:
print(sayac)Gözlenen: 1 sürekli yazdırılıyor.
D2 — Yanlış yönde güncelleme
kalan = 3
while kalan > 0:
print(kalan)
kalan += 1Gözlenen: 3, 4, 5, ... diye devam ediyor.
D3 — Geçersiz girdi değişmiyor
puan = -1
while puan < 0 or puan > 100:
print("Geçersiz")Gözlenen: döngü bitmiyor.
D4 — continue güncellemeyi atlıyor
i = 0
while i < 5:
if i == 2:
continue
print(i)
i += 1Gözlenen: i == 2 olduktan sonra döngü sonsuza giriyor.
- D1: gövdeye
sayac += 1ekleyin. - D2:
kalan -= 1olmalı. - D3: döngü içinde yeni girdi alınmalı veya koşulu değiştirecek başka bir durum güncellenmelidir.
- D4: güncellemeyi
continueöncesine taşıyın ya da döngüyü, her yolda ilerleme garanti edecek şekilde yeniden düzenleyin.
E — Kapsam ve dönüş değeri hataları (4 vaka)
E1 — return unutulmuş
def kare(x):
x * x
sonuc = kare(4)
print(sonuc)Gözlenen: None.
E2 — Yerel değişkeni dışarıda kullanma
def hesapla():
toplam = 10 + 20
hesapla()
print(toplam)Gözlenen: NameError.
E3 — print ile return karıştırılmış
def topla(a, b):
print(a + b)
sonuc = topla(2, 3)
print(sonuc * 2)Gözlenen: önce 5, ardından TypeError (None * 2).
E4 — Global adı değiştirmeye çalışırken UnboundLocalError
sayac = 0
def artir():
sayac = sayac + 1
return sayac
print(artir())Gözlenen: UnboundLocalError.
- E1:
return x * x. - E2:
toplamyalnız fonksiyonun yerel kapsamındadır; değer gerekiyorsareturn toplamile çağırana verin. - E3: hesap yapan fonksiyon
return a + bdöndürmeli; kullanıcıya yazdırma çağıran tarafta yapılabilir. - E4: en iyi başlangıç, global durum yerine değeri parametre olarak alıp yeni değeri döndürmektir. Global değişken gerçekten gerekiyorsa
global sayacsözdizimi vardır; fakat küçük işlevlerde gereksiz global durumdan kaçının.
F — İndeks ve anahtar hataları (2 vaka)
F1 — Son siparişi raporla
Amaç: Listedeki son sipariş kimliği olan S-103 değerini yazdırmak.
siparisler = ["S-101", "S-102", "S-103"]
son_indeks = len(siparisler)
print(siparisler[son_indeks])Gözlenen: IndexError; len(siparisler) eleman sayısıdır, son geçerli indeks değildir.
F2 — Yeni ürün gelirse stok kaydını başlat
Amaç: Gelen ürünleri mevcut stoğa eklemek; sözlükte olmayan ürünün stok sayısını 0dan başlatmak.
stok = {"kalem": 5, "defter": 2}
gelenler = ["kalem", "silgi", "kalem"]
for urun in gelenler:
stok[urun] += 1
print(stok)Gözlenen: silgi işlenirken KeyError; program sonraki ürüne geçemiyor.
- F1: son eleman için
siparisler[-1]veyasiparisler[len(siparisler) - 1]kullanılabilir. Boş liste olasılığı varsa ayrıca eleman bulunup bulunmadığını kontrol edin. - F2: eksik anahtarın bu problemde normal olduğu sözleşmeye göre
stok[urun] = stok.get(urun, 0) + 1kullanın. Eksik anahtarın program hatası olması gereken başka bir problemde[]erişimininKeyErrorüretmesi yararlı olabilir.
Son kontrol
Düzelttiğiniz her vakada yalnız “artık hata vermiyor” demeyin. Bir normal örnek ve mümkünse bir sınır/geçersiz durum daha deneyerek düzeltmenin gerçekten amaçlanan davranışı sağladığını doğrulayın.