Temeller

Python'da döngüler ve koşullar: for, while, range, enumerate, break, if/elif ve match/case

Güncellendi: · Skillaria.Top

Python'da döngüler işlemleri tekrarlar: for, bir koleksiyonun ya da range() aralığının elemanlarını sırayla dolaşır, while ise koşul doğru olduğu sürece çalışır. break ile döngüden çıkılır, continue ile bir tur atlanır, enumerate() sıra numarası verir. Kararları if/elif/else koşulları, veri biçimine göre ayrıştırmayı ise match/case (Python 3.10'dan itibaren) verir.

Python'da döngüler bir işlemi tekrarlamak için kullanılır: alışveriş listesini dolaşmak, dosyanın her satırını işlemek ya da kullanıcı geçerli bir sayı girene kadar sormak. Dilde iki döngü vardır, for ve while; döngülerin içinde karar vermek için ise if/elif/else koşulları ve match/case yapısı kullanılır. Her aracı çalışan örneklerle inceleyelim.

Koşullar: if, elif, else

Koşul yapısı, ifade doğru olduğunda bir blok çalıştırır. Blok 4 boşluklu girintiyle belirtilir; Python'da süslü parantez yoktur ve yanlış girinti hemen IndentationError hatası verir.

spent = 4200
limit = 5000

if spent > limit:
    print("Limit aşıldı")
elif spent > limit * 0.8:
    print("Bütçenin %20'sinden azı kaldı")
else:
    print("Her şey yolunda")

elif dalları yukarıdan aşağıya kontrol edilir ve yalnızca ilk uyan dal çalışır. Bu yüzden daha sıkı koşulları yukarı koyun: spent > limit * 0.8 kontrolü birinci sırada olsaydı, limit aşımı mesajı hiç görünmezdi.

Neyin doğru sayıldığı

Koşulda karşılaştırma yazmak zorunda değilsiniz. False, None, sıfır (0, 0.0) ve boş koleksiyonlar ("", [], {}) yanlış sayılır; geri kalan her şey doğrudur. Bu yüzden "liste boş değil" kontrolü kısa yazılır:

expenses = []
if not expenses:
    print("Henüz harcama yok")

Koşulları and, or ve not ile birleştirirsiniz; bir aralığı zincirleme karşılaştırmayla kontrol etmek de kolaydır: if 0 < amount <= 100_000:. Kısa bir seçim için üçlü operatör vardır: status = "yüksek" if spent > limit else "normal".

for döngüsü: sözdizimi ve örnekler

Python'daki for, C dilindeki gibi bir sayaç değildir; elemanları tek tek dolaşır. Yinelenebilir bir nesnenin, yani bir listenin, bir metnin, bir sözlüğün, bir dosyanın ya da bir aralığın elemanlarını sırayla alır. Diğer dillerdeki foreach işlevi, Python'da zaten normal for ile görülür.

expenses = [350, 1200, 89, 4500]
total = 0
for amount in expenses:
    total += amount
print(total)  # 6139

Sözdizimi: for değişken in koleksiyon:, ardından girintili blok. Döngüden sonra değişken son değerini korur; bu bazen işe yarar, ama büyük programlarda buna güvenmemek daha iyidir.

Metin, liste ve sözlükte dolaşmak

Bir metin karakter karakter, bir liste eleman eleman dolaşılır. Sözlük üzerinde döngü varsayılan olarak anahtarları verir; anahtarla değeri birlikte almak için .items() kullanın:

by_category = {"yiyecek": 3200, "ulaşım": 900, "sinema": 600}

for category, amount in by_category.items():
    print(f"{category}: {amount} TL")

Yalnızca değerler için .values() vardır. Döngü sırasında sözlüğün boyutunu değiştirmek yasaktır; RuntimeError: dictionary changed size during iteration hatası alırsınız. Eleman silmeniz gerekiyorsa kopya üzerinde dolaşın: for key in list(d):.

range fonksiyonu: sayılar üzerinde döngü

Sayılar üzerinde dolaşmak için range() kullanılır. Bellekte liste oluşturmaz, sayıları birer birer üretir; bu yüzden range(10**9) anında çalışır.

ÇağrıSayılar
range(5)0, 1, 2, 3, 4
range(2, 6)2, 3, 4, 5
range(0, 10, 3)0, 3, 6, 9
range(5, 0, -1)5, 4, 3, 2, 1

Temel kural: sağ sınır aralığa dahil değildir. range(1, 10) 9'da biter; bu, "bir eksik" hatasının en yaygın nedenidir. Adım negatif olabilir, ama sıfır olamaz.

for i in range(1, 4):
    print(f"{i}. gün")
# 1. gün
# 2. gün
# 3. gün

enumerate: döngüde sayaç

Yeni başlayanlar sıra numarasını bilmek için sık sık for i in range(len(items)) yazar. Bu da çalışır, ama okunması zordur. enumerate() fonksiyonu "numara, eleman" çiftleri verir; start parametresi sayımın hangi sayıdan başlayacağını belirler:

items = ["kahve", "taksi", "öğle yemeği"]
for n, item in enumerate(items, start=1):
    print(n, item)
# 1 kahve
# 2 taksi
# 3 öğle yemeği

İki listeyi birlikte dolaşmak için zip() vardır: for name, price in zip(names, prices):. En kısa listede durur; Python 3.10'dan itibaren strict=True verilirse uzunluklar farklı olduğunda hata verir.

while döngüsü

while döngüsü, koşul doğru olduğu sürece bloğu tekrarlar. Tekrar sayısı önceden bilinmediğinde kullanılır: doğru girdi beklerken, veri sonuna kadar okunurken ya da bir istek başarılı olana kadar denenirken.

balance = 10_000
month = 0
while balance > 0:
    balance -= 2_700
    month += 1
print(f"Para {month} ay yeter")  # 4

En büyük tehlike, koşuldaki değişkeni değiştirmeyi unutmaktır; döngü hiç bitmez. Program donarsa Ctrl+C'ye basın: Python çalışmayı KeyboardInterrupt ile durdurur.

Sonsuz döngü ve do while

Sonsuz döngü bilerek yazılabilir: break ile çıkışı olan while True:. Python'da do while yapısı yoktur; sondan kontrollü döngünün yerini bu kalıp alır: gövde en az bir kez çalışır, kontrol ise sonda yapılır.

while True:
    raw = input("Tutar: ")
    if raw.isdigit():
        amount = int(raw)
        break
    print("Lütfen tam sayı girin")

Sonsuz for döngüsü nadirdir; yalnızca itertools.count() gibi sonsuz bir yineleyici dolaşılırsa oluşur.

break ve continue: döngüden çıkmak ve tur atlamak

break döngüyü hemen keser ve program döngüden sonraki koda geçer. continue ise o turun kalanını atlayıp bir sonraki tura geçer.

expenses = [350, -10, 1200, 0, 99_999, 89]

for amount in expenses:
    if amount <= 0:
        continue          # bu turu atla
    if amount > 50_000:
        print("Şüpheli tutar, duruyoruz")
        break             # döngüden çık
    print(amount)

Bu kod 350 ve 1200'ü yazdırır, ardından uyarıyı verir; 89'a döngü gelmez. İki komut da yalnızca içinde bulundukları en yakın döngüyü etkiler.

Döngünün else bloğu

for ve while için alışılmadık bir else dalı vardır: döngü break olmadan kendi kendine bittiğinde çalışır. Arama işlemlerinde işe yarar:

for amount in expenses:
    if amount > 50_000:
        print("Büyük bir harcama bulundu")
        break
else:
    print("Büyük harcama yok")

İç içe döngüler

Bir döngünün içindeki döngü, dıştaki her turda tamamen çalışır. Tablolar, matrisler ve ikili kombinasyonlar bu şekilde dolaşılır.

for row in range(1, 4):
    for col in range(1, 4):
        print(row * col, end="\t")
    print()

İki noktaya dikkat edin. Birincisi, karmaşıklık hızla artar: 10 000 elemanlık iki iç içe döngü 100 milyon işlem demektir. İkincisi, break yalnızca iç döngüden çıkar. İki döngüyü birden durdurmak için döngüleri bir fonksiyona koyup return kullanın; bu, bayraklar kullanmaktan daha temizdir.

match/case yapısı

Python 3.10 ile if cmd == ... elif ... zincirinin yerine match ifadesi gelebilir (PEP 634). Bu yalnızca bir switch değildir: değeri bir kalıpla (pattern) eşleştirir, veri biçimine bakar ve parçaları doğrudan değişkenlere ayırır.

def parse(text):
    match text.split():
        case ["ekle", item, amount]:
            return f"{item} eklendi: {amount}"
        case ["liste"] | ["ls"]:
            return "Harcamalar gösteriliyor"
        case ["çıkış"]:
            return "Çıkılıyor"
        case _:
            return "Bilinmeyen komut"

print(parse("ekle Kahve 250"))  # Kahve eklendi: 250
print(parse("ekle Kahve"))      # Bilinmeyen komut

Liste kalıbı ["ekle", item, amount] yalnızca ilk elemanı "ekle" olan ve tam üç elemanlı listelerle eşleşir. Bu yüzden tutarsız bir komut, her şeyi yakalayan _ dalına düşer. | işareti seçenekleri birleştirir.

Sözlük kalıpları, tür kontrolü ve koruma koşulu

Sözlük kalıbı yalnızca yazılan anahtarları kontrol eder, fazla anahtarları yok sayar. int(a) yazımı hem türü denetler hem değeri yakalar; kalıptan sonra gelen if ise ek bir koşul (guard) ekler:

match event:
    case {"type": "expense", "amount": int(a)} if a > 10_000:
        print("Büyük harcama", a)
    case {"type": "expense", "amount": int(a)}:
        print("Harcama", a)

match'in asıl tuzağı

case içindeki çıplak bir isim karşılaştırma değil, yakalamadır. case limit: her değerle eşleşir ve değeri limit adına yazar. Sabitlerle karşılaştırmak için nokta içeren bir isim kullanın, örneğin case Color.RED:, ya da doğrudan bir değişmez değer yazın.

Python 3.10'dan beri match sözdizimi neredeyse değişmedi. Python 3.15'te küçük bir asimetri giderildi: değişmez değer kalıplarında önceden yalnızca sayının önündeki eksi işareti kabul ediliyordu; artık case +1: de yazılabilir. Daha eski sürümlerde bu kod sözdizimi hatası verir.

Döngülerde tipik hatalar

  • Döngü sırasında listeyi değiştirmek. for içinde eleman silmek komşu elemanları atlatır. Yeni bir liste kurun: clean = [x for x in items if x > 0].
  • range sınırı. range(1, n), n değerini içermez.
  • while içindeki koşulu güncellememek — sonsuz döngü.
  • Döngüde += ile metin birleştirmek: büyük veride "".join(parts) çok daha hızlıdır.
  • Karşılaştırma yerine atama: if x = 5 sözdizimi hatasıdır; karşılaştırma için == kullanılır.

Pratik için döngü görevleri

  1. Harcama listesindeki negatif değerleri atlayarak toplamı ve ortalamayı hesaplayın.
  2. İç içe döngülerle 1–9 çarpım tablosunu yazdırın.
  3. Kullanıcı boş satır girene kadar sayı isteyin, sonra en büyüğünü yazdırın.
  4. Listedeki 1000'den büyük ilk sayıyı bulun; yoksa bunu bildirin (for ... else ile).
  5. ekle, sil, liste komutlarını match ile ayrıştırın.

Özet

Python döngüleri iki yapıya dayanır: for bir koleksiyonun ya da range() aralığının elemanlarını dolaşır, while koşul sürdükçe çalışır. break ve continue döngünün akışını yönetir, enumerate() ve zip() elle sayaç tutma ihtiyacını ortadan kaldırır, if/elif/else ve match/case ise kararları verir. Bu araçların tümü harcama takipçisi örneğiyle kursun Python dersinde uygulamalı olarak işlenir.

Sık sorulan sorular

Python'da for ile while arasındaki fark nedir?

for hazır bir diziyi dolaşır ve ne zaman duracağını bilir; while ise koşul doğru olduğu sürece tekrarlanır. Tekrar sayısı biliniyorsa ya da bir koleksiyon varsa for, bir olayı bekliyorsanız while kullanın.

Bir döngüyü ters sırada nasıl dolaşırım?

Koleksiyon için reversed(items), sayılar için range(n - 1, -1, -1) kullanın. reversed listeyi kopyalamaz, sondan başlayarak dolaşır.

Python'da switch var mı?

Ayrı bir switch yoktur; bunun yerini if/elif zinciri ve Python 3.10'da gelen match/case alır. match daha fazlasını yapar: listeleri ve sözlükleri biçimlerine göre ayırır ve değerleri yakalar.

Döngü mü yoksa liste üretimi (comprehension) mi daha hızlıdır?

[x * 2 for x in items] gibi liste üretimleri, eşdeğer append kullanan döngüden genellikle biraz hızlı ve daha kısadır. Birden fazla koşullu karmaşık mantıkta ise sıradan döngü daha okunaklıdır.

İki iç içe döngüden aynı anda nasıl çıkarım?

break yalnızca iç döngüyü keser. En kolay yol, döngüleri bir fonksiyona taşıyıp return ile çıkmaktır.

Bu konuyu videoyla öğrenin

Bu konu “Python 3.15: от новичка до профи” kursunda uygulamalı olarak ayrıntılı işleniyor.

Kursa git