2.13. Upravljanje petljom¶
Dvije ključne riječi mijenjaju način na koji se petlja izvodi:
break– odmah izlazi iz petlje.continue– preskače ostatak trenutne iteracije i započinje sljedeću.
Obje se odnose na najdublju petlju unutar koje se pojavljuju.
2.13.1. break¶
Koristite break da zaustavite petlju čim je uvjet ispunjen. Klasičan obrazac „pretraži i zaustavi”:
found = None
for item in items:
if matches(item):
found = item
break
if found is not None:
print("found:", found)
U petlji while True:, break je način na koji petlja završava:
while True:
line = next_line()
if line == "quit":
break
process(line)
2.13.2. continue¶
Koristite continue da preskočite ostatak tijela i skočite na sljedeću iteraciju. Korisno za filtriranje stavki unutar petlje:
for n in numbers:
if n < 0:
continue # skip negatives
print(n)
Isti učinak može se napisati kao if blok oko ostatka tijela. continue je ponekad jasniji kada je uvjet preskakanja lakše unaprijed izreći nego uvjet zadržavanja.
Unutar petlje, continue ima istu ulogu kao rani return u funkciji: preskočite slučajeve koje ne obrađujete i zadržite glavni posao ravnim na vanjskoj uvlaci. Petlja filtriraj-i-obradi kanonski je oblik:
for item in items:
if item is None:
continue
if not item.is_valid():
continue
process(item)
Uvučeni redak process(item) je stvarni posao; svaka zaštita iznad njega točno navodi koje se stavke preskaču.
2.13.3. else na petlji¶
I for i while prihvaćaju neobavezan else blok. On se izvršava kada petlja završi bez nailaska na break. Najčešća upotreba je petlja pretraživanja koja želi rezervno rješenje ako ništa nije pronađeno:
for item in items:
if matches(item):
print("found:", item)
break
else:
print("no match")
Ako se aktivira break, else blok se preskače. Pročitajte konstrukciju kao „for X in Y: …; ili, ako nikada nismo izašli, učini Z.”
2.13.4. Uobičajeni obrasci petlji¶
Nekoliko obrazaca često se pojavljuje u stvarnim skriptama:
Ispitivanje (polling) – čekanje da neki uvjet postane istinit prije nastavka. Tijelo koristi
pass, Pythonovu naredbu koja ne radi ništa; svaki uvučeni blok mora sadržavati barem jednu naredbu, apassje način da se kaže „ne radi ništa ovdje”:while not ready(): pass proceed()
Stroj stanja – jedna
while True:petlja koja bira što učiniti na temelju varijable stanja. Korisno kada se posao jasno dijeli na nekoliko imenovanih faza:state = "header" for line in lines: if state == "header": if line.startswith("---"): state = "body" elif state == "body": print(line)
Akumuliranje – izgradnja rezultata tijekom prolaska kroz niz:
total = 0 for x in samples: total += x mean = total / len(samples)
Mnoge akumulacijske petlje imaju jednolinijski ekvivalent pomoću ugrađene funkcije. Posegnite za ugrađenom funkcijom kada je primjenjiva:
sum()– zbraja svaku stavku u iterabilnom objektu.any()–Trueako je barem jedna stavka istinita.all()–Truesamo kada je svaka stavka istinita.sorted()– nova lista sa stavkama poredanim po redu.len()– broj stavki (kada iterabilni objekt poznaje svoju duljinu).
>>> 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
Ugrađena verzija je kraća, jasnija i obično brža od ručnog pisanja iste petlje.