Werk herhalen met lussen · oefening
Herhaal zolang een voorwaarde geldt
Een for-lus bezoekt de waarden die een verzameling levert, één voor één. Bij de vaste lijsten en ranges die je tot nu toe hebt gebruikt, kun je die waarden vooraf tellen.
Bij andere taken is het natuurlijker om te beschrijven wanneer het werk moet doorgaan. Blijf sparen zolang het saldo onder een doel ligt. Blijf vragen zolang een antwoord onbruikbaar is. Je hoeft het aantal rondes niet eerst uit te rekenen.
Daarvoor is een while-lus bedoeld.
De vorm van een while-lus
Lees het weer als een Engelse zin: ‘while count is greater than zero, do this’, dus ‘zolang count groter is dan nul, doe dit’.
Python controleert eerst de voorwaarde. Als die True is, voert het het blok uit en keert het terug om opnieuw te controleren. Als die False is, slaat het het blok over en gaat het onder de lus verder. De voorwaarde wordt vóór elke ronde getest, ook de eerste.
De voorwaarde is een gewone vergelijking, net als bij een if-instructie. Het verschil is dat if één keer vraagt en while blijft vragen.
Drie onderdelen die op elkaar moeten aansluiten
Bij een lus die door een veranderend getal wordt gestuurd, moeten deze drie onderdelen samenwerken. Je ziet ze duidelijk in het aftellen:
count = 3 # 1. set up the variable the condition depends on
while count > 0: # 2. test it before every pass
print(count)
count = count - 1 # 3. change it inside the body
Laat het eerste onderdeel weg en Python geeft een NameError. Laat het derde weg en de voorwaarde wordt nooit False. Dat is belangrijk genoeg om er de volgende les aan te besteden.
Volg count zelf tijdens het aftellen: 3, dan 2, dan 1, dan 0. Python keert na elke ronde terug naar de while-regel. Als count de waarde 0 bereikt, is de voorwaarde False en is de lus klaar. De oefening aan het einde van deze les leent zich goed voor Step, zodat je die terugkeer kunt zien.
Nul rondes is een geldig resultaat
Omdat de test eerst komt, kan een while-lus zijn blok ook nul keer uitvoeren:
De voorwaarde was al False, dus Python sloeg het blok meteen over. Dat is vaak wat je wilt. Onthoud het wanneer een lus zonder duidelijke reden geen uitvoer oplevert.
Kiezen tussen for en while
Je kunt op beide manieren een afteller schrijven:
Beide zijn hier correct, dus kies de vorm die zegt wat je bedoelt:
| Gebruik | Wanneer |
|---|---|
for | Je doorloopt een verzameling of herhaalt een bekend aantal keren |
while | Een voorwaarde moet bepalen of nog een ronde nodig is |
De spaarvraag is een goed voorbeeld van de tweede soort. Je kunt het aantal weken zelf uitrekenen, maar de lus kan het bijhouden terwijl ze de bedragen toevoegt:
Let erop dat balance eindigt op 120, niet op 100. De lus maakte de hele ronde af die het saldo voorbij het doel bracht en stelde pas daarna vast dat de voorwaarde False was. Het saldo veranderen onderbreekt het blok niet: de voorwaarde wordt opnieuw gecontroleerd wanneer Python terugkeert naar de while-regel.
Wat drukt deze code af?
number = 1
while number < 20:
print(number)
number = number * 3Wanneer controleert Python een while-voorwaarde?
Schrijf nu een while-lus die bijhoudt hoeveel stortingen nodig zijn om een doel te bereiken.
Opdracht
Je spaart elke week 25 voor een doel van 150. Schrijf een while-lus die blijft storten totdat het saldo het doel bereikt en daarna meldt hoe lang dat duurde.
Maak het programma af, zodat het bij elke ronde:
depositbijbalanceoptelt;1bijweeksoptelt;een voortgangsregel afdrukt in de vorm
Week 1: 25.
De lus moet blijven draaien zolang balance kleiner is dan goal. Behoud de laatste overzichtsregel, die één keer na de lus wordt uitgevoerd.
Verwachte uitvoer:
Week 1: 25
Week 2: 50
Week 3: 75
Week 4: 100
Week 5: 125
Week 6: 150
Reached 150 after 6 weeks.
Verander deposit in 40 en voer het opnieuw uit. De lus moet nog steeds stoppen zodra het doel is bereikt, ook als het saldo eroverheen gaat. Zet de waarde vóór het insturen terug op 25.
Kijk hoe de voorwaarde wordt getest
Klik op Step in de werkbalk van de editor zodra je lus werkt en loop er met Next doorheen.
Kijk hoe de markering onderaan het blok komt en telkens terugspringt naar de while-regel. Daar wordt de voorwaarde opnieuw getest. Houd balance in het variabelenpaneel in de gaten terwijl die 150 nadert en zie dat het gewijzigde saldo wordt gecontroleerd wanneer Python terugkeert naar de while-regel.