Functies werken samen
Hier bouw je op verder: Functies, Parameters en Return-waarden
Weet je dit niet meer zeker? Lees het terug voordat je verdergaat.
- Python Functies
- Python Parameters
- Python Return-waarden
Leerdoel: je weet wat een functie doet (input → output), en je ziet hoe de output van één functie de input van een andere kan zijn. Dit patroon gebruik je straks in elke bouwsteen.
Wat is een functie ook al weer?
Een functie is een kleine machine: je stopt er iets in en je krijgt er iets uit.
def kwadraat(x):
return x * x
def kwadraat(x): is de kop, met x als parameter. return x * x is
wat eruit komt. De aanroep kwadraat(5) geeft 25.
In ons minimax-project:
def player(bord):
# ... uitwerking ...
return "X" # of "O"
De input is een bord (een 3×3-lijst), de output "X" of "O".
Functies kun je stapelen
De output van de ene functie kan direct de input van een andere zijn.
print(kwadraat(kwadraat(2))) # (2²)² = 16
Dat werkt van binnen naar buiten: kwadraat(2) is 4, dan
kwadraat(4) is 16, en dat wordt geprint.
Een minimax-voorbeeld vooruit
Straks gaan we dit doen:
nieuw_bord = result(bord, (0, 0)) # past zet toe
wie_won = winner(nieuw_bord) # checkt of er een winnaar is
result geeft een nieuw bord terug, en dat bord stoppen we direct in
winner. Korter, gestapeld:
wie_won = winner(result(bord, (0, 0)))
Lees van binnen naar buiten: pas zet (0,0) toe, geef het nieuwe bord
aan winner.
Voorspel
Wat denk je dat dit print?
def verdubbel(x):
return x * 2
def plus_drie(x):
return x + 3
print(plus_drie(verdubbel(5)))
print(verdubbel(plus_drie(5)))
Antwoord
13
16
plus_drie(verdubbel(5)): eerst verdubbel(5) = 10, dan
plus_drie(10) = 13.
verdubbel(plus_drie(5)): eerst plus_drie(5) = 8, dan
verdubbel(8) = 16.
De volgorde maakt uit: wissel je de twee functies om, dan krijg je een ander antwoord.
Run
Een functie kan ook een andere functie aanroepen
Tot nu toe zagen we functies stapelen bij de aanroep. Maar een functie mag binnenin zijn body ook een andere aanroepen:
def kwadraat(x):
return x * x
def som_van_kwadraten(a, b):
return kwadraat(a) + kwadraat(b)
som_van_kwadraten doet zelf weinig: hij laat kwadraat het werk doen.
Dat heet compositie, een functie bouwen uit andere functies.
Waarom dit relevant is
In de bouwstenen hierna bouw je tien functies, en die roepen elkaar aan:
terminal(bord)roeptwinner(bord)aan.result(bord, zet)wordt doormax_value,min_valueenminimaxaangeroepen; het nieuwe bord gaat meteen door naarmin_valueofmax_value.max_value(bord)enmin_value(bord)roepen elkaar aan.minimax(bord)roeptactions,result,playeren die twee aan.
Elke functie is op zichzelf klein; samen zijn ze een AI.
Eén gouden regel: één functie, één taak
Een goede functie doet één ding. winner zegt wie heeft gewonnen: hij
print niets, verandert het bord niet en speelt zelf geen zet. Hij geeft
alleen "X", "O" of None terug.
Door je code in zulke kleine functies te splitsen kun je ze los testen:
winner op een vol bord, op een leeg bord, op een bord waar alleen de
diagonaal vol is. Elk geval apart, zonder dat de hele AI hoeft te
draaien.
Wat nu?
De eerste functie is de makkelijkste: initial_state(), een leeg bord
teruggeven.
Door naar bouwsteen 1: initial_state →.