🐍 class-666

📖 Ders 4 — Döngüler

Aynı işi yüz kez yazma, bir kez yazıp döndür: while, for, range, listeler ve üreteçler. Bitince 🟢 Kolay alıştırmalardan başla.

1. while: koşul sağlandıkça dönen çark

Ekrana 1'den 1000'e kadar yazman gerekse 1000 satır print mi yazardın? Programlamanın en büyük vaadi tam burada: tekrarı makine yapsın. while, koşul True olduğu sürece bloğunu tekrar tekrar çalıştırır — koşul bozulduğu an çark durur:

sayac = 0
while sayac < 15:
    if sayac % 3 == 0:
        print("Sayac değeri:", sayac)
    sayac += 1
# çıktı: Sayac değeri: 0, 3, 6, 9, 12 (alt alta)

Üç parça hep aynı: başlangıç (sayac = 0), koşul (sayac < 15) ve döngü içinde ilerleme (sayac += 1).

Sonsuz döngü tuzağı! sayac += 1 satırını unutursan koşul asla False olmaz — program kilitlenir, hiçbir şey yazmaz. while yazarken kendine sor: "bu koşulu False yapacak satır nerede?"

while, kaç tur döneceğini bilmediğin işlerin ustasıdır. Müfredatın güzel örneği — basamak sökme (% 10 son basamağı verir, // 10 onu atar):

sayi = 1987
while sayi > 0:
    print("Basamak:", sayi % 10)
    sayi //= 10
# çıktı: Basamak: 7, 8, 9, 1 — sayı eriye eriye 0 olunca döngü biter

2. for: koleksiyonun elemanlarını sırayla gez

for ise tur sayısı belli olan işlerin döngüsüdür: elindeki koleksiyonun (birden çok değer taşıyan yapı) her elemanı için bloğu bir kez çalıştırır. Kutuları sırayla açan bir kurye gibi:

for sayi in [1, 6, 3, 7]:
    print("Sıradaki değer:", sayi)
# çıktı:
# Sıradaki değer: 1
# Sıradaki değer: 6
# Sıradaki değer: 3
# Sıradaki değer: 7

Değişken ismini (sayi) sen seçersin; her turda sıradaki elemanı taşır. Sayaç yok, koşul yok — liste bitince döngü kendiliğinden durur. String de bir koleksiyondur, harf harf gezilir:

for harf in "Merhaba":
    print(harf)     # M, e, r, h, a, b, a alt alta
Hangisini seçmeli? Tur sayısı belliyse (listenin elemanları, 1'den 100'e sayılar) → for. "Şu olana KADAR dön" belirsizliği varsa (kumbara dolana kadar, sayı 1 olana kadar) → while.

3. in: "içinde mi?" operatörü

for x in liste yazımındaki in kelimesinin bir de soru soran hali var: bir değer koleksiyonun içindeyse True, değilse False döner:

sepet = ["elma", "muz"]
print("muz" in sepet)        # True
print("kivi" in sepet)       # False

for harf in "Merhaba Dünya":
    if harf in "aeıioöuüAEIİOÖUÜ":
        print("Sesli harf:", harf)   # e, a, a, ü, a

Koca bir arama döngüsünü tek kelimeye indirir — if "Ayşe" in sinif: okunuşuyla bile Türkçe gibi.

4. Listeler: 0'dan numaralı sıralı kutular

Liste (list), yan yana dizilmiş kutular gibidir: her kutunun 0'dan başlayan bir dizin (konum numarası) vardır ve içine her tipten değer koyabilirsin:

liste = [1, 2, 3, "Osman", True]   # karışık tip sorun değil
bos1 = []
bos2 = list()                       # ikisi de boş liste

Üç vazgeçilmez araç:

liste = ["a", "b"]
liste.append("c")     # SONA ekler → ['a', 'b', 'c']

son = liste.pop()     # sondakini ÇIKARIR ve verir → son = 'c'
ilk = liste.pop(0)    # dizin verirsen oradakini alır → ilk = 'a'

print(len(liste))     # len = eleman sayısı → 1

Klasik ikili: boş liste aç, döngüyle doldur

kareler = []
for sayi in [1, 2, 3, 4, 5]:
    kareler.append(sayi ** 2)
print(kareler)        # [1, 4, 9, 16, 25]
append tuzağı: append listeyi yerinde değiştirir, geriye None döndürür. liste = liste.append(x) yazarsan listen yok olur! Doğrusu sadece liste.append(x). (pop ise tam tersi — çıkardığını döndürür, değişkende yakala.)

5. range: sayı aralığı üretici

"1'den 100'e kadar dön" demek için 100 elemanlı liste yazmazsın — range(başla, bit, adım) senin yerine üretir:

list(range(10))         # [0, 1, 2, ..., 9]   tek sayı = 0'dan başlar
list(range(5, 15))      # [5, 6, ..., 14]
list(range(5, 25, 2))   # [5, 7, 9, ..., 23]   adım 2
list(range(10, 0, -1))  # [10, 9, ..., 1]      geriye sayar!
for i in range(1, 6):
    print(i)            # 1 2 3 4 5 alt alta
Bitiş dahil DEĞİL! range(1, 10) 9'da durur — 10'u da istiyorsan range(1, 11) yazmalısın. "Son sayı eksik çıktı" hatası, döngü dünyasının bir numaralı klasiğidir.

6. break ve continue: döngünün fren ve gaz pedalı

break (kır) döngüyü anında bitirir — kalan turlar hiç işletilmez. Aradığını bulunca durmasını istediğin aramalarda birebir:

for i in [10, 20, 25, 30]:
    if i > 20:
        break        # 25'i görünce çark kırıldı
    print(i)
# çıktı: 10  20

continue (devam et) ise sadece o turu atlar, döngü sonraki elemandan sürer — "bu elemanı eleme takılma, geç":

for i in range(10):
    if i % 3 == 0:
        continue     # 0, 3, 6, 9 pas geçildi
    print(i)
# çıktı: 1 2 4 5 7 8
break ≠ continue! break tüm döngüyü öldürür, continue tek turu atlar. Ve continue'dan SONRAKİ satırlar o turda hiç çalışmaz — print'i yanlış tarafa koyarsan atlama işe yaramaz.

7. for-else: "hiç kırılmadan bittiyse"

Python'a özgü bir incelik: döngünün de else'i olur ve döngü break ile kırılmadan biterse çalışır. En parlak kullanımı arama — bulursan break, hiç bulamazsan else:

sayi = 17
for i in range(2, sayi):
    if sayi % i == 0:
        print(sayi, "asal değildir!")
        break
else:
    print(sayi, "asaldır.")
# çıktı: 17 asaldır.  (hiç bölen çıkmadı → break çalışmadı → else çalıştı)

Bölen aramak, kaybolan anahtarı aramak gibidir: bulduğun an aramayı bırakırsın (break); bütün odalara bakıp bulamadıysan "yok" dersin (else). Bayrak değişkenine gerek kalmaz.

Hiza ipucu: bu else if'in değil for'un else'idir — for ile aynı hizada yazılır. while döngüsüne de aynı şekilde else eklenebilir.

8. Liste üreteçleri: tek satırda üret

"Boş liste aç, döngüyle doldur" o kadar yaygın ki Python ona kısayol vermiş — liste üreteci (list comprehension):

sayilar = [1, 2, 3, 4, 5]
kareleri = [sayi ** 2 for sayi in sayilar]
print(kareleri)      # [1, 4, 9, 16, 25]

Okunuşu: "sayilar'daki her sayı için karesini listele". Sona if ekleyince süzgeçli üretim yaparsın:

sayilar = list(range(10))
ciftlerin_kareleri = [i ** 2 for i in sayilar if i % 2 == 0]
print(ciftlerin_kareleri)    # [0, 4, 16, 36, 64]

Bu tek satır, şu üç satırın birebir aynısıdır: boş liste + for + koşullu append. Üreteci okuyamadığın gün, kafanda uzun haline geri aç.