Döngüler: for ve while ile Tekrar Eden İşler

Önceki derste değişkenleri, temel veri tiplerini ve if ile karar yapılarını görmüştük; programın belirli koşullara göre farklı yollara sapmasını sağlamıştık. Bu derste ise aynı işlemi defalarca tekrarlatmayı öğreneceğiz: yani döngüler. Bir sonraki derste fonksiyonlarla kodu yeniden kullanılabilir parçalara böleceğiz; bu yüzden döngüleri iyi kavramak, o dersteki fonksiyon içi tekrarları anlaman için de önemli.

Bu derste ne yapacağız?

Bu derste for ve while döngülerinin ne işe yaradığını, aralarındaki farkı ve ne zaman hangisini kullanman gerektiğini öğreneceksin. range() fonksiyonunu, break ve continue anahtar kelimelerini de küçük örneklerle göreceksin. Derse başlamadan önce değişken atama, print() ile ekrana yazdırma ve if/else yapısını bilmen yeterli; bunlar önceki derste işlenmişti.

Kavram

Bir döngü, bilgisayara "şu işlemi belirli sayıda ya da belirli bir koşul doğru olduğu sürece tekrarla" demenin yoludur. Günlük hayattan bir benzetme yapalım: Bir öğretmen sınıftaki her öğrencinin yoklamasını alırken listeye tek tek bakar, her isim için "burada mı, yok mu" kontrolü yapar. Liste bitene kadar bu işlemi tekrarlar. İşte for döngüsü tam olarak buna benzer: elindeki bir listenin (veya sayı aralığının) her bir öğesi için aynı işlemi sırayla uygular ve liste bitince kendiliğinden durur.

while döngüsü ise biraz farklı çalışır. Bir çalar saat düşün: "zil çalana kadar" uyumaya devam edersin, ama zilin ne zaman çalacağını baştan bilmezsin, sadece bir koşulu (zil çaldı mı?) sürekli kontrol edersin. while döngüsü de bir koşul doğru olduğu sürece bloğu tekrar tekrar çalıştırır; koşul ne zaman yanlış olacağını sen önceden bilmesen de olur. Kısacası: kaç kez tekrar edeceğini biliyorsan veya elinde bir liste varsa for, tekrarın ne zaman biteceğini bir koşula bağlıyorsan while tercih edilir.

Adım adım uygulama

Aşağıdaki adımları önceki derste kullandığın Python ortamında (örneğin IDLE, Thonny veya bir metin düzenleyici ve terminal) sırayla dene. Her adımdaki kodu ayrı bir dosyaya ya da etkileşimli kabuğa yazıp çalıştırarak sonucu gözlemle. Arayüz ayrıntıları kullandığın Python sürümüne ve programa göre küçük farklılıklar gösterebilir.

  • İlk olarak yeni bir dosya oluştur ve donguler.py gibi bir isimle kaydet.
  • Basit bir for döngüsü yazmak için şu satırı ekle: for sayi in range(1, 6):
  • Bir alt satıra, girinti (dört boşluk veya bir Tab) ile birlikte şunu yaz: print(sayi)
  • Dosyayı kaydedip çalıştırdığında ekranda 1'den 5'e kadar sayıların art arda yazıldığını göreceksin. Burada range(1, 6) ifadesi 1'den başlayıp 6'ya ulaşmadan (yani 1, 2, 3, 4, 5) sayı üretir; son sınır her zaman dışarıda bırakılır.
  • Şimdi bir listeyle çalışan bir for döngüsü ekle: meyveler = ["elma", "armut", "muz"]
  • Alt satıra şunu yaz: for meyve in meyveler:
  • Girintili satıra: print(meyve, "aldım")
  • Çalıştırdığında listedeki her meyve için ayrı bir satır ekrana basılacak; döngü, listenin sonuna gelince kendiliğinden durur.
  • Şimdi bir while döngüsü deneyelim. Önce bir sayaç değişkeni tanımla: sayac = 0
  • Ardından koşulu yaz: while sayac < 3:
  • Girintili iki satır ekle: print("merhaba", sayac) ve altına sayac = sayac + 1
  • Bu döngü, sayac değişkeni 3'ten küçük olduğu sürece çalışır; her turda sayacı bir artırdığımız için sonunda koşul yanlış olur ve döngü durur. Bu artırma satırını unutursan döngü hiç durmaz; buna "sonsuz döngü" denir ve programı kilitler.
  • Son olarak break ve continue kullanımını dene: for sayi in range(1, 10): yaz, altına if sayi == 5:, onun altına bir girinti daha ekleyerek break, ardından döngü satırıyla aynı hizada print(sayi) ekle. break, sayı 5 olduğunda döngüyü tamamen sonlandırır; continue kullansaydın ise sadece o turu atlayıp döngüye devam ederdi.

Sık karşılaşılan sorunlar

Hata / DurumOlası NedenÇözüm
Program hiç durmuyor, ekran sürekli yazı basıyorwhile döngüsündeki koşul hiçbir zaman yanlış olmuyor (sonsuz döngü)Döngü içinde koşulu değiştiren bir satır (örneğin sayacı artırma) olduğundan emin ol; gerekirse çalışan programı durdurmak için Ctrl+C kullan
IndentationError (girinti hatası)Döngü içindeki satırlar aynı hizada değil veya girinti eksikDöngü bloğundaki tüm satırları aynı sayıda boşlukla (genellikle dört) girintile
range(1, 6) beklenenden bir eksik sayı üretiyor sandınrange()'in ikinci sınırı üretime dahil edilmezİstediğin son sayıya bir fazlasını yazarak sınırı ayarla, örneğin 1'den 6'ya kadar (dahil) için range(1, 7) kullan
TypeError: 'int' object is not iterablefor döngüsünde range() yerine doğrudan bir sayı kullanılmışDöngüde gezinilecek şeyin bir liste, metin veya range() gibi bir dizi olduğundan emin ol
Döngü beklenenden bir eksik veya bir fazla çalışıyorSayaç başlangıç değeri veya karşılaştırma operatörü (< yerine <=) yanlış seçilmişKoşulu ve başlangıç değerini kağıda yazıp elle birkaç turu simüle ederek kontrol et

Mini görev

Kendi başına küçük bir program yaz: 1'den 20'ye kadar olan sayılar arasında yalnızca çift sayıları ekrana yazdıran bir for döngüsü oluştur. İpucu: if sayi % 2 == 0: satırıyla bir sayının çift olup olmadığını kontrol edebilirsin (% işareti bölümden kalanı verir). Ardından ayrı bir bölümde, kullanıcıdan input() ile bir kelime al ve kullanıcı "dur" yazana kadar tekrar tekrar kelime isteyen bir while döngüsü yaz.

Kontrol listesi:

  • Çift sayılar doğru şekilde (2, 4, 6, ... 20) listeleniyor mu?
  • for döngüsünde girinti hataları yok mu?
  • while döngüsü "dur" yazıldığında gerçekten duruyor mu?
  • Sonsuz döngüye düşmediğinden emin oldun mu?
  • Kodun içinde en az bir kez range() kullandın mı?

Kendini sına

1) for ve while döngüleri arasındaki temel fark nedir?

2) range(2, 8) ifadesi hangi sayıları üretir?

3) Bir while döngüsünün sonsuza kadar çalışmasını önlemek için nelere dikkat etmelisin?

4) break ile continue arasındaki fark nedir?

5) Bir listedeki her öğe için aynı işlemi yapmak istediğinde hangi döngü türünü tercih edersin, neden?

Cevaplar

1) for döngüsü, elimizdeki bir liste veya sayı aralığı gibi belirli bir dizinin her öğesi için çalışır ve dizi bitince durur; while döngüsü ise bir koşul doğru olduğu sürece çalışır ve tekrar sayısı önceden bilinmeyebilir.

2) 2, 3, 4, 5, 6, 7 sayılarını üretir; 8 dahil edilmez çünkü range()'in üst sınırı üretime dahil edilmez.

3) Döngü içinde, koşulu etkileyen bir değişkeni (örneğin sayacı) her turda güncellemeye ve koşulun bir noktada mutlaka yanlış olacağından emin olmaya dikkat etmelisin.

4) break döngüyü tamamen sonlandırır ve döngüden çıkar; continue ise yalnızca o anki turu atlayıp döngünün bir sonraki turuna geçer, döngü devam eder.

5) for döngüsünü tercih edersin, çünkü listenin uzunluğu bellidir ve for döngüsü her öğeyi sırayla otomatik olarak dolaşır; sayaç tutmana veya koşul yazmana gerek kalmaz.

Bir sonraki derste, tekrar eden bu kod bloklarını isimlendirip yeniden kullanılabilir hâle getirmeyi, yani fonksiyonları göreceğiz; burada öğrendiğin döngüleri fonksiyonların içinde de kullanmaya devam edeceksin.

Bu dersi kayıt olmadan izleyebilirsin. İlerlemeni kaydetmek, sertifika almak ve puan tablosuna girmek için ücretsiz üye ol: Kayıt Ol