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 a pass je 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.

    • max() / min() – největší nebo nejmenší položka.

    • any()True, pokud je alespoň jedna položka pravdivá.

    • all()True pouze 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.