Roep de meegegeven functie aan
Laat apply_once de parameter operation aanroepen met value.
Een bewerkingsstap kan hetzelfde blijven terwijl je de rekenregel wilt wisselen. Soms tel je drie op, soms kwadrateer je een getal. Door de gewenste functie mee te geven, kun je één werkwijze voor beide regels gebruiken.
Bij een functiewaarde gebruik je de functie zelf als iets dat je kunt bewaren, meegeven of teruggeven. De naam add_three verwijst naar de functie. Met add_three(4) roep je haar aan en krijg je haar antwoord, zeven.
De haakjes maken dus een belangrijk verschil. Met chosen = add_three bewaar je de functie onder een andere naam. chosen(4) kan die functie daarna uitvoeren.
Een functie die een andere functie ontvangt of teruggeeft heet ook een hogere-ordefunctie. Je hoeft daarvoor geen nieuwe definitievorm te leren. Een gewone parameter kan de functiewaarde ontvangen en het blok kan die parameter met haakjes aanroepen.
Dit zelfstandige voorbeeld bevat twee rekenregels en een functie die de meegegeven regel gebruikt. Druk op Voorbeeld uitvoeren. Volg telkens welke naam een functie bevat en welke naam al een getal bevat.
def add_three(value):
return value + 3
def square(value):
return value * value
def apply(operation, value):
return operation(value)
chosen = add_three
print(chosen(4))
print(apply(square, 4))
intermediate = apply(add_three, 4)
print(apply(square, intermediate))
intermediate = apply(square, 4)
print(apply(add_three, intermediate))7 16 49 19
Bij apply(add_three, 4) krijgt operation de functie en value het getal vier. Binnen apply voert operation(value) de meegegeven functie uit. De return levert het berekende getal weer aan de buitenste aanroeper.
Een tussenresultaat kun je aan een volgende bewerking geven. Daarbij doet de volgorde ertoe, ook wanneer je precies dezelfde twee functies gebruikt.
| Volgorde | Begin | Na de eerste stap | Na de tweede stap |
|---|---|---|---|
| Drie optellen, dan kwadrateren | 4 | 7 | 49 |
| Kwadrateren, dan drie optellen | 4 | 16 | 19 |
Het voorbeeld schrijft die stappen met een naam voor het tussenresultaat. Dat maakt de route goed leesbaar. Later kun je ook een aanroep direct als argument van de volgende aanroep schrijven; de binnenste aanroep levert dan eerst haar antwoord.
Een parameter die een functie verwacht, kan niet zomaar een getal als bewerking uitvoeren. In deze zelfstandige foutvariant staan de haakjes te vroeg.
def add_three(value):
return value + 3
def apply(operation, value):
return operation(value)
print(apply(add_three(4), 4))TypeError
Python berekent eerst add_three(4), zodat apply het getal zeven ontvangt als operation. Binnen apply probeert de code dat getal vervolgens aan te roepen. De TypeError zegt daarom dat een int niet aanroepbaar is.
Geef add_three zonder haakjes mee wanneer de ontvangende functie moet bepalen wanneer zij die regel uitvoert. Geef wel een aanroep mee wanneer je juist het berekende antwoord nodig hebt. Vraag jezelf bij een parameter af: verwacht deze plek een bewerking of een waarde om mee te rekenen?
Ook achter return mag een functienaam zonder haakjes staan. Een keuzefunctie kan bijvoorbeeld square teruggeven. De aanroeper kan dat bewaren met selected = choose_rule("square") en daarna selected(3) uitvoeren.
Dat zijn twee verschillende momenten: kiezen welke functie je wilt, daarna die functie gebruiken. In de opdrachten bouw je zo een keuze tussen de gegeven helpers. De tests gebruiken alleen de namen die de opdracht noemt.
Bij tweemaal toepassen moet het eerste antwoord de invoer van de tweede aanroep worden. Bij twee verschillende bewerkingen bewaak je daarnaast hun volgorde. Gebruik gerust een tussenvariabele zolang de gegevensstroom duidelijk blijft.
Laat apply_once de parameter operation aanroepen met value.
Laat apply_twice het resultaat van de eerste aanroep opnieuw door operation verwerken.
Laat choose_operation de helper kiezen die bij name hoort, zonder haar al uit te voeren.
Laat pipeline eerst first(value) berekenen en dat resultaat aan second geven.
Hierna combineer je kleine functies tot een volledige berekening met meerdere tussenresultaten.
Voer je code uit en ontdek
wat je hebt gemaakt.
Je hoeft het niet in één keer goed te doen. Na het uitvoeren zie je hier welke stappen al kloppen.