10: Functies

In deze les laten we je het belangrijkste idee van programmeren zien: je eigen functies definieren! Functies zorgen ervoor dat je programma korter wordt, beter gestructureerd, en in onderdelen herbruikbaar. In latere functies zullen we andere voordelen zien zoals recursie.

Een functie definieren

We beginnen met een voorbeeld. Ken je de functie abs nog? Het heeft één argument (een getal x), en het heeft als resultaat zijn absolute waarde (het is x wanneer x ≥ 0, en het is -x wanneer x < 0). Kijk hoe we deze functie in Python definiëren:

def abs(x):     # definieer een functie met als naam 'abs' die één argument heeft namelijk 'x'
  if x >= 0:    # de body van de functie start hier
    return x
  else:
    return -x   # de body van de functie stopt hier
(Klik hier om deze code in de console te testen.)

De twee delen van een functie definitie

In de eerste regel van een functie definitie staan de naam van de functie en zijn argumenten. Het ziet er it als

def «functie-naam»(«argumenten-lijst»):

In het voorbeeld boven is  abs de naam van de functie en bestaat de argumenten-lijst uit één element, namelijk x. Het wordt een argumenten-lijst genoemd omdat het meerdere argumenten kunnen zijn, zoals  x, y, z; het is ook mogelijk om 0 argumenten te hebben, met andere woorden een lege lijst. De argumenten vormen de invoer van de functie.

Alles na de eerste regel van de definitie van  een functie de is de body van de functie. De body is een ingesprongen blok met programmaregels. Wanneer de functie wordt aangeroepen, wordt de  body uitgevoerd op deze argumenten/invoer. Wanneer we tenslotte de volgende regel in de body van de functie bereiken:

return «value»

stopt de functie en geeft «value» als uitvoer terug. Dat houdt in dat de return value de uitvoer van de functie is. Zoals het abs voorbeeld laat zien kan de  body meerdere return statements bevatten; maar alleen de eerste heeft effect omdat daarna de functie stopt.

Voorbeeld: Definitie en aanroep van een functie

Het volgende programma bevat een definitie van een functie en enkele andere opdrachten die worden uitgevoerd nadat de functie is gedefinieerd.

Voorbeeld
Squaring function

We zien dat de naam van de functie square is, met slechts één argument x, en dat de body van de functie bestaat uit één regel return x*x. Verder, buiten de functie, zijn er twee opdrachten die de functie in totaal drie keer aanroepen.

  1. Wanneer de eerste opdracht wordt uitgevoerd, moet Python square(10) evalueren.
    • Python vergelijkt de invoer lijst (10) met de lijst van argumenten (x). Het voert de body van de functie uit te weten: return x*x  waarbij het zich herinnert dat  x gelijk is aan 10. Dus geeft x*x het resultaat 100 en dat wordt afgedrukt.
  2. Wanneer de tweede opdracht wordt uitgevoerd, moet Python square(square(2)) evalueren.
    • Het binnenste deel  square(2) wordt eerst uitgevoerd. We nemen voor x het getal 2 en voeren de body van de functie uit. Dat geeft als resultaat 4.
    • Dan wordt het buitenste uitdrukking uitgevoerd ; en omdat square(2) het getal 4 geeft, roepen we nu  square(4) aan.  Dit levert 16, en dat wordt afgedrukt.

Zoals gebruikelijk kun je het programma uitproberen in Python3 Visualizer.

Vier veelvoorkomende fouten

Een veelvoorkomende fout  die je kunt maken bij de definitie van een functie  is het vergeten van de return opdracht.

Voorbeeld
Fout 1: return vergeten

Zoals je kunt zien, wanneer geen return opdracht in de body voorkomt, geeft de functie None als resultaat. Dus, wanneer je bij een oefening niet het gewenste resultaat krijgt omdat de functie  None teruggeeft dan is het probleem vaak dat bij een functie  geen return opdracht wordt uitgevoerd.

Je kunt ook de return opdracht met reden weglaten. Dit is zinvol als je functie een zij-effect heeft anders dan het geven van een return waarde:
Voorbeeld: Een zij-effect en geen return opdracht

Een andere veelvoorkomende fout is vergeten om in te springen, hetgeen  resulteert in IndentationError.

Voorbeeld
Fout 2: vergeten om in te springen

Zoals we in les 2 zagen, veroorzaakt het aanroepen van een functie met te weinig of te veel argumenten een fout.

Voorbeeld
Fout 3: aanroep met te veel argumenten

Tenslotte, wanneer je een typefout maakt  bij de aanroep van een functie, krijg je een fout waarbij gemeld wordt dat de functie niet gedefinieerd is.

Voorbeeld
Fout 4: verkeerde naam

Probeer het zelf

Programmeeroefening: Tot de derde macht
Definieer een functie derdeMacht(n), die één getal  n als invoer heeft, en  n × n × n als uitvoer heeft.
Voer testcommando's zoals print(myfunction("test argument")) hieronder in.

Twee of meer argumenten 

De functies boven hebben slechts één argument, maar een functie kan zo worden ontworpen dat het een willekeurig aantal argumenten accepteert. Je hebt bijvoorbeeld  al  input() met 0 argumenten aangeroepen (en je zult een functie definiëren met 0 argumenten in les 15A).

Hier is een voorbeeld van een functie uit de meetkunde  met  twee argumenten. Neem aan dat we een functie nodig hebben om de oppervlakte van een driehoek uit te rekenen, waarbij de de lengte van de basis en de bijbehorende hoogte zijn gegeven. De formule voor de oppervlakte is

oppervlakte = basis × hoogte / 2

Dan kunnen we in Python een functie  driehoekOpp als volgt definiëren:

Voorbeeld
Een functie met twee argumenten

Zoals je kunt zien, is de enige verandering dat we def «function-name»(«argument1») veranderen in def «function-name»(«argument1», «argument2»).

In de laatste oefening vragen we je om een functie met twee argumenten te schrijven, waarmee je de omtrek van een rechthoek kunt berekenen (de omtrek is de totale lengte van alle zijden). Bij een rechthoek met een gegeven  breedte en hoogte, wordt de omtrek gegeven de volgende formule:

omtrek = breedte + hoogte + breedte + hoogte

Programmeeroefening: Rechthoek
Definieer een functie omtrek(breedte, hoogte),die de omtrek van een rechthoek berekent.
Voer testcommando's zoals print(myfunction("test argument")) hieronder in.

Functies die functies aanroepen

Functies zijn de bouwstenen van goed geschreven grote programma's: je kunt dezelfde taak twee keer uitvoeren zonder dezelfde code twee keer te schrijven, en je kunt oplossingen van veelvoorkomende taken opnieuw gebruiken. Hier is een voorbeeld van het schrijven van een functie die  gebruikt wordt in een andere functie.

Voorbeeld
Kun je voorspellen wat deze functie doet voordat je het uitvoert?
Herinner uit les 4  dat de vermenigvuldiging van strings met een geheel getal  inhoudt dat de string dit aantal keren herhaald wordt . Zo is bijvoorbeeld, "tar"*2 gelijk aan "tartar".

Je bent nu klaar voor de volgende les!