16d Proberen tot het lukt
Deze les gebruikt break, uit Stoppen met break.
Vraag je iemand om een getal, dan wil je het meestal opnieuw vragen als het
misgaat, in plaats van op te geven. Dat doe je met try in een loop:
while True:
tekst = input("Hoe oud ben je? ")
try:
leeftijd = int(tekst)
break
except ValueError:
print("Dat is geen getal, probeer het nog eens.")
print(f"Volgend jaar ben je {leeftijd + 1}.")
Uitvoer bij tien en dan 10:
Hoe oud ben je? tien
Dat is geen getal, probeer het nog eens.
Hoe oud ben je? 10
Volgend jaar ben je 11.
while True:blijft eindeloos herhalen.- Lukt
int(tekst), dan komt Python bijbreaken stopt de loop. - Lukt het niet, dan springt Python naar
except.breakgebeurt dan niet, en de loop vraagt opnieuw.
Zonder input() zie je hetzelfde met een lijst pogingen, alsof iemand drie
keer iets typt:
pogingen = ["tien", "10", "twaalf"]
for tekst in pogingen:
try:
leeftijd = int(tekst)
break
except ValueError:
print(f"'{tekst}' is geen getal.")
print(f"Volgend jaar ben je {leeftijd + 1}.")
Er gaat iets mis
break vergeten
while True:
tekst = input("Hoe oud ben je? ")
try:
leeftijd = int(tekst)
except ValueError:
print("Dat is geen getal, probeer het nog eens.")
Ook als je een goed getal typt, vraagt het programma opnieuw. Zonder break stopt een while True-loop nooit. Zet break direct onder de regel die moet lukken.
Geen enkele poging lukt
pogingen = ["tien", ""]
for tekst in pogingen:
try:
leeftijd = int(tekst)
break
except ValueError:
print(f"'{tekst}' is geen getal.")
print(f"Volgend jaar ben je {leeftijd + 1}.")
Uitvoer:
'tien' is geen getal.
'' is geen getal.
NameError: name 'leeftijd' is not defined
Een for-loop houdt op als de lijst op is, ook als er nooit iets lukte. Dan heeft leeftijd nooit een waarde gekregen. Met while True heb je dat probleem niet: die vraagt door tot het lukt.
Een leeg except-blok
for tekst in ["3", "vier"]:
try:
print(int(tekst))
except ValueError:
print("Klaar")
Uitvoer:
IndentationError: expected an indented block after 'except' statement on line 4
Onder except moet minstens één ingesprongen regel staan. In een loop kun je daar continue zetten: ga door met de volgende.
Opdracht 16d.1: Alleen de getallen
Tel alle teksten uit de lijst op die een getal zijn. Sla de rest over.
Verwachte uitvoer:
Samen: 10
teksten = ["3", "vier", "5", "", "2"]
som = 0
for tekst in teksten:
som += int(tekst)
print(f"Samen: {som}")Klik hier voor een tip.
Zet som += int(tekst) in een try. In het except-blok hoeft niets te
gebeuren; zet er continue neer, zoals in Er gaat iets mis.
Klik hier voor de oplossing.
teksten = ["3", "vier", "5", "", "2"]
som = 0
for tekst in teksten:
try:
som += int(tekst)
except ValueError:
continue
print(f"Samen: {som}")
Uitvoer:
Samen: 10
Opdracht 16d.2: Een gemiddeld cijfer
Bereken het gemiddelde van de cijfers die float() kan lezen. Tel ook hoeveel
er zijn overgeslagen.
Verwachte uitvoer:
Gemiddelde: 7.75 (2 overgeslagen)
cijfers = ["7.5", "8", "zes", "6,5"] goed = [] fout = 0 # Schrijf hier je loop print(goed, fout)
Klik hier voor een tip.
Lukt float(cijfer), dan gaat het getal in goed met append. Lukt het
niet, dan tel je fout += 1. Het gemiddelde is daarna
sum(goed) / len(goed), met :.2f voor twee cijfers achter de punt.
Klik hier voor de oplossing.
cijfers = ["7.5", "8", "zes", "6,5"]
goed = []
fout = 0
for cijfer in cijfers:
try:
goed.append(float(cijfer))
except ValueError:
fout += 1
print(f"Gemiddelde: {sum(goed) / len(goed):.2f} ({fout} overgeslagen)")
Uitvoer:
Gemiddelde: 7.75 (2 overgeslagen)