2.12. Petlje

Petlja opetovano izvršava isti blok koda. Python ima dva oblika: while, koji se nastavlja sve dok uvjet ostaje istinit, i for, koji prolazi kroz stavke niza.

Dijagrami toka jedan uz drugi. while: ispitaj uvjet, izvrši tijelo ako je istinit, ponovi. for: uzmi sljedeću stavku iz iterabilnog objekta, izvrši tijelo, ponavljaj dok se ne iscrpi.

while neprestano ispituje uvjet; for prolazi kroz niz dok se ne iscrpi.

2.12.1. while petlje

Petlja while ispituje svoj uvjet prije svake iteracije i izvršava tijelo dok ispitivanje ne postane neistinito:

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

Izlaz:

0
1
2
3
4

Ako je uvjet istinit na početku i nikada ne postane neistinit, petlja se izvodi zauvijek. while True: je standardni idiom za glavnu petlju, iz koje se izlazi izričito pomoću break:

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

2.12.2. for petlje

Petlja for prolazi kroz stavke iterabilnog objekta – liste, n-torke, niza znakova, bajtova, rječnika ili bilo čega drugog što podržava iteraciju:

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

Izlaz:

apple
banana
cherry

Isti oblik radi i na nizu znakova, gdje je svaka stavka jednoznakovni niz:

for letter in "OpenMV":
    print(letter)

Izlaz:

O
p
e
n
M
V

Iteriranje rječnika izravno daje njegove ključeve, redoslijedom umetanja:

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

Izlaz:

a
b

Svaki prolaz veže varijablu petlje (fruit, letter, key) na sljedeću stavku. Nakon završetka petlje, varijabla zadržava vrijednost iz posljednje iteracije.

2.12.3. range

Za petlje preko numeričkog raspona koristite range():

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

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

  • range(start, stop, step) – s prilagođenim korakom (negativne vrijednosti broje unatrag).

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() proizvodi vrijednosti lijeno – ne gradi listu u memoriji. Da biste dobili stvarnu list, omotajte ga: list(range(10)).

2.12.4. enumerate

Kada petlja treba i indeks i stavku, enumerate() daje parove (index, item):

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

Pokrenite indeks od nečega drugog osim nule prosljeđivanjem drugog argumenta: enumerate(items, start=1).

2.12.5. zip

Da biste prolazili kroz dva (ili više) iterabilna objekta usklađeno, koristite zip(). Daje jednu n-torku po poziciji i zaustavlja se na najkraćem ulazu:

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

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

Izlaz:

alice 88
bob 92
carol 70

2.12.6. Ugrađeno pridruživanje s :=

Walrus operator := je pridruživanje koje je ujedno i izraz. Veže ime i istovremeno se evaluira na istu vrijednost. U while petlji ovo sažima uobičajeni obrazac „pročitaj, provjeri, tijelo” u jedan redak:

# 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)

Oba oblika rade istu stvar. Posegnite za := kada dupliciranje pridruživanja zaista narušava čitljivost; nemojte ga koristiti samo da biste bili domišljati. Zagrade su potrebne u većini položaja kako bi izraz ostao nedvosmislen.