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 yolupass‘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.any()– en az bir öğe doğruysaTrue.all()– yalnızca her öğe doğru olduğundaTrue.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.