2.13. Loopkontroll¶
Två nyckelord ändrar hur en loop körs:
break– avsluta loopen omedelbart.continue– hoppa över resten av den aktuella iterationen och börja på nästa.
Båda gäller den innersta loop de förekommer inuti.
2.13.1. break¶
Använd break för att stoppa en loop så snart ett villkor är uppfyllt. Det klassiska mönstret ”sök och stoppa”:
found = None
for item in items:
if matches(item):
found = item
break
if found is not None:
print("found:", found)
I en while True:-loop är break sättet loopen avslutas på:
while True:
line = next_line()
if line == "quit":
break
process(line)
2.13.2. continue¶
Använd continue för att hoppa över resten av kroppen och gå vidare till nästa iteration. Praktiskt för att filtrera bort objekt inuti en loop:
for n in numbers:
if n < 0:
continue # skip negatives
print(n)
Samma effekt kan skrivas som ett if-block runt resten av kroppen. continue är ibland tydligare när villkoret för att hoppa över är lättare att uttrycka i förväg än villkoret för att behålla.
Inuti en loop spelar continue samma roll som ett tidigt return i en funktion: hoppa förbi de fall du inte hanterar och håll huvudarbetet plant på den yttre indenteringen. Filtrera-och-bearbeta-loopen är den kanoniska formen:
for item in items:
if item is None:
continue
if not item.is_valid():
continue
process(item)
Den indenterade raden process(item) är det faktiska arbetet; varje vakt ovanför anger exakt vilka objekt som hoppas över.
2.13.3. else på en loop¶
Både for och while accepterar ett valfritt else-block. Det körs när loopen slutförs utan att träffa på ett break. Den vanligaste användningen är en sökloop som vill ha en reservlösning om inget hittades:
for item in items:
if matches(item):
print("found:", item)
break
else:
print("no match")
Om ett break utlöses hoppas else-blocket över. Läs konstruktionen som ”for X in Y: …; eller annars, om vi aldrig bröt oss ut, gör Z.”
2.13.4. Vanliga loopmönster¶
Några mönster dyker upp ofta i verkliga skript:
Pollning – vänta tills något villkor blir sant innan du går vidare. Kroppen använder
pass, Pythons no-op-sats; varje indenterat block måste innehålla minst en sats, ochpassär sättet att säga ”gör ingenting här”:while not ready(): pass proceed()
Tillståndsmaskin – en enda
while True:-loop som väljer vad som ska göras baserat på en tillståndsvariabel. Användbart när arbetet delas rent upp i några namngivna faser:state = "header" for line in lines: if state == "header": if line.startswith("---"): state = "body" elif state == "body": print(line)
Ackumulering – bygg upp ett resultat medan du går igenom en sekvens:
total = 0 for x in samples: total += x mean = total / len(samples)
Många ackumuleringsloopar har en enradsekvivalent med en inbyggd funktion. Använd den inbyggda funktionen när någon passar:
sum()– adderar varje objekt i en itererbar.any()–Trueom minst ett objekt är sant.all()–Trueendast när varje objekt är sant.sorted()– en ny lista med objekten i ordning.len()– antalet objekt (där den itererbara känner till sin längd).
>>> 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
Den inbyggda versionen är kortare, tydligare och vanligtvis snabbare än att skriva samma loop för hand.