← Python/Denken in functies
Les 7 van 8
MODULE 03 · 07◷ 24 min

Geef een functie aan een functie

Na deze les kun je
  • Een functie zonder haakjes doorgeven
  • Een meegegeven bewerking aanroepen
  • De volgorde van bewerkingen bewaken

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.

Een functie is ook een waarde

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.

Kies de regel, voer haar daarna uit

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.

Dezelfde werkwijze met een andere rekenregel
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))
Verwachte uitvoer
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.

VolgordeBeginNa de eerste stapNa de tweede stap
Drie optellen, dan kwadrateren4749
Kwadrateren, dan drie optellen41619

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.

Veelgemaakte fout: het antwoord meegeven

Een parameter die een functie verwacht, kan niet zomaar een getal als bewerking uitvoeren. In deze zelfstandige foutvariant staan de haakjes te vroeg.

Een berekend getal als bewerking doorgeven
def add_three(value):
    return value + 3

def apply(operation, value):
    return operation(value)

print(apply(add_three(4), 4))
Verwachte fout
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?

Een functie teruggeven

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.

AAN DE SLAG 0/4
1

Roep de meegegeven functie aan

Laat apply_once de parameter operation aanroepen met value.

2

Gebruik het tussenresultaat

Laat apply_twice het resultaat van de eerste aanroep opnieuw door operation verwerken.

3

Geef de juiste functie terug

Laat choose_operation de helper kiezen die bij name hoort, zonder haar al uit te voeren.

4

Respecteer de volgorde

Laat pipeline eerst first(value) berekenen en dat resultaat aan second geven.

Wat je meeneemt

  • Een functienaam zonder haakjes geeft de functie zelf; een aanroep geeft haar resultaat.
  • Een parameter kan een functie ontvangen en die later aanroepen.
  • Bij een reeks bewerkingen gaat elk antwoord naar de volgende stap, in de afgesproken volgorde.

Hierna combineer je kleine functies tot een volledige berekening met meerdere tussenresultaten.

main.py
UitvoerPython
›
›_

Hier komt je resultaat.

Voer je code uit en ontdek
wat je hebt gemaakt.

0/4 stappen
EVEN MEEKIJKEN

Bekijk hoe het kan.

Je mag de oplossing bekijken. Deze poging telt dan niet mee als afgeronde les. Met Reset kun je daarna opnieuw zelf oefenen.