Functies in functies
Leerdoel: je roept binnen een eigen functie een andere eigen functie aan. Daarmee bouwen de volgende bouwstenen op elkaar voort.
Tot nu toe
Op functies werken samen zag je dat functies stapelen bij de aanroep:
print(plus_drie(verdubbel(5)))
Dat is prima voor een losse aanroep. Maar wil je steeds "eerst verdubbelen, dan plus drie", dan typ je dat patroon elke keer opnieuw. Maak er dan één eigen functie van.
Een functie die een andere functie aanroept
def verdubbel(x):
return x * 2
def plus_drie(x):
return x + 3
def doe_alletwee(x):
return plus_drie(verdubbel(x))
doe_alletwee is een nieuwe functie die in zijn body twee eerder
gedefinieerde functies aanroept. Vanaf nu schrijf je doe_alletwee(5)
in plaats van het patroon te herhalen.
Voorspel
Wat denk je dat dit print?
def begroet(naam):
return f"Hallo {naam}!"
def begroet_drie_keer(naam):
return begroet(naam) + " " + begroet(naam) + " " + begroet(naam)
print(begroet_drie_keer("Lotte"))
Antwoord
Hallo Lotte! Hallo Lotte! Hallo Lotte!
begroet_drie_keer roept begroet drie keer aan en plakt de resultaten
aan elkaar met spaties ertussen.
Run
Waarom is dit handig?
De logica staat één keer, in begroet. Wil je "Hallo" veranderen in
"Hoi", dan pas je begroet aan en elke functie die hem aanroept doet
meteen mee. Programmeurs noemen dat DRY, don't repeat yourself.
Het leest ook makkelijker: begroet_drie_keer(naam) zegt wat hij doet,
en de details zitten in begroet. Zo bouw je in lagen. Een groot
programma is niets anders dan lagen van functies die elkaar gebruiken,
en je tic-tac-toe-AI straks ook.
Wat we hierna gaan doen
In de volgende bouwsteen, result(bord, zet), moet je weten wie de zet
doet, X of O. Dat heb je al: player(bord) uit
bouwsteen 2 zegt precies wie aan de beurt is. Dus
schrijf je:
def result(bord, zet):
...
speler = player(bord) # ← je eigen functie aanroepen
...
Geen nieuwe telling en geen kopie van de logica: je roept player(bord)
aan en gebruikt het antwoord. Zo gaat het de rest van dit hoofdstuk.
Door naar bouwsteen 4: result →.