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:

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.

Opgave 5.2.1 Type casting naar integer

Klik hier voor de uitwerking.

Berekeningen

Een paar basis Python functies helpen met berekeningen.

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):

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:

Opgave 5.3.1 Modules importeren

Klik hier voor de uitwerking.

Random (willekeurige) getallen

De random module bevat functies die toevalsgetallen genereren.

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:


Meteen naar de Afsluitende Opgaven over Bestaande Functies
Terug naar de cursus pagina