2.13. Döngü denetimi

İki anahtar kelime, bir döngünün nasıl çalıştığını değiştirir:

  • break – döngüden hemen çıkar.

  • continue – geçerli yinelemenin geri kalanını atlar ve bir sonrakine geçer.

Her ikisi de içinde bulundukları en içteki döngüye uygulanır.

2.13.1. break

Bir koşul sağlanır sağlanmaz döngüyü durdurmak için break kullanın. Klasik “ara ve dur” deseni:

found = None
for item in items:
    if matches(item):
        found = item
        break

if found is not None:
    print("found:", found)

Bir while True: döngüsünde, döngünün sona erme yolu break ile olur:

while True:
    line = next_line()
    if line == "quit":
        break
    process(line)

2.13.2. continue

Gövdenin geri kalanını atlayıp bir sonraki yinelemeye geçmek için continue kullanın. Bir döngü içinde öğeleri filtrelemek için kullanışlıdır:

for n in numbers:
    if n < 0:
        continue            # skip negatives
    print(n)

Aynı etki, gövdenin geri kalanını saran bir if bloğuyla da yazılabilir. Atlama koşulunu, tutma koşuluna göre baştan ifade etmek daha kolay olduğunda continue bazen daha anlaşılır olur.

Bir döngünün içinde, continue bir işlevdeki erken return ile aynı rolü oynar: ele almadığınız durumları atlayın ve asıl işi dış girintide düz tutun. Filtrele-ve-işle döngüsü kanonik şekildir:

for item in items:
    if item is None:
        continue
    if not item.is_valid():
        continue
    process(item)

Girintili process(item) satırı asıl iştir; yukarıdaki her koruma, tam olarak hangi öğelerin atlanacağını belirtir.

2.13.3. döngüde else

Hem for hem de while isteğe bağlı bir else bloğu kabul eder. Bu blok, döngü bir break ile karşılaşmadan tamamlandığında çalışır. En yaygın kullanımı, hiçbir şey bulunamazsa bir yedek isteyen bir arama döngüsüdür:

for item in items:
    if matches(item):
        print("found:", item)
        break
else:
    print("no match")

Bir break tetiklenirse, else bloğu atlanır. Yapıyı şöyle okuyun: “for X in Y: …; ya da, hiç çıkış yapmadıysak Z’yi yap.”

2.13.4. Yaygın döngü desenleri

Gerçek betiklerde sık karşılaşılan birkaç desen vardır:

  • Yoklama (Polling) – devam etmeden önce bir koşulun doğru olmasını bekleyin. Gövde, Python’ın işlem yapmayan ifadesi olan pass‘i kullanır; her girintili blok en az bir ifade içermelidir ve “burada hiçbir şey yapma” demenin yolu pass‘tir:

    while not ready():
        pass
    proceed()
    
  • Durum makinesi – bir durum değişkenine göre ne yapacağını seçen tek bir while True: döngüsü. İş, birkaç adlandırılmış aşamaya temiz bir şekilde bölündüğünde kullanışlıdır:

    state = "header"
    for line in lines:
        if state == "header":
            if line.startswith("---"):
                state = "body"
        elif state == "body":
            print(line)
    
  • Biriktirme – bir diziyi gezerken bir sonuç oluşturun:

    total = 0
    for x in samples:
        total += x
    mean = total / len(samples)
    

    Birçok biriktirme döngüsünün, yerleşik bir işlev kullanan tek satırlık bir eşdeğeri vardır. Uygun bir tane olduğunda yerleşik işleve başvurun:

    • sum() – bir yinelenebilirdeki her öğeyi toplar.

    • max() / min() – en büyük veya en küçük öğe.

    • any() – en az bir öğe doğruysa True.

    • all() – yalnızca her öğe doğru olduğunda True.

    • sorted() – öğeleri sıralı içeren yeni bir liste.

    • len() – öğe sayısı (yinelenebilir kendi uzunluğunu bildiğinde).

    >>> samples = [3, 1, 4, 1, 5, 9, 2, 6]
    >>> sum(samples)
    31
    >>> sum(samples) / len(samples)        # mean
    3.875
    >>> max(samples)
    9
    >>> min(samples)
    1
    >>> sorted(samples)
    [1, 1, 2, 3, 4, 5, 6, 9]
    >>> any([False, False, True])
    True
    >>> all([True, True, False])
    False
    

    Yerleşik sürüm, aynı döngüyü elle yazmaktan daha kısa, daha anlaşılır ve genellikle daha hızlıdır.