Verbetersleutel – Oefeningen functies¶
Deze bundel bestaat uit drie soorten oefeningen:
- Deel A – Voorspel de uitvoer. Voorspel wat het programma toont vóór je de cel uitvoert. Schrijf je voorspelling op, voer daarna de cel uit en vergelijk. Geeft de code een foutmelding? Schrijf dan gewoon "fout" (welk soort fout hoef je niet te vermelden).
- Deel B – Zoek de fout! Er staat precies één fout in de code. Verbeter ze zodat de gewenste uitvoer verschijnt.
- Deel C – Vul de code aan. Vul aan op de plaatsen met
...of schrijf zelf de code. Vergeet de docstrings niet. Controleer met de gewenste uitvoer.
Staat er dat de gebruiker iets typt? Typ dan precies dat wanneer de cel om invoer vraagt.
De oefeningen 15, 25 en 33 zijn bonusvragen (uitbreiding): ze gaan over klassen en methodes.
Bij elke oefening vind je de juiste uitvoer of oplossing en een uitleg stap voor stap. Bij deel C zijn soms meerdere oplossingen goed; de uitleg vermeldt de belangrijkste alternatieven.
Deel A: Voorspel de uitvoer¶
Oefening 1¶
Voorspel de uitvoer. Verwacht je een foutmelding? Schrijf dan gewoon "fout".
def verdrievoudigen(x):
"""Verdrievoudigen."""
return 3 * x
print(verdrievoudigen(4), verdrievoudigen("ab"), verdrievoudigen(1.5))
12 ababab 4.5
Uitvoer:
12 ababab 4.5
Uitleg:
De functie geeft telkens 3 * x terug. Wat * doet, hangt af van het type van het argument:
| oproep | x |
type | 3 * x |
resultaat |
|---|---|---|---|---|
verdrievoudigen(4) |
4 | int | 3 · 4 | 12 |
verdrievoudigen("ab") |
"ab" | str | tekst 3 keer herhalen | ababab |
verdrievoudigen(1.5) |
1.5 | float | 3 · 1,5 | 4.5 |
- Eén en dezelfde functie werkt dus voor verschillende types.
printmet komma's zet een spatie tussen de drie waarden.
Oefening 2¶
Voorspel de uitvoer. Verwacht je een foutmelding? Schrijf dan gewoon "fout".
def kwadraat(x):
"""Kwadraat van x."""
print(x ** 2)
resultaat = kwadraat(5)
print(resultaat)
25 None
Uitvoer:
25
None
Uitleg:
| stap | wat gebeurt er? | uitvoer |
|---|---|---|
| 1 | kwadraat(5) wordt opgeroepen: x = 5 |
– |
| 2 | in de functie: print(x ** 2) |
25 |
| 3 | de functie heeft geen return → ze geeft None terug |
– |
| 4 | resultaat = None |
– |
| 5 | print(resultaat) |
None |
- ⚠️
printenreturnzijn niet hetzelfde:printtoont iets op het scherm, maar het resultaat is daarna "weg".returngeeft een waarde terug aan wie de functie oproept, zodat je ermee verder kan rekenen of ze kan opslaan.
- Een functie zonder
returngeeft automatischNone("niets") terug.
Oefening 3¶
Voorspel de uitvoer. Verwacht je een foutmelding? Schrijf dan gewoon "fout".
def verschil(a, b):
"""Verschil van a en b."""
return a - b
x = 10
y = 4
print(verschil(y, x), verschil(x, y))
-6 6
Uitvoer:
-6 6
Uitleg:
De argumenten worden in volgorde aan de parameters gekoppeld. De namen van de variabelen buiten de functie spelen geen rol.
| oproep | a |
b |
a - b |
|---|---|---|---|
verschil(y, x) |
y = 4 |
x = 10 |
4 − 10 = -6 |
verschil(x, y) |
x = 10 |
y = 4 |
10 − 4 = 6 |
- Uitvoer:
-6 6
Oefening 4¶
Voorspel de uitvoer. Verwacht je een foutmelding? Schrijf dan gewoon "fout".
def volgende(x):
"""Het volgende getal."""
return x + 1
print("klaar")
def volgende_bis(x):
"""Het volgende getal."""
print("klaar")
return x + 1
print(volgende(volgende(2)))
print(volgende_bis(volgende_bis(2)))
4 klaar klaar 4
Uitvoer:
4
klaar
klaar
4
Uitleg:
return beëindigt de functie onmiddellijk. Alles wat na return staat (in dezelfde functie), wordt nooit uitgevoerd.
- In
volgendestaatprint("klaar")nareturn→ die regel wordt nooit bereikt. - In
volgende_bisstaatprint("klaar")vóórreturn→ die regel wordt bij elke oproep uitgevoerd.
Bij een geneste oproep zoals volgende(volgende(2)) werk je van binnen naar buiten: eerst de binnenste oproep, en het resultaat daarvan is het argument voor de buitenste.
Regel 1: print(volgende(volgende(2)))
| stap | oproep | wat gebeurt er? | uitvoer | teruggegeven |
|---|---|---|---|---|
| 1 | volgende(2) |
return 3 → functie stopt |
– | 3 |
| 2 | volgende(3) |
return 4 → functie stopt |
– | 4 |
| 3 | print(4) |
4 |
Regel 2: print(volgende_bis(volgende_bis(2)))
| stap | oproep | wat gebeurt er? | uitvoer | teruggegeven |
|---|---|---|---|---|
| 1 | volgende_bis(2) |
eerst print("klaar"), dan return 3 |
klaar |
3 |
| 2 | volgende_bis(3) |
eerst print("klaar"), dan return 4 |
klaar |
4 |
| 3 | print(4) |
4 |
- De twee keer
klaarverschijnen vóór de4:print(...)kan pas iets tonen als de waarde tussen de haakjes volledig berekend is, en tijdens die berekening worden de tweeklaar's al getoond.
Oefening 5¶
Voorspel de uitvoer. Verwacht je een foutmelding? Schrijf dan gewoon "fout".
def verhoog(getal):
"""Getal verhogen met 10."""
getal = getal + 10
return getal
getal = 5
nieuw = verhoog(getal)
print(getal, nieuw)
5 15
Uitvoer:
5 15
Uitleg:
De parameter getal in de functie is een lokale variabele: een aparte variabele die enkel binnen de functie bestaat, ook al heeft ze dezelfde naam als de variabele getal buiten de functie.
| stap | getal (buiten) |
getal (binnen de functie) |
nieuw |
|---|---|---|---|
getal = 5 |
5 | – | – |
oproep verhoog(getal) |
5 | 5 (kopie van de waarde) | – |
getal = getal + 10 (binnen) |
5 | 15 | – |
return getal → nieuw = 15 |
5 | (bestaat niet meer) | 15 |
- De variabele
getalbuiten de functie verandert niet:print(getal, nieuw)→5 15.
Oefening 6¶
Voorspel de uitvoer. Verwacht je een foutmelding? Schrijf dan gewoon "fout".
def opp_vierkant(z):
"""Oppervlakte van een vierkant met zijde z."""
return z ** 2
def opp_kubus(z):
"""Totale oppervlakte van een kubus met ribbe z."""
return 6 * opp_vierkant(z)
print(opp_kubus(3), opp_vierkant(opp_vierkant(2)))
54 16
Uitvoer:
54 16
Uitleg:
opp_kubus(3): de functie opp_kubus roept zelf opp_vierkant op.
| stap | berekening | resultaat |
|---|---|---|
opp_vierkant(3) |
3² | 9 |
6 * opp_vierkant(3) |
6 · 9 | 54 |
opp_vierkant(opp_vierkant(2)): van binnen naar buiten.
| stap | berekening | resultaat |
|---|---|---|
opp_vierkant(2) |
2² | 4 |
opp_vierkant(4) |
4² | 16 |
- Uitvoer:
54 16
Oefening 7¶
Voorspel de uitvoer. Verwacht je een foutmelding? Schrijf dan gewoon "fout".
import math
def schuine_zijde(a, b):
"""Schuine zijde van een rechthoekige driehoek met rechthoekszijden a en b."""
return math.sqrt(a ** 2 + b ** 2)
print(schuine_zijde(3, 4), int(schuine_zijde(5, 5)))
5.0 7
Uitvoer:
5.0 7
Uitleg:
| oproep | berekening | resultaat |
|---|---|---|
schuine_zijde(3, 4) |
√(3² + 4²) = √(9 + 16) = √25 | 5.0 |
schuine_zijde(5, 5) |
√(25 + 25) = √50 ≈ 7,07 | 7.0710678... |
int(7.0710678...) |
afkappen | 7 |
math.sqrt()geeft altijd een float, ook als de wortel "opgaat":5.0en niet5.int()kapt af, het rondt niet af.
Oefening 8¶
Voorspel de uitvoer. Verwacht je een foutmelding? Schrijf dan gewoon "fout".
De gebruiker typt: 100.
def prijs_met_btw(prijs):
"""Prijs inclusief 21 % btw."""
return prijs * 1.21
p = input("Prijs zonder btw? ")
print(p * 2, prijs_met_btw(float(p)))
Prijs zonder btw? 100 100100 121.0
Uitvoer:
100100 121.0
Uitleg:
input()geeft altijd tekst:p = "100".
| uitdrukking | berekening | resultaat |
|---|---|---|
p * 2 |
tekst 2 keer herhalen | 100100 |
float(p) |
"100" → 100.0 |
100.0 |
prijs_met_btw(100.0) |
100,0 · 1,21 | 121.0 |
- Uitvoer:
100100 121.0
Oefening 9¶
Voorspel de uitvoer. Verwacht je een foutmelding? Schrijf dan gewoon "fout".
def procent(x, p):
"""p procent van x."""
return x * p / 100
for g in [50, 80, 300]:
print(f"20 % van {g} is {procent(g, 20)}")
20 % van 50 is 10.0 20 % van 80 is 16.0 20 % van 300 is 60.0
Uitvoer:
20 % van 50 is 10.0
20 % van 80 is 16.0
20 % van 300 is 60.0
Uitleg:
De for-lus roept de functie drie keer op, telkens met p = 20.
| doorloop | g |
procent(g, 20) = g * 20 / 100 |
uitvoer |
|---|---|---|---|
| 1 | 50 | 1000 / 100 = 10.0 | 20 % van 50 is 10.0 |
| 2 | 80 | 1600 / 100 = 16.0 | 20 % van 80 is 16.0 |
| 3 | 300 | 6000 / 100 = 60.0 | 20 % van 300 is 60.0 |
- Er staat
10.0en niet10: de deling/geeft altijd een float. - De
20 %in de f-string is gewone tekst (het staat niet tussen{ }); enkel{g}en{procent(g, 20)}worden ingevuld.
Oefening 10¶
Voorspel de uitvoer. Verwacht je een foutmelding? Schrijf dan gewoon "fout".
def beoordeling(punt):
"""Geslaagd of niet."""
if punt >= 10:
return "geslaagd"
return "niet geslaagd"
print(beoordeling(12), "-", beoordeling(9.5))
geslaagd - niet geslaagd
Uitvoer:
geslaagd - niet geslaagd
Uitleg:
| oproep | punt >= 10? |
welke return? |
teruggegeven |
|---|---|---|---|
beoordeling(12) |
True | de eerste → functie stopt | "geslaagd" |
beoordeling(9.5) |
False | de if wordt overgeslagen → de tweede |
"niet geslaagd" |
- Er is geen
elsenodig: als de voorwaarde waar is, stoptreturnde functie al, en komt Python nooit aan de tweedereturn. printzet spaties tussen de drie waarden (ook rond"-"):geslaagd - niet geslaagd
Oefening 11¶
Voorspel de uitvoer. Verwacht je een foutmelding? Schrijf dan gewoon "fout".
def halveren(x):
"""Helft van x."""
helft = x / 2
print(halveren(10) + 1)
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) Cell In[12], line 5 1 def halveren(x): 2 """Helft van x.""" 3 helft = x / 2 4 ----> 5 print(halveren(10) + 1) TypeError: unsupported operand type(s) for +: 'NoneType' and 'int'
Uitvoer:
fout
Uitleg:
- In de functie wordt
helft = 5.0berekend, maar er staat geenreturn. Die waarde gaat dus verloren. halveren(10)geeftNoneterug.None + 1: met "niets" kan je niet rekenen → fout.- Verbetering:
return helfttoevoegen. Dan zou de uitvoer6.0zijn.
Oefening 12¶
Voorspel de uitvoer. Verwacht je een foutmelding? Schrijf dan gewoon "fout".
def opp_rechthoek(l, b):
"""Oppervlakte van een rechthoek met lengte l en breedte b."""
return l * b
print(opp_rechthoek(7))
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) Cell In[13], line 5 1 def opp_rechthoek(l, b): 2 """Oppervlakte van een rechthoek met lengte l en breedte b.""" 3 return l * b 4 ----> 5 print(opp_rechthoek(7)) TypeError: opp_rechthoek() missing 1 required positional argument: 'b'
Uitvoer:
fout
Uitleg:
- De functie heeft twee parameters (
lenb), maar wordt opgeroepen met maar één argument (7). - Python weet niet welke waarde
bmoet krijgen → fout. - Bij het oproepen moet het aantal argumenten gelijk zijn aan het aantal parameters, bv.
opp_rechthoek(7, 3)→21.
Oefening 13¶
Voorspel de uitvoer. Verwacht je een foutmelding? Schrijf dan gewoon "fout".
def f(x):
"""f(x) = x² - 4x + 3"""
return x ** 2 - 4 * x + 3
for x in range(0, 5):
print(x, f(x))
0 3 1 0 2 -1 3 0 4 3
Uitvoer:
0 3
1 0
2 -1
3 0
4 3
Uitleg:
range(0, 5) geeft x = 0, 1, 2, 3, 4 (5 niet!).
x |
x ** 2 |
- 4 * x |
+ 3 |
f(x) |
uitvoer |
|---|---|---|---|---|---|
| 0 | 0 | 0 | 3 | 3 | 0 3 |
| 1 | 1 | −4 | 3 | 0 | 1 0 |
| 2 | 4 | −8 | 3 | −1 | 2 -1 |
| 3 | 9 | −12 | 3 | 0 | 3 0 |
| 4 | 16 | −16 | 3 | 3 | 4 3 |
- Wiskundig: x = 1 en x = 3 zijn de nulpunten van f, en de top ligt bij x = 2 (f(2) = −1). De functiewaarden liggen symmetrisch rond x = 2.
- Een docstring met een formule (zoals hier) is toegelaten; ze wordt niet uitgevoerd.
Oefening 14¶
Voorspel de uitvoer. Verwacht je een foutmelding? Schrijf dan gewoon "fout".
def bewerking1(a, b):
"""Kwadraat van de som van a en b."""
return (a + b) ** 2
def bewerking2(a, b):
"""Som van de kwadraten van a en b."""
return a ** 2 + b ** 2
print(bewerking1(3, 4), bewerking2(3, 4), bewerking1(3, 4) - bewerking2(3, 4))
49 25 24
Uitvoer:
49 25 24
Uitleg:
| uitdrukking | berekening | resultaat |
|---|---|---|
bewerking1(3, 4) |
(3 + 4)² = 7² | 49 |
bewerking2(3, 4) |
3² + 4² = 9 + 16 | 25 |
| verschil | 49 − 25 | 24 |
- Het verschil 24 is precies 2 · 3 · 4 = 2ab. Dat is het merkwaardig product: (a + b)² = a² + 2ab + b².
- Meetkundig: een vierkant met zijde a + b bestaat uit een vierkant a², een vierkant b² én twee rechthoeken a · b.
Oefening 15 (bonusvraag – uitbreiding)¶
Voorspel de uitvoer. Verwacht je een foutmelding? Schrijf dan gewoon "fout".
#uitbreiding (bonusvraag)
class Rechthoek:
"""Klasse Rechthoek."""
def __init__(self, lengte, breedte):
"""Initialisatie: een rechthoek heeft een lengte en een breedte."""
self.l = lengte
self.b = breedte
def oppervlakte(self):
"""Oppervlakte van de rechthoek."""
return self.l * self.b
r1 = Rechthoek(4, 3)
r2 = Rechthoek(2, 5)
print(r1.oppervlakte() + r2.oppervlakte(), r1.l)
22 4
Uitvoer:
22 4
Uitleg:
Rechthoek(4, 3)maakt een object aan:__init__wordt uitgevoerd metlengte = 4enbreedte = 3, en die worden bewaard als attributenself.lenself.b.selfverwijst naar het object zelf. Zo weet de methodeoppervlakte()over welke rechthoek het gaat.
| object | self.l |
self.b |
oppervlakte() |
|---|---|---|---|
r1 |
4 | 3 | 4 · 3 = 12 |
r2 |
2 | 5 | 2 · 5 = 10 |
r1.oppervlakte() + r2.oppervlakte()= 12 + 10 =22r1.l= het attribuutlvanr1→4- Uitvoer:
22 4
Deel B: Zoek de fout!¶
def omtrek_vierkant(z)
"""Omtrek van een vierkant met zijde z."""
return 4 * z
print(omtrek_vierkant(6))
Cell In[17], line 1 def omtrek_vierkant(z) ^ SyntaxError: expected ':'
Uitvoer van de originele code:
fout
Verbeterde code:
def omtrek_vierkant(z):
"""Omtrek van een vierkant met zijde z."""
return 4 * z
print(omtrek_vierkant(6))
24
Uitleg:
- Na de kop van een functiedefinitie (
def ...(...)) moet altijd een dubbelepunt:staan, net zoals naif,forenwhile. - Zonder dubbelepunt geeft Python een fout, nog voor er iets uitgevoerd wordt.
- Na de verbetering:
omtrek_vierkant(6)= 4 · 6 =24.
Oefening 17¶
Zoek de fout! Deze code bevat precies één fout. Verbeter ze.
Gewenste uitvoer: Het dubbel van 7 is 14.
def verdubbelen(x):
"""Verdubbelen."""
dubbel = 2 * x
print(f"Het dubbel van 7 is {verdubbelen(7)}.")
Het dubbel van 7 is None.
Uitvoer van de originele code:
Het dubbel van 7 is None.
Verbeterde code:
def verdubbelen(x):
"""Verdubbelen."""
dubbel = 2 * x
return dubbel
print(f"Het dubbel van 7 is {verdubbelen(7)}.")
Het dubbel van 7 is 14.
Uitleg:
- De functie berekent
dubbel = 14, maar geeft niets terug: er ontbreektreturn dubbel. - Zonder
returngeeft de functieNoneterug, en dat wordt in de f-string ingevuld:Het dubbel van 7 is None. - Geen foutmelding, maar een fout resultaat.
- Oplossing:
return dubbeltoevoegen (ingesprongen, in de functie). Korter mag ook:return 2 * x.
Oefening 18¶
Zoek de fout! Deze code bevat precies één fout. Verbeter ze.
Gewenste uitvoer: De prijs na korting is 65.0 euro.
def prijs_na_korting(pr, per):
"""Prijs na een korting van per procent op een prijs pr."""
nieuwe_prijs = pr * (1 - pr / 100)
return nieuwe_prijs
print(f"De prijs na korting is {prijs_na_korting(100, 35)} euro.")
De prijs na korting is 0.0 euro.
Uitvoer van de originele code:
De prijs na korting is 0.0 euro.
Verbeterde code:
def prijs_na_korting(pr, per):
"""Prijs na een korting van per procent op een prijs pr."""
nieuwe_prijs = pr * (1 - per / 100)
return nieuwe_prijs
print(f"De prijs na korting is {prijs_na_korting(100, 35)} euro.")
De prijs na korting is 65.0 euro.
Uitleg:
- In de formule staat
pr / 100in plaats vanper / 100. De parameterperwordt nergens gebruikt! - Originele code: 100 · (1 − 100/100) = 100 · 0 =
0.0→De prijs na korting is 0.0 euro. - Na de verbetering: 100 · (1 − 35/100) = 100 · 0,65 =
65.0 - Tip: een parameter die nergens in de functie gebruikt wordt, is bijna altijd een teken van een fout.
print(opp_driehoek(6, 4))
def opp_driehoek(b, h):
"""Oppervlakte van een driehoek met basis b en hoogte h."""
return b * h / 2
--------------------------------------------------------------------------- NameError Traceback (most recent call last) Cell In[23], line 1 ----> 1 print(opp_driehoek(6, 4)) 2 3 def opp_driehoek(b, h): 4 """Oppervlakte van een driehoek met basis b en hoogte h.""" NameError: name 'opp_driehoek' is not defined
Uitvoer van de originele code:
fout
Verbeterde code:
def opp_driehoek(b, h):
"""Oppervlakte van een driehoek met basis b en hoogte h."""
return b * h / 2
print(opp_driehoek(6, 4))
12.0
Uitleg:
- Python voert een script van boven naar onder uit.
- Op het moment dat
print(opp_driehoek(6, 4))uitgevoerd wordt, is de functieopp_driehoeknog niet gedefinieerd → fout. - Oplossing: eerst de functie definiëren, daarna pas oproepen.
- 6 · 4 / 2 =
12.0(de deling/geeft een float).
def opp_cirkel(r):
"""Oppervlakte van een cirkel met straal r."""
return math.pi * r ** 2
print(round(opp_cirkel(2), 2))
12.57
Uitvoer van de originele code:
fout
Verbeterde code:
import math
def opp_cirkel(r):
"""Oppervlakte van een cirkel met straal r."""
return math.pi * r ** 2
print(round(opp_cirkel(2), 2))
12.57
Uitleg:
math.pihoort bij de modulemath. Die moet je eerst importeren, anders kent Pythonmathniet → fout.- Oplossing:
import mathbovenaan toevoegen. - π · 2² = 4π ≈ 12,566... →
round(..., 2)→12.57
Oefening 21¶
Zoek de fout! Deze code bevat precies één fout. Verbeter ze.
Gewenste uitvoer: De inhoud is 27.
De gebruiker typt: 3.
def inhoud_kubus(z):
"""Inhoud van een kubus met ribbe z."""
return z ** 3
zijde = input("Ribbe van de kubus? ")
print(f"De inhoud is {inhoud_kubus(zijde)}.")
Ribbe van de kubus? 3
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) Cell In[27], line 6 2 """Inhoud van een kubus met ribbe z.""" 3 return z ** 3 4 5 zijde = input("Ribbe van de kubus? ") ----> 6 print(f"De inhoud is {inhoud_kubus(zijde)}.") Cell In[27], line 3, in inhoud_kubus(z) 1 def inhoud_kubus(z): 2 """Inhoud van een kubus met ribbe z.""" ----> 3 return z ** 3 TypeError: unsupported operand type(s) for ** or pow(): 'str' and 'int'
Uitvoer van de originele code:
fout
Verbeterde code:
def inhoud_kubus(z):
"""Inhoud van een kubus met ribbe z."""
return z ** 3
zijde = int(input("Ribbe van de kubus? "))
print(f"De inhoud is {inhoud_kubus(zijde)}.")
Ribbe van de kubus? 3 De inhoud is 27.
Uitleg:
input()geeft tekst:zijde = "3".- In de functie staat dan
"3" ** 3: een tekst tot een macht verheffen kan niet → fout. - Oplossing: de invoer omzetten met
int(...)(offloat(...), maar dan wordt de uitvoer27.0). - 3³ =
27 - Ook goed:
inhoud_kubus(int(zijde))in de f-string.
Oefening 22¶
Zoek de fout! Deze code bevat precies één fout. Verbeter ze.
Gewenste uitvoer: Inhoud: 108.0 m³
def inhoud_piramide(z, h):
"""Inhoud van een piramide met vierkant grondvlak met zijde z en hoogte h."""
return z ** 2 * h / 3
# piramide met een vierkant grondvlak met zijde 6 m en hoogte 9 m
print(f"Inhoud: {inhoud_piramide(9, 6)} m³")
Inhoud: 162.0 m³
Uitvoer van de originele code:
Inhoud: 162.0 m³
Verbeterde code:
def inhoud_piramide(z, h):
"""Inhoud van een piramide met vierkant grondvlak met zijde z en hoogte h."""
return z ** 2 * h / 3
# piramide met een vierkant grondvlak met zijde 6 m en hoogte 9 m
print(f"Inhoud: {inhoud_piramide(6, 9)} m³")
Inhoud: 108.0 m³
Uitleg:
- De functie heeft de parameters in de volgorde
(z, h): eerst de zijde, dan de hoogte. - Bij de oproep
inhoud_piramide(9, 6)krijgtz = 9enh = 6: de argumenten zijn verwisseld.
z |
h |
z ** 2 * h / 3 |
|
|---|---|---|---|
origineel (9, 6) |
9 | 6 | 81 · 6 / 3 = 162.0 ❌ |
verbeterd (6, 9) |
6 | 9 | 36 · 9 / 3 = 108.0 ✔️ |
- Geen foutmelding, maar een fout resultaat. Kijk bij het oproepen altijd naar de volgorde van de parameters in de definitie.
def som_lijst(getallen):
"""Som van alle getallen in de lijst."""
totaal = 0
for g in getallen:
totaal += g
return totaal
print(som_lijst([4, 7, 9]))
4
Uitvoer van de originele code:
4
Verbeterde code:
def som_lijst(getallen):
"""Som van alle getallen in de lijst."""
totaal = 0
for g in getallen:
totaal += g
return totaal
print(som_lijst([4, 7, 9]))
20
Uitleg:
return totaalstaat in de for-lus (8 spaties ingesprongen). Na de eerste doorloop stopt de functie al.
Verloop van de originele code:
| doorloop | g |
totaal |
wat gebeurt er? |
|---|---|---|---|
| start | – | 0 | |
| 1 | 4 | 4 | return 4 → functie stopt! |
→ uitvoer 4
- Oplossing:
return totaaleven ver laten inspringen alsfor(4 spaties), zodat ze pas na de lus uitgevoerd wordt.
Verloop na de verbetering:
| doorloop | g |
totaal |
|---|---|---|
| start | – | 0 |
| 1 | 4 | 4 |
| 2 | 7 | 11 |
| 3 | 9 | 20 |
| na de lus | return 20 |
→ uitvoer 20
def gemiddelde(a, b, c):
"""Gemiddelde van a, b en c."""
gem = (a + b + c) / 3
return gem
gemiddelde(12, 15, 18)
print(gem)
--------------------------------------------------------------------------- NameError Traceback (most recent call last) Cell In[33], line 7 3 gem = (a + b + c) / 3 4 return gem 5 6 gemiddelde(12, 15, 18) ----> 7 print(gem) NameError: name 'gem' is not defined
Uitvoer van de originele code:
fout
Verbeterde code:
def gemiddelde(a, b, c):
"""Gemiddelde van a, b en c."""
gem = (a + b + c) / 3
return gem
gem = gemiddelde(12, 15, 18)
print(gem)
15.0
Uitleg:
gemis een lokale variabele: ze bestaat enkel binnen de functie. Buiten de functie kent Pythongemniet →print(gem)geeft een fout.- De functie geeft wel de waarde terug, maar bij
gemiddelde(12, 15, 18)wordt die teruggegeven waarde nergens opgeslagen: ze gaat verloren. - Oplossing: de teruggegeven waarde opslaan in een variabele:
gem = gemiddelde(12, 15, 18). - (12 + 15 + 18) / 3 = 45 / 3 =
15.0 - Ook goed: de oproep rechtstreeks in de
printzetten:print(gemiddelde(12, 15, 18)).
Oefening 25 (bonusvraag – uitbreiding)¶
Zoek de fout! Deze code bevat precies één fout. Verbeter ze.
Gewenste uitvoer: De gletsjer Aletschgletsjer ligt in Zwitserland!
#uitbreiding (bonusvraag)
class Gletsjer:
"""Klasse Gletsjer."""
def __init__(self, gletsjer_naam, gletsjer_land):
"""Initialisatie: naam en land van de gletsjer."""
self.naam = gletsjer_naam
self.land = gletsjer_land
def kenmerken(self):
"""Geeft attributen weer."""
print(f"De gletsjer {naam} ligt in {self.land}!")
gletsjer1 = Gletsjer("Aletschgletsjer", "Zwitserland")
gletsjer1.kenmerken()
--------------------------------------------------------------------------- NameError Traceback (most recent call last) Cell In[35], line 15 11 """Geeft attributen weer.""" 12 print(f"De gletsjer {naam} ligt in {self.land}!") 13 14 gletsjer1 = Gletsjer("Aletschgletsjer", "Zwitserland") ---> 15 gletsjer1.kenmerken() Cell In[35], line 12, in Gletsjer.kenmerken(self) 10 def kenmerken(self): 11 """Geeft attributen weer.""" ---> 12 print(f"De gletsjer {naam} ligt in {self.land}!") NameError: name 'naam' is not defined
Uitvoer van de originele code:
fout
Verbeterde code:
#uitbreiding (bonusvraag)
class Gletsjer:
"""Klasse Gletsjer."""
def __init__(self, gletsjer_naam, gletsjer_land):
"""Initialisatie: naam en land van de gletsjer."""
self.naam = gletsjer_naam
self.land = gletsjer_land
def kenmerken(self):
"""Geeft attributen weer."""
print(f"De gletsjer {self.naam} ligt in {self.land}!")
gletsjer1 = Gletsjer("Aletschgletsjer", "Zwitserland")
gletsjer1.kenmerken()
De gletsjer Aletschgletsjer ligt in Zwitserland!
Uitleg:
- In de methode
kenmerken()staat{naam}in plaats van{self.naam}. naambestaat daar niet: de naam van de gletsjer is in__init__bewaard als attribuut van het object,self.naam→ fout.- Oplossing:
{self.naam}schrijven, net zoals er al{self.land}staat. - In elke methode van een klasse spreek je de attributen aan via
self.
Deel C: Vul de code aan¶
Oefening 26¶
Vul de code aan op de plaatsen met .... Bereken de omtrek van een cirkel met diameter 10 cm en rond af op 2 decimalen.
Gewenste uitvoer: De omtrek is 31.42 cm.
import math
def omtrek_cirkel(r):
"""Omtrek van een cirkel met straal r."""
...
return omtrek
# omtrek van een cirkel met diameter 10 cm
...
print(f"De omtrek is {...} cm.")
De omtrek is Ellipsis cm.
Oplossing:
import math
def omtrek_cirkel(r):
"""Omtrek van een cirkel met straal r."""
omtrek = 2 * math.pi * r
return omtrek
# omtrek van een cirkel met diameter 10 cm
o = omtrek_cirkel(10 / 2)
print(f"De omtrek is {round(o, 2)} cm.")
De omtrek is 31.42 cm.
Uitleg:
- Formule: omtrek = 2πr.
- ⚠️ De diameter is 10 cm, de straal is dus 10 / 2 = 5 cm.
| stap | berekening | resultaat |
|---|---|---|
omtrek_cirkel(5) |
2 · π · 5 = 10π | 31.4159... |
round(..., 2) |
afronden op 2 decimalen | 31.42 |
- Ook goed:
omtrek_cirkel(5)rechtstreeks in de f-string zetten, ofround()in de functie zelf doen.
Oefening 27¶
Vul de code aan. Een temperatuur in graden Celsius zet je om naar graden Fahrenheit met de formule $F = 1{,}8 \cdot C + 32$. Rond af op 1 decimaal.
Gewenste uitvoer:
0 °C = 32.0 °F
20 °C = 68.0 °F
37 °C = 98.6 °F
100 °C = 212.0 °F
def naar_fahrenheit(...):
"""..."""
...
return ...
for c in [0, 20, 37, 100]:
print(f"{c} °C = {...} °F")
Cell In[39], line 1 def naar_fahrenheit(...): ^ SyntaxError: invalid syntax
Oplossing:
def naar_fahrenheit(c):
"""Temperatuur c in graden Celsius omzetten naar graden Fahrenheit."""
f = 1.8 * c + 32
return f
for c in [0, 20, 37, 100]:
print(f"{c} °C = {round(naar_fahrenheit(c), 1)} °F")
0 °C = 32.0 °F 20 °C = 68.0 °F 37 °C = 98.6 °F 100 °C = 212.0 °F
Uitleg:
c |
1.8 * c + 32 |
afgerond | uitvoer |
|---|---|---|---|
| 0 | 0 + 32 | 32.0 | 0 °C = 32.0 °F |
| 20 | 36 + 32 | 68.0 | 20 °C = 68.0 °F |
| 37 | 66,6 + 32 = 98.60000000000001 | 98.6 | 37 °C = 98.6 °F |
| 100 | 180 + 32 | 212.0 | 100 °C = 212.0 °F |
- Waarom afronden? Een computer bewaart kommagetallen binair, waardoor er soms een heel klein afrondingsfoutje in de laatste decimaal sluipt (98.60000000000001). Met
round(..., 1)los je dat op. - De parameter mag ook een andere naam hebben (bv.
celsius), zolang je hem in de functie consequent gebruikt.
Oefening 28¶
Schrijf een functie opp_trapezium() met drie parameters: grote basis B, kleine basis b en hoogte h. Vergeet de docstring niet. Bereken daarna de oppervlakte van een trapezium met grote basis 8 cm, kleine basis 4 cm en hoogte 5 cm.
Formule: $A = \dfrac{(B + b) \cdot h}{2}$
Gewenste uitvoer: De oppervlakte van het trapezium is 30.0 cm².
# functie
# toepassing
Oplossing:
def opp_trapezium(B, b, h):
"""Oppervlakte van een trapezium met grote basis B, kleine basis b en hoogte h."""
return (B + b) * h / 2
A = opp_trapezium(8, 4, 5)
print(f"De oppervlakte van het trapezium is {A} cm².")
De oppervlakte van het trapezium is 30.0 cm².
Uitleg:
- De functie krijgt drie parameters, in de volgorde grote basis, kleine basis, hoogte.
- (8 + 4) · 5 / 2 = 12 · 5 / 2 = 60 / 2 =
30.0 - ⚠️ De haakjes rond
B + bzijn nodig: zonder haakjes rekent PythonB + b * h / 2= 8 + 10 = 18.0. - Python maakt een verschil tussen hoofdletters en kleine letters:
Benbzijn twee verschillende parameters.
Oefening 29¶
Een cirkelring is het gebied tussen twee cirkels met hetzelfde middelpunt: een grote cirkel met straal R en een kleine cirkel met straal r. Vul de functie opp_ring() aan. Gebruik daarbij de functie opp_cirkel(). Rond af op 2 decimalen.
Gewenste uitvoer: 50.27
import math
def opp_cirkel(r):
"""Oppervlakte van een cirkel met straal r."""
return math.pi * r ** 2
def opp_ring(R, r):
"""Oppervlakte van een cirkelring met buitenstraal R en binnenstraal r."""
...
print(round(opp_ring(5, 3), 2))
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) Cell In[43], line 11 7 def opp_ring(R, r): 8 """Oppervlakte van een cirkelring met buitenstraal R en binnenstraal r.""" 9 ... 10 ---> 11 print(round(opp_ring(5, 3), 2)) TypeError: type NoneType doesn't define __round__ method
Oplossing:
import math
def opp_cirkel(r):
"""Oppervlakte van een cirkel met straal r."""
return math.pi * r ** 2
def opp_ring(R, r):
"""Oppervlakte van een cirkelring met buitenstraal R en binnenstraal r."""
return opp_cirkel(R) - opp_cirkel(r)
print(round(opp_ring(5, 3), 2))
50.27
Uitleg:
- Oppervlakte ring = oppervlakte grote cirkel − oppervlakte kleine cirkel.
- De functie
opp_ringhergebruikt de functieopp_cirkel: je hoeft de formule niet opnieuw te schrijven.
| stap | berekening | resultaat |
|---|---|---|
opp_cirkel(5) |
π · 25 | 78.539... |
opp_cirkel(3) |
π · 9 | 28.274... |
| verschil | 25π − 9π = 16π | 50.265... |
round(..., 2) |
50.27 |
- ⚠️ Fout is:
opp_cirkel(5 - 3)= π · 2² = 4π. De straal aftrekken is niet hetzelfde als de oppervlaktes aftrekken!
Oefening 30¶
Gegeven is de functie $f(x) = -x^2 + 6x - 5$.
- Definieer de functie
f()in Python. - Druk een tabel af met de functiewaarden voor $x$ = 0, 1, 2, ..., 6.
- Laat bij elk nulpunt ook de tekst
nulpuntverschijnen.
Gewenste uitvoer:
0 -5
1 0 nulpunt
2 3
3 4
4 3
5 0 nulpunt
6 -5
def f(x):
"""f(x) = -x² + 6x - 5"""
...
for x in ...:
...
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) Cell In[45], line 5 1 def f(x): 2 """f(x) = -x² + 6x - 5""" 3 ... 4 ----> 5 for x in ...: 6 ... TypeError: 'ellipsis' object is not iterable
Oplossing:
def f(x):
"""f(x) = -x² + 6x - 5"""
return -x ** 2 + 6 * x - 5
for x in range(0, 7):
if f(x) == 0:
print(x, f(x), "nulpunt")
else:
print(x, f(x))
0 -5 1 0 nulpunt 2 3 3 4 4 3 5 0 nulpunt 6 -5
Uitleg:
range(0, 7)geeft x = 0 tot en met 6.- In de lus controleer je met een
ifoff(x) == 0.
x |
-x ** 2 |
+ 6 * x |
- 5 |
f(x) |
nulpunt? |
|---|---|---|---|---|---|
| 0 | 0 | 0 | −5 | −5 | |
| 1 | −1 | 6 | −5 | 0 | ✔️ |
| 2 | −4 | 12 | −5 | 3 | |
| 3 | −9 | 18 | −5 | 4 | |
| 4 | −16 | 24 | −5 | 3 | |
| 5 | −25 | 30 | −5 | 0 | ✔️ |
| 6 | −36 | 36 | −5 | −5 |
- ⚠️
-x ** 2betekent −(x²), want**gaat vóór het minteken. Dat is hier precies wat we willen.(-x) ** 2zou altijd positief zijn. - Wiskundig: nulpunten x = 1 en x = 5, de top is (3, 4).
Oefening 31¶
Schrijf een script dat:
- aan de gebruiker vraagt hoeveel punten hij behaalde en op hoeveel punten de toets stond;
- met een functie
percentage(behaald, maximum)het percentage berekent, afgerond op 1 decimaal; - een zin met het percentage afdrukt.
De gebruiker typt: 15, dan 20.
Gewenste uitvoer: Je behaalde 75.0 %.
Oplossing:
def percentage(behaald, maximum):
"""Percentage van behaald op maximum, afgerond op 1 decimaal."""
return round(behaald / maximum * 100, 1)
behaald = float(input("Hoeveel punten behaalde je? "))
maximum = float(input("Op hoeveel punten stond de toets? "))
print(f"Je behaalde {percentage(behaald, maximum)} %.")
Hoeveel punten behaalde je? 14 Op hoeveel punten stond de toets? 20 Je behaalde 70.0 %.
Uitleg:
| stap | waarde |
|---|---|
behaald = float(input(...)) |
15.0 |
maximum = float(input(...)) |
20.0 |
behaald / maximum * 100 |
15 / 20 · 100 = 75.0 |
round(..., 1) |
75.0 |
- Zonder
float()(ofint()) zijnbehaaldenmaximumtekst, en dan kan je niet delen → fout. - Met
int(...)werkt het ook (15 / 20 · 100 = 75.0), maar dan kan de gebruiker geen halve punten ingeven.
Oefening 32¶
Schrijf een functie is_rechthoekig(a, b, c) die True teruggeeft als een driehoek met zijden a, b en c rechthoekig is (de stelling van Pythagoras, met c de langste zijde) en anders False. Test met de driehoeken 3-4-5, 5-6-7 en 5-12-13.
Gewenste uitvoer: True False True
def is_rechthoekig(a, b, c):
"""..."""
...
print(is_rechthoekig(3, 4, 5), is_rechthoekig(5, 6, 7), is_rechthoekig(5, 12, 13))
None None None
Oplossing:
def is_rechthoekig(a, b, c):
"""True als de driehoek met zijden a, b en c (c de langste) rechthoekig is."""
return a ** 2 + b ** 2 == c ** 2
print(is_rechthoekig(3, 4, 5), is_rechthoekig(5, 6, 7), is_rechthoekig(5, 12, 13))
True False True
Uitleg:
- Stelling van Pythagoras: een driehoek is rechthoekig als a² + b² = c² (c de langste zijde).
- Een vergelijking met
==geeft zelf alTrueofFalse, dus je kan ze meteen teruggeven.
| oproep | a² + b² | c² | gelijk? |
|---|---|---|---|
(3, 4, 5) |
9 + 16 = 25 | 25 | True |
(5, 6, 7) |
25 + 36 = 61 | 49 | False |
(5, 12, 13) |
25 + 144 = 169 | 169 | True |
- Ook goed (maar langer):
if a ** 2 + b ** 2 == c ** 2:
return True
else:
return False
Oefening 33 (bonusvraag – uitbreiding)¶
Vul de klasse Cirkel aan. Een cirkel heeft één attribuut: de straal. Schrijf twee methodes: omtrek() en oppervlakte(). Maak daarna een cirkel met straal 2 aan en druk de omtrek en de oppervlakte af, afgerond op 2 decimalen.
Gewenste uitvoer: 12.57 12.57
import math
class Cirkel:
"""Klasse Cirkel."""
def __init__(self, ...):
"""Initialisatie: een cirkel heeft een straal."""
...
def omtrek(self):
"""Omtrek van de cirkel."""
...
def oppervlakte(self):
"""Oppervlakte van de cirkel."""
...
c1 = ...
print(round(c1.omtrek(), 2), round(c1.oppervlakte(), 2))
Cell In[50], line 6 def __init__(self, ...): ^ SyntaxError: invalid syntax
Oplossing:
import math
class Cirkel:
"""Klasse Cirkel."""
def __init__(self, straal):
"""Initialisatie: een cirkel heeft een straal."""
self.r = straal
def omtrek(self):
"""Omtrek van de cirkel."""
return 2 * math.pi * self.r
def oppervlakte(self):
"""Oppervlakte van de cirkel."""
return math.pi * self.r ** 2
c1 = Cirkel(2)
print(round(c1.omtrek(), 2), round(c1.oppervlakte(), 2))
12.57 12.57
Uitleg:
__init__bewaart de straal als attribuutself.r. In de methodes gebruik je danself.r.c1 = Cirkel(2)maakt een cirkel met straal 2.
| methode | formule | berekening | afgerond |
|---|---|---|---|
c1.omtrek() |
2πr | 2 · π · 2 = 4π | 12.57 |
c1.oppervlakte() |
πr² | π · 2² = 4π | 12.57 |
- Toeval? Nee: bij r = 2 zijn 2πr en πr² allebei gelijk aan 4π. Voor elke andere straal zijn ze verschillend.
- ⚠️ Vergeet
returnniet in de methodes, anders krijg jeNoneen geeftround(None, 2)een fout.