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

    • max() / min() – najveća ili najmanja stavka.

    • any()True ako je barem jedna stavka istinita.

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