2.9 Er gaat iets mis — top-3 fouten
Leerdoel: je herkent veelvoorkomende valkuilen bij het accumulator- patroon en begrijpt waarom ze optreden.
max_tot_nu_toe = 0 als startwaarde
Geen foutmelding — wél een fout antwoord op lijsten met enkel negatieve getallen.
Oorzaak: geen enkele waarde is groter dan 0, dus de if is nooit
waar → maximum blijft 0. Maar 0 zit niet in de lijst.
Oplossing: gebruik lijst[0] als startwaarde. Dan is je startwaarde
altijd een echte waarde uit de lijst.
# FOUT
def vind_maximum_fout(lijst):
maximum = 0 # onveilig!
for waarde in lijst:
if waarde > maximum:
maximum = waarde
return maximum
print(vind_maximum_fout([-3, -1, -7])) # geeft 0 — fout!
# GOED
def vind_maximum(lijst):
maximum = lijst[0]
for waarde in lijst:
if waarde > maximum:
maximum = waarde
return maximum
Meer uitleg: Bouwsteen 3 — startwaarde.
max als variabelenaam
TypeError: 'int' object is not callable
Oorzaak: max is een ingebouwde functie in Python. Door er een
variabele van te maken, schaduw je die functie — verderop in je code
kun je hem niet meer aanroepen.
Oplossing: gebruik een duidelijke andere naam. maximum, grootste,
max_waarde, max_tot_nu_toe.
# FOUT
def slecht_idee(lijst):
max = lijst[0]
for waarde in lijst:
if waarde > max:
max = waarde
return max
print(max([1, 2, 3])) # TypeError: 'int' object is not callable
# GOED
def vind_maximum(lijst):
maximum = lijst[0]
for waarde in lijst:
if waarde > maximum:
maximum = waarde
return maximum
IndexError op lege lijst
IndexError: list index out of range
Oorzaak: op een lege lijst bestaat lijst[0] niet. Het algoritme heeft
geen betekenis op een lege input — er is geen maximum.
Oplossing: vang de lege lijst af voor je begint, of return een speciale waarde.
# FOUT
def vind_maximum(lijst):
maximum = lijst[0] # crasht hier op []
...
vind_maximum([]) # IndexError
# GOED
def vind_maximum(lijst):
if not lijst: # 'lege lijst' is falsy in Python
return None
maximum = lijst[0]
for waarde in lijst:
if waarde > maximum:
maximum = waarde
return maximum
Welke fix je kiest is een ontwerpkeuze: wil je dat je functie netjes
None returnt, of wil je dat de aanroeper duidelijk weet dat hij een lege
lijst gaf (via raise ValueError("lijst is leeg"))?
Door naar stap 10: cheatsheet.