2.13. Řízení smyčky¶
Chování smyčky mění dvě klíčová slova:
break– okamžitě ukončí smyčku.continue– přeskočí zbytek aktuální iterace a začne další.
Obě se vztahují na nejvnitřnější smyčku, ve které se nacházejí.
2.13.1. break¶
Pomocí break zastavíte smyčku, jakmile je splněna nějaká podmínka. Klasický vzor „najdi a zastav“:
found = None
for item in items:
if matches(item):
found = item
break
if found is not None:
print("found:", found)
Ve smyčce while True: je break způsobem, jak smyčku ukončit:
while True:
line = next_line()
if line == "quit":
break
process(line)
2.13.2. continue¶
Pomocí continue přeskočíte zbytek těla smyčky a skočíte na další iteraci. Hodí se k filtrování položek uvnitř smyčky:
for n in numbers:
if n < 0:
continue # skip negatives
print(n)
Stejného efektu lze dosáhnout pomocí bloku if obklopujícího zbytek těla. continue je někdy přehlednější, když je podmínku pro přeskočení snazší vyjádřit předem než podmínku pro zachování.
Uvnitř smyčky hraje continue stejnou roli jako brzké return ve funkci: přeskočí případy, které neřešíte, a hlavní práci udrží na nižším odsazení a přehlednou. Smyčka typu filtruj-a-zpracuj je kanonickým tvarem:
for item in items:
if item is None:
continue
if not item.is_valid():
continue
process(item)
Odsazený řádek process(item) je vlastní prací; každá strážní podmínka výše přesně vymezuje, které položky se přeskočí.
2.13.3. else u smyčky¶
Smyčky for i while přijímají volitelný blok else. Spustí se, když smyčka proběhne bez zásahu break. Nejčastějším použitím je vyhledávací smyčka, která chce záložní řešení, pokud nic nenajde:
for item in items:
if matches(item):
print("found:", item)
break
else:
print("no match")
Pokud se break provede, blok else se přeskočí. Konstrukci čtěte jako „for X in Y: …; jinak, pokud jsme nikdy nevyskočili, proveď Z.“
2.13.4. Běžné vzory smyček¶
Několik vzorů se v reálných skriptech objevuje často:
Polling (dotazování) – čekání, až se nějaká podmínka stane pravdivou, než budeme pokračovat. Tělo používá
pass, příkaz Pythonu, který nic nedělá; každý odsazený blok musí obsahovat alespoň jeden příkaz apassje způsob, jak říct „zde nedělej nic“:while not ready(): pass proceed()
Stavový automat – jediná smyčka
while True:, která vybírá, co dělat, na základě stavové proměnné. Užitečné, když se práce čistě rozpadá do několika pojmenovaných fází:state = "header" for line in lines: if state == "header": if line.startswith("---"): state = "body" elif state == "body": print(line)
Akumulace – budování výsledku během procházení sekvence:
total = 0 for x in samples: total += x mean = total / len(samples)
Mnoho akumulačních smyček má jednořádkovou obdobu pomocí vestavěné funkce. Sáhněte po vestavěné funkci, kdykoli je to možné:
sum()– sečte každou položku v iterovatelném objektu.any()–True, pokud je alespoň jedna položka pravdivá.all()–Truepouze tehdy, když je každá položka pravdivá.sorted()– nový seznam s položkami seřazenými.len()– počet položek (pokud iterovatelný objekt zná svou délku).
>>> 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
Vestavěná verze je kratší, přehlednější a obvykle rychlejší než ručně psaná stejná smyčka.