7 While-loop
Met een for-loop weet je van tevoren hoe vaak je herhaalt, bijvoorbeeld 5 keer met range(5). Soms weet je dat niet, alleen wanneer je klaar bent. Dan gebruik je een while-loop: die herhaalt zolang een voorwaarde True is.
Een simpele while-loop
getal = 5
while getal > 0:
print(getal)
getal -= 1
print("Start!")
Uitvoer:
5
4
3
2
1
Start!
getal -= 1 is een korte schrijfwijze voor getal = getal - 1. Hetzelfde geldt voor +=, *= en /=.
Drie ingrediënten die je altijd nodig hebt:
- Een variabele met een startwaarde (
getal = 5). - Een voorwaarde achter
while(getal > 0). - Een update-stap binnen de loop (
getal -= 1).
Vergeet je die update? Dan blijft getal voor altijd 5, blijft getal > 0 voor altijd True, en stopt de loop nooit. Dat heet een oneindige loop. De speeltuin heeft geen stopknop, dus het tabblad loopt vast: herlaad de pagina, en je code is weg. Twijfel je of een loop stopt, druk dan eerst op Stap voor stap. Die neemt hoogstens 1000 stappen op, en dan zie je in de opname waar je loop blijft rondgaan.
getal = 1
while getal < 50:
getal = getal * 3
print(getal)
Er gaat iets mis
De update vergeten
getal = 5
while getal > 0:
print(getal)
getal - 1
getal - 1 rekent wel iets uit, maar bewaart het nergens. getal blijft 5 en de loop stopt nooit: het tabblad loopt vast. Schrijf getal -= 1, of getal = getal - 1.
De voorwaarde andersom
getal = 5
while getal < 0:
print(getal)
getal -= 1
print("Start!")
Uitvoer:
Start!
Er komt geen enkel getal op het scherm. 5 is niet kleiner dan 0, dus de voorwaarde is meteen False en de loop draait geen ronde. Lees je voorwaarde hardop: "zolang getal groter is dan 0".
Speel dit eerst na zonder computer, met een tracetabel op papier: Jij bent de loop. Je docent kan de hand-out printen.
Opdracht 7.1: Aftellen
Schrijf een while-loop die aftelt van 3 naar 1 en daarna "Klaar!" print.
# Schrijf hier je code
Klik hier voor een tip.
Voorwaarde: getal > 0. Binnen de loop: eerst printen, dan getal -= 1.
Klik hier voor de oplossing.
getal = 3
while getal > 0:
print(getal)
getal -= 1
print("Klaar!")
getal = 3
while getal > 0:
print(getal)
getal -= 1
print("Klaar!")Opdracht 7.2: Raket-aftellen
Tel af van 10 naar 1 en print daarna "Lift-off!".
Verwachte uitvoer:
10
9
8
...
2
1
Lift-off!
# Schrijf hier je code
Klik hier voor een tip.
Zelfde patroon als 7.1, alleen met startwaarde 10.
Klik hier voor de oplossing.
teller = 10
while teller > 0:
print(teller)
teller -= 1
print("Lift-off!")
teller = 10
while teller > 0:
print(teller)
teller -= 1
print("Lift-off!")Opdracht 7.3: Sparen tot je doelbedrag
Je hebt een startsaldo van 50 euro en spaart elke maand 15 euro bij. Tel met een while-loop hoeveel maanden je nodig hebt om minstens 200 euro te hebben.
Verwachte uitvoer:
Binnen 10 maanden heb je je doelbedrag bereikt!
# Schrijf hier je code
Klik hier voor een tip.
Voorwaarde: saldo < 200. Binnen de loop: saldo += 15 en maanden += 1.
Klik hier voor de oplossing.
saldo = 50
maanden = 0
while saldo < 200:
saldo += 15
maanden += 1
print(f"Binnen {maanden} maanden heb je je doelbedrag bereikt!")
saldo = 50
maanden = 0
while saldo < 200:
saldo += 15
maanden += 1
print(f"Binnen {maanden} maanden heb je je doelbedrag bereikt!")Opdracht 7.4: Virus dat verdubbelt
Een virus begint met 1 geïnfecteerd bestand en verdubbelt elke seconde. Print elke seconde het huidige aantal, totdat het boven 1 000 000 uitkomt. Print daarna na hoeveel seconden het systeem gekaapt is.
Verwachte uitvoer (de laatste regels):
262144
524288
Na 20 seconden is het systeem gekaapt.
# Schrijf hier je code
Klik hier voor een tip.
Drie stappen binnen de loop:
- Print
infecties. - Verdubbel:
infecties *= 2. - Hoog
secondesmet 1 op.
Voorwaarde: infecties <= 1_000_000. Python negeert de liggende streepjes in een getal: 1_000_000 is hetzelfde als 1000000, maar leest makkelijker.
Klik hier voor de oplossing.
infecties = 1
secondes = 0
while infecties <= 1_000_000:
print(infecties)
infecties *= 2
secondes += 1
print(f"Na {secondes} seconden is het systeem gekaapt.")
In de volgende les ga je code een naam geven zodat je hem makkelijk kunt hergebruiken — dat doe je met functies.
infecties = 1
secondes = 0
while infecties <= 1_000_000:
print(infecties)
infecties *= 2
secondes += 1
print(f"Na {secondes} seconden is het systeem gekaapt.")De while-loop is het hart van binair zoeken: je weet vooraf niet hoeveel stappen je nodig hebt, alleen wanneer je klaar bent. PageRank herhaalt op dezelfde manier "tot het niet meer verandert".