2.12. Smyčky

Smyčka opakovaně provádí stejný blok kódu. Python má dvě formy: while, která pokračuje, dokud zůstává podmínka pravdivá, a for, která prochází položky sekvence.

Vývojové diagramy vedle sebe. while: otestuj podmínku, spusť tělo, pokud je pravdivá, opakuj. for: vezmi další položku z iterovatelného objektu, spusť tělo, opakuj, dokud se nevyčerpá.

while opakovaně testuje podmínku; for prochází sekvenci, dokud se nevyčerpá.

2.12.1. smyčky while

Smyčka while testuje svou podmínku před každou iterací a provádí tělo, dokud se test nestane nepravdivým:

count = 0
while count < 5:
    print(count)
    count += 1

Výstup:

0
1
2
3
4

Pokud je podmínka na začátku pravdivá a nikdy se nestane nepravdivou, smyčka běží donekonečna. while True: je standardní idiom pro hlavní smyčku, z níž se vyskakuje výslovně pomocí break:

while True:
    step()
    if done():
        break

2.12.2. smyčky for

Smyčka for prochází položky iterovatelného objektu – seznamu, n-tice, řetězce, bytů, slovníku nebo čehokoli jiného, co podporuje iteraci:

for fruit in ["apple", "banana", "cherry"]:
    print(fruit)

Výstup:

apple
banana
cherry

Stejný tvar funguje i na řetězci, kde každou položkou je jednoznakový řetězec:

for letter in "OpenMV":
    print(letter)

Výstup:

O
p
e
n
M
V

Iterace slovníku přímo poskytuje jeho klíče v pořadí vkládání:

for key in {"a": 1, "b": 2}:
    print(key)

Výstup:

a
b

Každý průchod naváže řídicí proměnnou smyčky (fruit, letter, key) na další položku. Po skončení smyčky si proměnná uchová hodnotu z poslední iterace.

2.12.3. range

Pro smyčky přes číselný rozsah použijte range():

  • range(stop) – 0, 1, …, stop - 1.

  • range(start, stop) – start, start + 1, …, stop - 1.

  • range(start, stop, step) – s vlastním krokem (záporné hodnoty počítají dolů).

for i in range(5):           # 0, 1, 2, 3, 4
    print(i)

for i in range(2, 8, 2):     # 2, 4, 6
    print(i)

for i in range(10, 0, -1):   # 10, 9, ..., 1
    print(i)

range() produkuje hodnoty líně – nevytváří seznam v paměti. Chcete-li získat skutečný list, obalte jej: list(range(10)).

2.12.4. enumerate

Když smyčka potřebuje jak index, tak položku, enumerate() poskytuje dvojice (index, item):

for i, name in enumerate(["a", "b", "c"]):
    print(i, name)
# 0 a
# 1 b
# 2 c

Index můžete začít na jiné hodnotě než nule předáním druhého argumentu: enumerate(items, start=1).

2.12.5. zip

K souběžnému procházení dvou (nebo více) iterovatelných objektů použijte zip(). Poskytne jednu n-tici na každou pozici a zastaví se u nejkratšího vstupu:

names  = ["alice", "bob", "carol"]
scores = [88, 92, 70]

for name, score in zip(names, scores):
    print(name, score)

Výstup:

alice 88
bob 92
carol 70

2.12.6. Vložené přiřazení pomocí :=

Operátor mrože := je přiřazení, které je zároveň výrazem. Naváže název a současně se vyhodnotí na stejnou hodnotu. Ve smyčce while to sbalí běžný vzor „načti, zkontroluj, tělo“ do jediného řádku:

# without walrus
value = next_value()
while value is not None:
    process(value)
    value = next_value()

# with walrus
while (value := next_value()) is not None:
    process(value)

Obě formy dělají totéž. Sáhněte po :=, když duplikace přiřazení skutečně škodí čitelnosti; nesahejte po něm jen z chytrosti. Závorky jsou ve většině pozic nutné, aby výraz zůstal jednoznačný.