Module 6: Functies

Module 6: Functies maken

Leerdoelen

  • Het nut van functies
  • Functies creëren
  • Parameters en argumenten
  • Waardes uit functies retourneren middels return
  • Functie benamingen

 

In module 4 werd beschreven hoe je eenvoudige functies kunt gebruiken, en hoe je functies kunt importeren uit modules. Deze module beschrijft hoe je je eigen functies kunt creëren. Als je niet meer weet wat module 4 over functies zei, doe je er goed aan om die module nogmaals door te nemen.

6.1 Het nut van functies

Waarom zou je functies willen creëren? Er zijn een hoop goede redenen:

 

  • Je hebt een bepaalde functionaliteit voor je code nodig die je onafhankelijk van de rest van je programma wilt ontwikkelen. Als je een dergelijke functionaliteit in een functie stopt, betekent dat dat je nadat de functie gebouwd en getest is, je de functionaliteit kunt gebruiken zonder er verder over na te denken.
  • Er is een bepaalde functionaliteit die je op meerdere plekken in je programma nodig hebt, en je kunt beter die functionaliteit in een functie stoppen die op meerdere plekken aangeroepen wordt, dan dat je de code naar al die plekken kopieert.
  • Je hebt een functionaliteit in je code nodig die je kunt aansturen middels parameters. Als je dergelijke functionaliteit in een functie stopt, worden de parameters duidelijker en wordt de code gemakkelijker te lezen en te onderhouden.
  • Je programma is te lang om de inhoud goed te blijven overzien. Door de code op te splitsen in functies blijf je veel langer grip houden op de inhoud en werking.
  • Je hebt een probleem dat je te lastig vindt om in één keer op te lossen. Je besluit het probleem op te splitsen in meerdere sub-problemen die je wel aankunt. Functies zijn een natuurlijke manier om een dergelijke aanpak vorm te geven.

Over het algemeen gesproken, kunnen de voordelen van functies worden samengevat als een middel om de volgende zaken te bewerkstelligen:

  • Encapsulatie: Het “inpakken” van een nuttig stuk code op zo’n manier dat het gebruikt kan worden zonder kennis van de specifieke werking van de code
  • Generalisatie: Het geschikt maken van een stuk code voor diverse situaties door gebruik te maken van parameters
  • Beheersbaarheid: Het verdelen van een complex programma in gemakkelijk-te-bevatten delen
  • Onderhoudbaarheid: Het gebruik maken van betekenisvolle functienamen en logische opdelingen om een programma beter leesbaar en begrijpbaar te maken
  • Herbruikbaarheid: Het faciliteren van de overdraagbaarheid van code tussen programma’s
  • Recursie: Het beschikbaar maken van een techniek die “recursie” heet, wat het onderwerp is van een later hoofdstuk.

6.2 Het creëren van functies

Module 4 beschrijft hoe iedere functie een naam heeft, nul of meer parameters, en mogelijk een retourwaarde. Als je je eigen functies maakt, moet je al deze elementen definiëren.

Syntax

def <functie_naam>(<parameter_lijst>):

    <acties>

 

Functienamen moeten voldoen aan dezelfde eisen als variabele namen, dat wil zeggen, alleen letters, cijfers, en underscores, en ze mogen niet beginnen met een cijfer. De parameter lijst bestaat uit nul of meer variabele namen, met komma’s ertussen. Het blok code onder de functie definitie moet inspringen.

Let erop dat Python je functie definitie moet hebben “gezien” voordat je de functie kunt aanroepen. Het is daarom de gewoonte dat functie definities bovenin een programma staan, meteen onder de import statements.

 

 

6.2.1 Hoe Python omgaat met functies

Om functies te kunnen creëren, moet je begrijpen hoe Python met functies omgaat. Bekijk het kleine Python programma hieronder.

Dit programma definieert één functie, die totZiens() heet. Deze functie heeft geen parameters. Het blok code behorende bij de functie heeft alleen een regel die de tekst “Tot ziens!” print.

De rest van het programma is geen deel van de functie. Het deel van de code van een programma dat niet bij een functie hoort, noemt men meestal het “hoofdprogramma” (Engels: “main program”). Het hoofdprogramma print de regel “Hallo!,” en roept daarna de functie totZiens() aan.

 

Als je dit programma uitvoert, zie je dat het eerst de regel “Hallo!” afdrukt, en daarna “Tot ziens!” Dit gebeurt zo ondanks het feit dat Python de code van boven naar beneden uitvoert; Python komt print( "Tot ziens!" ) tegen voordat print( "Hallo!" ) wordt aangetroffen. De reden dat Python toch eerst de tekst “Hallo!” afdrukt is dat Python de code van een functie alleen uitvoert als de functie wordt aangeroepen. Een functie die Python tegenkomt voordat de functie wordt aangeroepen, wordt alleen geregistreerd. Python onthoudt dat die functie bestaat, zodat hij kan worden uitgevoerd als het hoofdprogramma (of een andere functie) de functie aanroept.

6.2.2 Parameters en argumenten

Bekijk de code hieronder. De code definieert een functie hallo() met één parameter, naam geheten. De functie gebruikt naam in het blok code. Er is geen expliciete assignment die naam een waarde geeft. naam bestaat als variabele naam omdat het een parameter is van de functie.

Als een functie wordt aangeroepen, moet je een waarde geven aan iedere (verplichte) parameter die voor de functie gedefinieerd is. Zo’n waarde wordt een “argument” genoemd. Dus, om de functie hallo() aan te roepen, moet een argument waarde voor de parameter naam gespecificeerd worden. Je plaatst een argument tussen de haakjes van de functie aanroep. Merk op dat het niet nodig is dat je in het hoofdprogramma weet dat de parameter naam wordt genoemd in de functie. Hoe hij heet is niet belangrijk. Het enige wat je moet weten is dat er een parameter is die een waarde nodig heeft, en liefst ook de beperkingen die de functie oplegt aan de waarde (bijvoorbeeld het type parameter dat de schrijver van de functie wilt dat je meegeeft).

Parameters van een functie zijn niet meer en niet minder dan variabelen die je kunt gebruiken in de functie, en die hun (initiële) waarde krijgen van buiten de functie (namelijk via de functie aanroep). De parameters zijn “lokaal” voor de functie, dat wil zeggen, ze kunnen niet benaderd worden door code die niet in het blok code van de functie staat, noch kunnen ze waardes van variabelen buiten de functie beïnvloeden. Gebruik nooit dezelfde variabelen in je hoofdprogramma als in een functie om verwarring te vermijden.

Functies kunnen meerdere parameters hebben. Bijvoorbeeld, de volgende functie krijgt twee parameters en vermenigvuldigt hun waardes, waarna het resultaat wordt afgedrukt:

 

 

6.2.3 Default parameter waardes

Je kunt default waardes geven aan sommige parameters. Je doet dit door bij het specificeren van de parameter een assignment operator (=) en de gewenste waarde op te nemen, alsof het een reguliere assignment is. Als je de functie aanroept, mag je een waarde voor alle parameters opgeven, of slechts voor een aantal. De waardes worden aan de parameters gegeven van links naar rechts. Als je minder waardes opgeeft dan er parameters zijn, maar er default waardes gegeven zijn aan de parameters waarvoor je niks opgeeft, krijg je geen runtime fouten. Als je een functie definieert met default waardes voor een aantal parameters, maar niet voor alle parameters, dan is het de gewoonte om de parameters waarvoor je een default waarde opgeeft rechts te plaatsen van de parameters waarvoor je geen default waarde hebt.

Als je de default waarde van een specifieke parameter wilt vervangen, en je kent de naam van de parameter maar je weet niet waar hij staat in de parameter-orde, of je wilt simpelweg de default waardes van de overige parameters intact laten, dan kun je in de aanroep van de functie deze specifieke parameter overschrijven door een assignment aan de parameter op te nemen tussen de haakjes, dus <functie>( <parameternaam>=<waarde> ).

De volgende code geeft voorbeelden van deze mogelijkheden:

6.2.4 return

Parameters worden gebruikt om informatie van buiten de functie naar de functie toe te communiceren. Vaak wil je ook informatie vanuit de functie naar het programma buiten de functie toe communiceren. Daartoe dient het commando return.

Als Python return tegenkomt in een functie, beëindigt dat de functie.

Python gaat dan verder met de code vlak na de plek waar de functie werd aangeroepen. Je mag achter het woord return nul, één, of meerdere waardes of variabelen opnemen. Deze waardes worden dan gecommuniceerd naar het programma buiten de functie. Als je de waardes wilt gebruiken, moet je zorgen dat ze in een variabele terecht komen. Dat krijg je voor elkaar door de functie-aanroep te doen als een assignment naar een variable.

Bijvoorbeeld, stel dat een functie wordt aangeroepen als <variabele> = <functie>(). De functie maakt een berekening, die wordt opgeslagen in een <resultaat_variabele>. Het commando return <resultaat_variabele> beëindigt de functie, waarna de waarde die in <resultaat_variabele> staat “uit de functie komt.” Omdat <functie>() was aangeroepen via een assignment, komt de waarde van <resultaat_variabele> uiteindelijk terecht in <variabele>.

Het lijkt ingewikkeld, maar het wordt waarschijnlijk duidelijk als je het volgende voorbeeld bestudeert:

 

De functie pythagoras() berekent de wortel van de som van de kwadraten van de parameters. De uitkomst wordt via een return statement geretourneerd. Het hoofdprogramma “vangt” de waarde door het toekennen van de waarde aan de variabele c. Daarna wordt de inhoud van c geprint.

6.2.5 Het verschil tussen return en print

Je stelt je misschien de vraag wat het verschil is tussen een functie die een waarde retourneert, en een functie die een waarde print.

 

Vergelijk de volgende twee stukken code:

en

Zowel de functie print3() als de functie return3() worden aangeroepen in hun respectievelijke hoofdprogramma’s, en beide resulteren in het printen van de waarde 3. Het verschil is dat bij print3() dit printen gebeurt in de functie en de functie niks retourneert, terwijl bij de functie return3() de waarde 3 wordt geretourneerd, en geprint in het hoofdprogramma. Voor de gebruiker lijkt er geen verschil te zijn: beide programma’s printen 3. Voor een programmeur zijn beide functies echter compleet verschillend.

Merk ook op dat bij print3() de tekst "na 3 komt 4" ook wordt getoond. Wordt de tekst "komt 4 na 3?" ook getoond bij return3()?

De functie print3() kan voor slechts één doel gebruikt worden, namelijk het tonen van het getal 3. De functie return3() kan echter gebruikt worden waar je ook maar het getal 3 nodig hebt: om het te tonen, om het te gebruiken in een berekening, of om het aan een variabele toe te kennen. Bijvoorbeeld, de volgende code verheft 2 tot de macht 3 en print de uitkomst:

De code hieronder, echter, geeft een runtime error:

 

De reden is dat hoewel print3() het getal 3 op het scherm toont (je ziet het boven de runtime error als je de code uitvoert), het niet de waarde 3 produceert op een manier dat een berekening er gebruik van kan maken. De functie print3() geeft de speciale waarde None, en die kan niet in een berekening gebruikt worden.

Dus als je een functie wilt maken die een waarde oplevert die elders in je code gebruikt moet worden, dan moet die functie de waarde middels een return retourneren. Als je een functie wilt maken die informatie toont, dan kun je dat gewoon doen middels print statements in de functie, en hoeft de functie niets te retourneren.

  • Het arrangement Module 6: Functies is gemaakt met Wikiwijs van Kennisnet. Wikiwijs is hét onderwijsplatform waar je leermiddelen zoekt, maakt en deelt.

    Auteur
    Katleen Trio
    Laatst gewijzigd
    2025-03-17 09:33:06
    Licentie

    Dit lesmateriaal is gepubliceerd onder de Creative Commons Naamsvermelding-GelijkDelen 4.0 Internationale licentie. Dit houdt in dat je onder de voorwaarde van naamsvermelding en publicatie onder dezelfde licentie vrij bent om:

    • het werk te delen - te kopiëren, te verspreiden en door te geven via elk medium of bestandsformaat
    • het werk te bewerken - te remixen, te veranderen en afgeleide werken te maken
    • voor alle doeleinden, inclusief commerciële doeleinden.

    Meer informatie over de CC Naamsvermelding-GelijkDelen 4.0 Internationale licentie.

    Aanvullende informatie over dit lesmateriaal

    Van dit lesmateriaal is de volgende aanvullende informatie beschikbaar:

    Toelichting
    De basisvaardigheden van programmeren met Python.
    Eindgebruiker
    leerling/student
    Moeilijkheidsgraad
    gemiddeld
  • Downloaden

    Het volledige arrangement is in de onderstaande formaten te downloaden.

    Metadata

    LTI

    Leeromgevingen die gebruik maken van LTI kunnen Wikiwijs arrangementen en toetsen afspelen en resultaten terugkoppelen. Hiervoor moet de leeromgeving wel bij Wikiwijs aangemeld zijn. Wil je gebruik maken van de LTI koppeling? Meld je aan via info@wikiwijs.nl met het verzoek om een LTI koppeling aan te gaan.

    Maak je al gebruik van LTI? Gebruik dan de onderstaande Launch URL’s.

    Arrangement

    IMSCC package

    Wil je de Launch URL’s niet los kopiëren, maar in één keer downloaden? Download dan de IMSCC package.

    Voor developers

    Wikiwijs lesmateriaal kan worden gebruikt in een externe leeromgeving. Er kunnen koppelingen worden gemaakt en het lesmateriaal kan op verschillende manieren worden geëxporteerd. Meer informatie hierover kun je vinden op onze Developers Wiki.