Ga naar hoofdinhoud

16d Proberen tot het lukt

info

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 bij break en stopt de loop.
  • Lukt het niet, dan springt Python naar except. break gebeurt 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}.")
Voorspel
Wat zet dit programma op het scherm?
Kies wat jij denkt. Bij het goede antwoord zie je de uitleg.

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)