Er zijn drie statements die je controle geven over de wijze waarop een
loop uitgevoerd wordt. Dit zijn else
, break
, en continue
. Ze
werken met zowel while
als for
loops.
else
Net als bij een if
statement, kun je aan het einde van een loop een
else
statement toevoegen. Het blok code bij de else
wordt uitgevoerd
wanneer de loop eindigt, dus wanneer de boolean expressie voor de
while
loop False
is, of bij de for
loop wanneer het laatste item
verwerkt is.
Hier is een voorbeeld van else
bij de while
loop:
i = 0
while i < 5:
print( i )
i += 1
else:
print( "De loop eindigt, i is nu", i )
print( "Klaar" )
Deze code is equivalent aan het stroomdiagram in afbeelding
8.31.
Het stroomdiagram geeft je wellicht het idee dat het niet zinvol is een
else
te gebruiken, maar het kan heel nuttig zijn in combinatie met een
break
(die ik hierna bespreek).
Hier is een voorbeeld van else
bij de for
loop:
for fruit in ( "appel", "mango", "aardbei" ):
print( fruit )
else:
print( "De loop eindigt, fruit is nu", fruit )
print( "Klaar" )
Merk op dat nadat de while
loop hierboven geëindigd is, de waarde van
i
5 is. De waarde van fruit
na de for
loop hierboven is het
laatste item verwerkt is, dus "aardbei"
.
break
Het break
statement maakt het mogelijk een loop voortijdig af te
breken. Als Python een break
tegenkomt, stopt het met het verwerken
van de loop, en keert niet terug bij de eerste regel van de loop. In
plaats daarvan gaat de verwerking verder met de eerste regel code na de
loop.
Om te zien wat het nut daarvan is, volgt hier een interessante oefening. Ik zoek een getal dat start met een 1, en als je die 1 verplaatst naar het einde van het getal, dan is het resultaat een getal dat drie keer zo groot is als het originele getal. Bijvoorbeeld, als ik het getal 1867 neem, en ik verplaats de 1 van de start naar het einde, dan krijg ik 8671. Als 8671 drie keer 1867 zou zijn, dan is dat het antwoord dat ik zoek. Maar dat is niet zo, dus 1867 is niet correct. De code om dit op te lossen is vrij kort, en geeft het laagste getal dat het probleem oplost:
i = 1
while i <= 1000000:
num1 = int( "1" + str( i ) )
num2 = int( str( i ) + "1" )
if num2 == 3 * num1:
print( num2, "is drie keer", num1 )
break
i += 1
else:
print( "Geen antwoord gevonden" )
Deze code is weergegeven in het stroomdiagram in afbeelding 8.42.
In dit voorbeeld zie je een goed gebruik van break
. Omdat ik geen idee
heb van hoe groot het nummer is dat ik zoek, controleer ik er gewoon een
heleboel. Ik laat i
oplopen tot 1000000. Ik weet natuurlijk niet of ik
het antwoord vind voordat i
1000000 heeft bereikt, maar ik moet ergens
een grens stellen, want misschien bestaat er wel helemaal geen getal dat
aan de eis voldoet, en ik wil geen eindeloze loop bouwen. Maar gedurende
het testen van getallen kan ik een onverwacht een antwoord vinden, en
als dat gebeurt, dan “break” ik uit de loop, want het heeft dan geen zin
meer om nog meer getallen te testen.
Het punt is dat ik een maximum van 1000000 heb gekozen niet omdat ik
weet dat ik een miljoen getallen moet doorzoeken. Ik heb geen idee hoe
vaak ik door de loop moet. Ik weet alleen dat als ik een antwoord vind,
ik klaar ben en de loop verder kan afbreken. Dat is precies de bedoeling
van de break
.
Als ik een beetje mijn best doe kan ik er best voor zorgen dat de
boolean expressie de vergelijking voor me doet, via iets als
while i < 1000000 and num1 != 3 * num2
. Dit wordt wat ingewikkeld,
en ik moet ook num1
en num2
waardes geven voordat de loop start. Het
is in principe altijd mogelijk om het gebruik van break
te vermijden.
Maar een break
kan code beter leesbaar maken, zoals het doet in dit
geval.
Een break
kan niet gebruikt worden buiten een loop. break
s zijn
alleen gedefinieerd voor loops. (Ik zie vaak studenten proberen break
statements te gebruiken in condities die niet in een loop zitten, en dan
vreemd opkijken als ze een runtime error krijgen.)
Let op: als een break
wordt uitgevoerd bij een loop die ook een else
heeft, dan wordt de code bij de else
niet uitgevoerd. Ik maak
daarvan goed gebruik bij de code hierboven: de tekst die aangeeft dat
geen antwoord gevonden is, wordt alleen afgedrukt als er niet met een
break
uit de loop wordt gesprongen.
De volgende code controleert een cijferlijst van een student. Als alle
cijfers 5.5 of hoger zijn, dan is de student geslaagd. Maar als er één
of meer cijfers lager dan 5.5 zijn, dan is de student gezakt. De
cijferlijst wordt verwerkt door een for
loop.
for cijfer in ( 8, 7.5, 9, 6, 6, 6, 5.5, 7, 5, 8, 7, 7.5 ):
if cijfer < 5.5:
print( "De student zakt!" )
break
else:
print( "De student slaagt!" )
Voer de code hierboven uit en zie dat de student zakt. Verwijder dan de 5 van de cijferlijst en zie dat de student nu slaagt. Bestudeer de code totdat je hem snapt.
continue
Als het statement continue
in een blok code bij een loop wordt
aangetroffen, wordt onmiddellijk het uitvoeren van de huidige cyclus in
de loop beëindigd, en wordt teruggekeerd naar de eerste regel van de
loop. Voor een while
loop betekent dat dat de boolean expressie
opnieuw geëvalueerd wordt, en voor een for
loop betekent het dat het
volgende item van de collectie genomen en verwerkt wordt.
De volgende code drukt alle getallen tussen 1 en 100 af die niet door 2 of 3 gedeeld kunnen worden, en die niet eindigen op een 7 of 9.
num = 0
while num < 100:
num += 1
if num%2 == 0:
continue
if num%3 == 0:
continue
if num%10 == 7:
continue
if num%10 == 9:
continue
print( num )
Deze code is ook weergegeven in het stroomdiagram in afbeelding 8.63.
Ik weet niet wat het nut van deze lijst is, maar in ieder geval helpt
continue
om de code te schrijven. In plaats van continue
te
gebruiken was het ook mogelijk geweest een grote boolean expressie te
schrijven die bepaalt of een getal afgedrukt moet worden, maar dat zou
snel onleesbaar worden. Maar, net zoals geldt voor break
statements,
continue
statements kunnen altijd vermeden worden als je dat echt
wilt. Ze helpen echter om code begrijpbaar te houden.
Net als break
statements, kun je continue
statements alleen
gebruiken in loops.
Wees heel, heel voorzichtig met het gebruik van continue
in een
while
loop. De meeste while
loops gebruiken een getal dat het aantal
cycli door de loop inperkt. Gewoonlijk wordt een dergelijk getal
verhoogd als laatste regel van het blok code bij de loop. Een continue
statement dat wordt uitgevoerd voordat die laatste regel bereikt is,
keert terug bij de boolean expressie zonder dan het getal verhoogd is.
Dat kan makkelijk leiden tot een eindeloze loop. Bijvoorbeeld:
i = 0
while i < 10:
if i == 5:
continue
i += 1
is een eindeloze loop!
Schrijf een programma dat een reeks getallen doorloopt via een for
loop. Als er een nul wordt aangetroffen in de lijst getallen, dan moet
het programma onmiddellijk eindigen, en alleen het woord “Klaar”
afdrukken (gebruik een break
om dit te implementeren). Negatieve
getallen moeten overgeslagen worden (gebruik een continue
om dit te
implementeren; ik weet dat het ook kan met een conditie, maar ik wil dat
je oefent met continue
). Als er geen nul in de reeks getallen staat,
moet het programma de som van alle positieve getallen afdrukken (doe dit
met een else
). Druk altijd “Klaar” af als het programma eindigt. Test
het programma met de reeks ( 12, 4, 3, 33, -2, -5, 7, 0, 22, 4 )
. Met
deze getallen moet het programma alleen “Klaar” afdrukken. Als je de nul
verwijdert, moet het programma 85 afdrukken (en “Klaar”).