Python Cursus. Hoofdstuk 5 - Bestaande Functies
Meteen naar de Afsluitende Opgaven over Bestaande Functies
Terug naar de cursus pagina
In de voorgaande hoofdstukken is al gesproken over een aantal basis “functies,” zoals print()
en int()
. In dit hoofdstuk worden deze functies in meer detail besproken, en zullen een aantal nieuwe handige functies besproken worden. Later leer je zelf eigen functies kunt maken.
Elementen van een functie
Een functie is een blok herbruikbare code dat een bepaalde actie uitvoert. Om een functie aan het werk te zetten, roep je hem aan (Engels: “call”), met de parameters als de functie nodig heeft. Je hoeft slechts drie dingen te weten:
- De naam van de functie
- De parameters die de functie nodig heeft (als die er zijn)
- De waarde die de functie teruggeeft (als er zo’n waarde is)
Ik ga deze elementen één voor één bespreken.
Functie naam
Iedere functie heeft een naam. Net als variabele namen, mogen functie namen alleen bestaan uit letters, cijfers, en underscores, en mogen ze niet starten met een cijfer. Vrijwel alle standaard Python functies bestaan alleen uit kleine letters. Gewoonlijk is de naam van een functie een korte beschrijving van wat de functie doet.
Als je in een tekst refereert aan een functie, is het de gewoonte dat je achter de naam van de functie een openings- en sluithaakje zet, omdat functies in code altijd die haakjes hebben (zelfs al staat er niks tussen de haakjes).
Parameters
Sommige functies worden aangeroepen met parameters (“argumenten”), die meestal verplicht zijn. De parameters worden geplaatst tussen de haakjes die achter de functienaam staan. Als er meerdere parameters zijn, moet je er komma’s tussen zetten.
De parameters zijn de waardes die de programmeur aan de functie geeft om te verwerken. Bijvoorbeeld, de functie int()
wordt aangeroepen met één parameter, namelijk de waarde waarvan de functie probeert een integer representatie te maken. De print()
functie mag worden aangeroepen met een willekeurig aantal parameters (zelfs nul), die de functie op het scherm zal tonen, waarna de functie naar een nieuwe regel op het scherm zal gaan.
Over het algemeen is het zo dat een functie de waardes van de parameters niet kan wijzigen. Bekijk bijvoorbeeld de volgende code:
Als je deze code uitvoert, zie je dat int()
niet de waarde van x
heeft aangepast; de functie heeft alleen aan print()
doorgegeven wat de integer representatie van de waarde van x
is. De reden dat dit zo is, is dat over het algemeen alleen de waarde van parameters wordt doorgegeven (Engels: “passed by value”). Dit betekent dat de functie geen toegang heeft tot de variabelen die als parameters gebruikt worden, maar dat de functie kopieën krijgt van de waardes die in de parameters staan. Ik zeg “over het algemeen” omdat dit niet geldt voor alle data types, maar het geldt in ieder geval voor de data types die tot op dit moment bediscussieerd zijn. Pas in hoofdstuk 12 ga ik spreken over data types die wel door functies gewijzigd kunnen worden, en op dat moment zal ik dat heel duidelijk maken.
Als een functie meerdere parameters krijgt, maakt de volgorde uit. Bijvoorbeeld, de standaard functie pow()
krijgt twee parameters, en rekent de waarde uit van de eerste die wordt verheven tot de macht weergegeven door de tweede.
Welke namen je aan de variabelen geeft, hier 'basis' en 'exponent', maakt niet uit, de eerste wordt verheven tot de macht die de tweede is.
Retour waarde
Een functie heeft vaak een retour waarde. Als een functie een waarde retourneert, kun je die in je code gebruiken. Bijvoorbeeld, de int()
functie krijgt een parameter mee en retourneert een getal (een integer) op.
Zoals je hierboven kunt zien, kun je zelfs functie aanroepen als parameter meegeven aan een functie, bijvoorbeeld, in de laatste regel van de code hierboven krijgt de print()
functie als waarde een aanroep van de int()
functie mee. De aanroep van int()
vindt dan plaats voordat de print(
wordt afgehandeld, dus de return waarde van int()
is een parameter voor print()
.
Niet alle functies retourneren een waarde. Bijvoorbeeld, print()
geeft geen waarde terug. Als je niet uitkijkt, kan dit tot vreemd gedrag van je code leiden. Voer maar eens de volgende code uit:
Je ziet dat deze code twee regels print. De eerste bevat de tekst "Hello, world!" en de tweede het woord "None." Wat betekent dat woord ''None''? Om dat te begrijpen, moet je uitpluizen hoe Python deze regel code verwerkt.
Wanneer Python deze regel code bekijkt, ziet het eerst print( <iets> )
. Omdat <iets>
een argument is, moet dat eerst geëvalueerd worden. <iets>
is print( <nog_iets> )
. Omdat <nog_iets>
een argument is, moet Python dat eerst evalueren. <nog_iets>
is de string ''Hello, world!''
. Die hoeft niet verder geëvalueerd te worden, dus print()
wordt uitgevoerd met als argument ''Hello, world!''
, en Python “vangt” de retour waarde van deze uitvoering omdat die nodig is als <iets>
.
En daar is het probleem: print()
heeft geen retourwaarde, dus er is niks wat Python kan substitueren voor <iets>
. Voor dit soort situaties heeft Python een speciale waarde die None
heet. Dus het eerste print()
commando krijgt als argument None
mee, en dat leidt ertoe dat Python “None” op het scherm afdrukt.
None
is een speciale waarde die aangeeft "geen waarde". Als je None probeert af te drukken, drukt Python het woord None
af, maar dat is niet een string met de waarde ''None''. Het woord geeft slechts aan dat er niks af te drukken was. None
is niet hetzelfde als een lege string (''''
). Een lege string heeft nog steeds een waarde, namelijk een string met lengte nul. None
is geen string, geen float, geen integer, niks. Dus wees voorzichting met het aanroepen van een functie als parameter; als de functie geen retour waarde heeft, kunnen er vreemde dingen gebeuren.
Een functie is een zwarte doos
In de wereld van programmeurs betekent een “zwarte doos” iets waar je wat in kunt stoppen en wat uit kunt halen, maar waarvan je niet kunt zien hoe het van binnen werkt. Je mag een functie beschouwen als een zwarte doos: het is niet van belang te weten hoe de functie werkt of hoe de code in de functie eruit ziet. Slechts de naam, de parameters, en de retour waarde moet je kennen om de functie te kunnen gebruiken. Het zou kunnen dat de functie intern variabelen aanmaakt en berekeningen doet, maar die hebben geen effect op de rest van de code.
...Tenminste, als de functie netjes geïmplementeerd is. Een functie die geen effect heeft op de rest van de code heet een “pure functie.” Alle functies die ik hier bespreek zijn “pure functies.” Maar het feit dat er een aparte naam is voor functies die de rest van de code niet aantasten, geeft al aan dat er ook functies bestaan die niet “puur” zijn. Dit is het euidelijkst bij functies waar de gebruiker parameters aan mee geeft, waarbij de inhoud van de variabelen die als parameter worden meegegeven gewijzigd wordt. Dat kan niet voor iedere soort variabele. En als het gebeurt kan dat best acceptabel zijn, als het de bedoeling is en goed gedocumenteerd is. Zulke functies heten “modifiers.” Deze bespreken we in een later hoofdstuk.
Vooralsnog mag je aannemen dat iedere functie die je gebruikt, geen effect heeft op de rest van de code. Het is veilig om functies aan te roepen.
Opgave 5.1 Afronden
Klik hier voor de uitwerking.Basis functies
Je leert nu enkele basis functies die je in je programma’s kunt gebruiken.
Type casting
We hebben al geleerd over type casting functies in hoofdstuk 4. Dat gebruik je als je de type van een variabele wilt veranderen. We gaan daar nu uitgebreider op in.
float()
heeft één parameter en retourneert een floating-point representatie van de waarde van de parameter. Als de waarde een integer is, krijg je dezelfde waarde terug als float. Als de parameter een float is, krijg je dezelfde waarde terug. Als de parameter een string bevat die je als integer of float zou kunnen interpreteren, dan krijg je die float terug als waarde. Anders krijg je een runtime error.int()
heeft één parameter en retourneert een integer representatie van de waarde van de parameter. Als de waarde een integer is, krijg je dezelfde waarde terug. Als de waarde een float is, krijg je een integer terug die de waarde van de float naar beneden heeft afgerond. Als de parameter een string bevat die je als integer zou kunnen interpreteren, dan krijg je die integer terug als waarde. Anders krijg je een runtime error.str()
heeft één parameter en retourneert een string representatie van de waarde van de parameter.
Opgave 5.2.1 Type casting naar integer
Klik hier voor de uitwerking.Berekeningen
Een paar basis Python functies helpen met berekeningen.
abs()
krijgt een numerieke parameter waarde. Als de waarde positief is, wordt hij weer geretourneerd. Als de waarde negatief is, wordt de waarde vermenigvuldigd met-1
geretourneerd.max()
krijgt twee of meer numerieke parameters en retourneert de grootste.min()
krijgt twee of meer numerieke parameters en retourneert de kleinste.pow()
krijgt twee numerieke parameters en retourneert de eerste verheven tot de macht weergeven door de tweede. Optioneel mag je een derde parameter meegeven, die een integer moet zijn. Als je dat doet, krijg je de waarde modulo de derde parameter terug.round()
krijgt een numerieke parameter die wiskundig wordt afgerond. Optioneel mag je als tweede parameter een integer meegeven die aangeeft hoeveel cijfers achter de komma behouden moeten worden. Als de tweede parameter niet wordt meegegeven, wordt afgerond op gehele getallen.
Opgave 5.2.2 Berekeningen
len()
len()
is een basis functie die één parameter krijgt, en die de lengte van die parameter teruggeeft. Op dit moment is het enig zinvolle data type dat je mee kunt geven aan len()
een string, waarvan je dan de lengte krijgt. In latere hoofdstukken volgen meer data types waarvan je de lengte kunt bepalen.
Wat print de code hieronder? Controleer of je vermoeden klopt.
input()
In veel programma’s wil je dat de gebruiker van het programma data verstrekt. Je kunt de gebruiker vragen een string in te typen met behulp van de functie input()
. De functie krijgt één parameter mee, namelijk een string. Deze string is de zogeheten “prompt.” Als input()
wordt aangeroepen, wordt de prompt op het scherm gezet en mag de gebruiker een tekst ingeven. De gebruiker mag ingeven wat hij of zij wil, inclusief niks. De gebruiker sluit het ingeven af met een druk op de Enter toets. De retour waarde van de functie is hetgeen de gebruiker heeft ingegeven, exclusief de Enter.
Het hangt van de omgeving waar je je programma in draait hoe de gebruiker de ingave precies doet. Soms wordt er een rechthoek op het scherm getoond met de prompt ervoor waarin de gebruiker mag typen. Als je een Python programma draait op de commandline, moet de gebruiker ook de ingave op de command-line doen. Sommige editors tonen een popup-window waarin de gebruiker moet typen.
Hier is een voorbeeld:
Realiseer je dat input()
altijd een string teruggeeft. Bekijk de volgende code:
Het maakt niet uit wat je ingeeft, deze code geeft een runtime error. Omdat input()
een string teruggeeft, wordt op de tweede regel een poging gedaan twee strings met elkaar te vermenigvuldigen, en dat kan niet. Het maakt niet uit of je string een getal bevat: een string is een string. Je kunt het probleem oplossen middels type casting. Je maakt van de ingevoerde tekst eerst een int
. Bijvoorbeeld:
Voor deze code geldt dat als de gebruiker een getal ingeeft, de code doet wat hij moet doen. Maar als de gebruiker iets anders ingeeft, dat niet in een getal omgezet kan worden, krijg je toch weer een runtime error.
Opgave 5.2.4 Optelling en vermenigvuldiging met input()
print()
De functie print()
drukt af in de console. Deze kan op meerdere manieren aangeroepen worden, bijvoorbeeld, met of zonder parameters (iets tussen de haakjes):
- Met parameters: toont de parameters (wat tussen de haakjes meegegeven wordt) op het scherm (als het er meerdere zijn, met spaties ertussen), en gaat daarna naar de volgende regel. Dus als je twee print statements gebruikt, komt de output van de tweede onder die van de eerste te staan.
- Zonder parameters: drukt een lege regel af.
sep
als speciale parameter: wat er tussen twee parameters afgedrukt moet worden. Standaard is dat een spatie. Je kunt die spatie wijzigen in iets anders, bijvoorbeeld niks.end
als speciale parameter: wat er na alle parameters afgedrukt moet worden. Standaard is dat een nieuwe regel. Je kunt die nieuwe regel wijzigen in iets anders, bijvoorbeeld niks.
Om sep
en end
te gebruiken, moet je speciale parameters opnemen, namelijk parameters sep=<string>
en/of end=<string>
(merk op: als in een beschrijving van code je iets ziet dat tussen <
en >
staat, betekent dat meestal dat je dat niet letterlijk moet typen, maar moet vervangen door van wat de term tussen de <
en >
aangeeft, dus <string>
betekent dat je daar een string moet plaatsen).
Opgave 5.2.5 Print
Modules
Python biedt basis functies, waarvan er zojuist een aantal besproken zijn. Naast die basis functies heeft Python ook een groot aantal “modules”, met nog veel meer handige functies.
Om de functies van een module te gebruiken, moet je de juiste module importeren door boven in je programma import <modulenaam>
op te nemen, bijvoorbeeld import turtle
. Je kunt dan alle functies die in de betreffende module staan in je programma gebruiken, maar je moet de functie-aanroepen vooraf laten gaan door de naam van de module en een punt. Bijvoorbeeld, om de functie pendown()
uit de turtle
module, roep je turtle.pendown()
aan nadat je turtle
geïmporteerd hebt.
math
De math
module bevat een aantal nuttige wiskundige functies. Deze functies zijn meestal zeer efficiënt. Zie hier twee voorbeelden van functies:
sqrt()
levert de wortel van de parameter op.log()
levert het natuurlijk logaritme van de parameter op.log10()
levert het logaritme met10
als basis van de parameter op.
Opgave 5.3.1 Modules importeren
Klik hier voor de uitwerking.Random (willekeurige) getallen
De random
module bevat functies die toevalsgetallen genereren.
random()
krijgt geen parameters, en retourneert een toevalsgetal als een float binnen het bereik [0, 1), dat wil zeggen een bereik tussen nul en 1, waarbij 0.0 wel meedoet maar 1.0 niet.randint()
krijgt twee parameters, beide integers, waarbij de eerste kleiner dan of gelijk aan de tweede moet zijn. Het retourneert een toevalsgetal dat een integer is dat ligt binnen het bereik dat begrensd wordt door deze twee parameters, inclusief beide parameters. Bijvoorbeeld, randint(2, 5) retourneert 2, 3, 4, of 5, elk met een gelijke kans.
Opgave 5.3.2.1 Willekeurig getal tussen de 0 en 100
Deze opgave wordt niet automatisch gecontroleerd. Klik hier voor de uitwerking.OPTIONEEL Theorie 5.3.2 Modules met from
Als alternatief kun je ook specifieke functies vanuit een module importeren, via: from <module> import <functie1>, <functie2>, <functie3>, ...
Het voordeel van een dergelijke manier van functies importeren is dat je in je code niet de naam van de module voor de functie-aanroep hoeft te zetten.
Bijvoorbeeld:
import math print( math.sqrt( 4 ) )
is equivalent aan:
from math import sqrt print( sqrt( 4 ) )
Wat je geleerd hebt over Bestaande Functies:
In dit hoofdstuk is het volgende besproken:
- Wat functies zijn
- Functie namen
- Functie parameters
- Functie retourwaardes
- Details van type casting functies
float()
,int()
, enstr()
- Basis berekeningen met
abs()
,max()
,min()
,pow()
, enround()
- Het aantal letters in een woord berekenen met
len()
- De gebruiker vragen iets in te voeren met
input()
- Details van de
print()
functie - Wat modules zijn
- De math functies
exp()
,log()
,log10()
, ensqrt()
- De random functies
random()
,randint()
, en (optioneel)seed()
Meteen naar de Afsluitende Opgaven over Bestaande Functies
Terug naar de cursus pagina