Met een functie kun je code gebruiken dat een ander voor je geschreven heeft. Functies hebben we al eerder gebruikt, bijvoorbeeld bij het positief maken van een getal:
positief_getal = abs( -4 ) print( positief_getal )
Iemand anders heeft de code voor abs
geschreven. Die functie kun je nu zelf gebruiken zonder dat je hoeft te weten hoe het precies geprogrammeerd is. Programmeren is lastig. Het is daarom fijn als er sommige details zijn waar je niet over na hoeft te denken. Daarnaast maakt het gebruik van functies je code overzichtelijk, en kun je makkelijk code hergebruiken. In deze les ga je leren om je eigen functies te schrijven.
We gaan nu uitgebreider in op wat een functie precies is en hoe het werkt.
Een functie is een blok herbruikbare code dat een bepaalde actie uitvoert. Om een functie aan te roepen (gebruiken) moet je drie dingen weten:
Een functie kan gezien worden als een taak dat je aan iemand uitbesteed. Je roept een commando, geeft bepaalde informatie dat nodig hebben om de taak uit te voeren, en die persoon levert iets op (soms een getal of tekst, soms een dienst).
max
We geven een voorbeeld van een functie en bespreken de functienaam, parameters en retourwaarde.
Wil je het grootste getal van een rijtje getallen weten, dan roep je de functie max
aan. Als je iemand vraagt om de grootste van een rijtje getallen voor je te bepalen, dan heeft die persoon als extra informatie het rijtje getallen nodig waarvan je de grootste wilt weten. Dat rijtje getallen zijn de parameters. Als resultaat wordt er een getal als antwoord geroepen. Dat resultaat moeten we zelf meteen opslaan anders vergeten we die.
grootste = max( -4, 2, 6 )Voor de code hierboven is:
max
-4, 2, 6
. Dit is het rijtje getallen waarvan de grootste bepaald moet worden.max
dat we opslaan als grootste
.Sommige functies hebben parameters (informatie) nodig. De parameters geef je tussen de haakjes mee. Hier volgen wat voorbeelden:
positief_getal = abs( -5 ) # maak van het gegeven getal een positief getal
print( "hallo" )
print()
kan ook aangeroepen worden zonder parameter:print() #print een nieuwe regel
pow()
krijgt twee parameters, en rekent de waarde uit van de eerste tot de macht van de tweede:
basis = 2 exponent = 3 antwoord = pow( basis, exponent ) # bereken 2 tot de macht 3 print( antwoord )
Een functie kan wat opleveren of teruggeven, dit noemen we de retour waarde. Deze waarde wordt niet zomaar vanzelf onthouden. Het resultaat van een functie moet je daarom meteen opslaan.
In het voorbeeld hieronder levert de functie max
het getal 6 op. Deze retourwaarde slaan we op in de variabele grootste
. Bij de aanroep van zo'n functie moet je dus altijd een '='-teken gebruiken met aan de linkerkant een variabele waarin de retourwaarde opgeslagen wordt.
grootste = max( -4, 2, 6 )
Niet alle functies leveren iets op, bijvoorbeeld print()
'doet iets'. Die levert geen getal of tekst op, maar een dienst. Dan hoeven we ook niks op te slaan en kunnen we het aanroepen zonder een '='-teken.
Hieronder staat code. Geef voor elk van de volgende termen een voorbeeld uit de code:
afgerond = round(3.14342, 2) #afronden op 2 cijfers achter de komma
VIDEOUITLEG over maken van eigen functies
Je kunt ook zelf een functie schrijven. Dan moet je bedenken hoe die heet, wat de parameters zijn en wat het oplevert. In het algemeen ziet dat er zo uit:
def functieNaam ( parameter1_naam, parameter2_naam ): actie() return .. # als de functie iets oplevert, gebeurt dit pas aan het einde
berekenOppervlakte
def
geef je aan dat het om een definitie gaat. Daarna volgen de parameter(s) en een ':'. De code dat bij een functie hoort staat daaronder ingesprongen.
Voor de overzichtelijkheid zet je functiedefinities bij elkaar bovenaan de code.
#FUNCTIEDEFINITIE
def totZiens():
print( "..en dan..")
print( "tot ziens!" )
#HOOFDPROGRAMMA MET AANROEP VAN FUNCTIE
print( "Hallo!" )
totZiens()
print( "Klaar! ")
De code is opgebouwd uit twee delen:
def
): Dit programma heeft één functie, namelijk totZiens()
(regel 2). Deze functie heeft geen parameters (er staat niets tussen de haakjes). De twee ingesprongen regels horen bij de functie (regels 3 en 4). Hieronder zie je een stroomdiagram voor het hoofdprogramma.
De code van een functie wordt niet zomaar uitgevoerd, dat gebeurt pas als totZiens()
in het hoofdprogramma aangeroepen wordt.
Bekijk het volgende filmpje voor extra uitleg over functies:
We bekijken nu de volgorde waarin code met functies uitgevoerd wordt.
Doorloop de bovenstaande code stapsgewijs door op het icoontje met de kleinere Play-knop te drukken:
totZiens()
aangeroepen (regel 8).
totZiens()
(regel 2).
In de code hieronder staat een functiedefinitie voor het tekenen van een vierkant. Jouw opdracht is om dit te gebruiken om de bovenstaande afbeelding met 2 vierkantjes te maken. Maak de afbeelding door in het hoofdprogramma:
tekenVierkant()
aan te roepen
tekenVierkant()
nog eens aan te roepen.
</ol>
Voor regelnummers: klik op de balk boven de code en dan op 'L'.
import turtle
### FUNCTIEDEFINITIE
#Definitie: Instructies voor het tekenen van een vierkant met grootte van 20
def tekenVierkant( ):
turtle.forward( 20 )
turtle.right(90)
turtle.forward( 20 )
turtle.right(90)
turtle.forward( 20 )
turtle.right(90)
turtle.forward( 20 )
turtle.right(90)
### HOOFDPROGRAMMA MET AANROEP VAN FUNCTIE
turtle.pendown()
#Stap1: roep hier de functie aan voor tekenen van vierkant
#Stap2: draai rechts 45 graden
#Stap3: roep hier de functie aan voor tekenen van vierkant
turtle.done()
TekenSnoep()
De code hieronder tekent een lolly, dat gebeurt zo:
Ieder blok code heeft zijn eigen taak. Het is daarom logisch om hier twee functies van te maken:
tekenSnoep()
tekenStok()
Jouw opdracht:
def tekenSnoep():
voor het tekenen van de snoep (dus voor de code regels 6 t/m 9).
tekenSnoep()
aan in het hoofdprogramma.
tekenStok()
van het tekenen van de stok.
tekenStok()
aan in het hoofdprogramma.
import turtle
#### FUNCTIEDEFINITIES
# code voor het tekenen van de snoep:
turtle.fillcolor("red")
turtle.begin_fill()
turtle.circle(30)
turtle.end_fill()
# code voor het tekenen van de stok:
turtle.right(90)
turtle.forward(100)
### HOOFDPROGRAMMA
turtle.pendown()
#roep hier je functie tekenSnoep() aan
#roep hier je functie tekenStok() aan
turtle.done()
Het grote voordeel van gebruik maken van functies is dat het hoofdprogramma nu duidelijk samenvat wat de code als geheel doet, zonder dat je naar allerlei code details hoeft te kijken. Dat zie je in de code van je vorige opdracht ook: in het hoofdprogramma wordt de pen neergezet, snoep getekend en daarna het stokje:
Dit leest als een soort inhoudsopgave van een boek. Als je details wilt zien ga je naar de bijbehorende functiedefinitie. Als je bijvoorbeeld wilt zien hoe groot de snoep precies getekend wordt, kun je naar de code van tekenSnoep())
gaan.
#HOOFDPROGRAMMA
turtle.pendown()
tekenSnoep()
tekenStok()
turtle.done()
Dit leest als een soort inhoudsopgave van een boek. Als je details wilt zien ga je naar de bijbehorende functiedefinitie. Als je bijvoorbeeld wilt zien hoe groot de snoep precies getekend wordt, kun je naar de code van tekenSnoep()) gaan.
Een functie bij het programmeren is net als een functie die iemand heeft in een bedrijf: ze moeten iets doen. Soms moet die persoon informatie van je hebben om zijn werk goed te doen (invoer). Soms levert het een concreet product op (iemand maakt iets voor je), en soms een dienst op (iemand doet iets voor je). Neem de bakker bijvoorbeeld:
Je hebt verschillende soorten functies:
return
een concrete retourwaarde op). Soms heeft iemand specifiek informatie om iets te doen, en geeft je ook iets terug (een resultaat) waar je daarna iets mee kan doen. Bijvoorbeeld de loketmedewerker bij een geldwisselkantoor: je geeft haar Euro’s omdat je Dollars nodig hebt voor je vakantie in Amerika, ze berekent hoeveel Dollars die Euro’s waard zijn, en geeft je Dollars terug.return
een concrete retourwaarde): Soms heeft iemand geen specifiek informatie nodig om iets te doen, maar geeft je wel iets terug (een resultaat) waar je daarna iets mee kan doen. Bijvoorbeeld een verkeersregelaar, die geeft aanwijzingen wat je moet doen.We bekijken nu specifieke voorbeelden van functies met en zonder parameters (hierboven, de eerste twee). In het volgende hoofdstuk kijken we naar retourwaarden (hierboven, de onderste twee).
Code dat bij elkaar hoort of dat vaker gebruikt wordt, zet je samen in een functie. Soms heeft een functie geen parameters, omdat deze geen specifieke informatie nodig heeft. Soms levert een functie geen retourwaarde op, maar "doet het iets".
Bekijk het voorbeeld hieronder. De 5 regels code voor het tekenen van een driehoek horen bij elkaar omdat ze samen een doel bereiken, daarom staan ze bij elkaar in een functie tekenDriehoek()
. Deze functie heeft geen parameters (er staat niets tussen de haakjes) en ook geen retourwaarde (het levert niks op, maar het doet iets).
import turtle
#FUNCTIEDEFINITIE
def tekenDriehoek():
turtle.forward(50)
turtle.right(120)
turtle.forward(50)
turtle.right(120)
turtle.forward(50)
#HOOFDPROGRAMMA MET FUNCTIEAANROEP
turtle.pendown()
tekenDriehoek()
tekenFiguur()
doet. Wat zou een betere naam voor de functie zijn?
tekenFiguur()
informatie nodig om zijn werk te doen, oftewel, krijgt hij parameters mee?
tekenFiguur()
informatie op (dat bijvoorbeeld later in het programma nog gebruikt kan worden), oftewel, heeft tekenFiguur()
een code regel met return
?
tekenFiguur()
aan op regel 16, dus na turtle.right(135)
.
tekenFiguur()
niet in een functie had gestaan, hoe vaak had je dan turtle.forward(50)
moeten intikken om hetzelfde resultaat te krijgen?
</ol>
Run de code om je vermoedens te controleren.
import turtle
### FUNCTIEDEFINITIE
def tekenFiguur():
turtle.forward(50)
turtle.right(120)
turtle.forward(50)
turtle.right(120)
turtle.forward(50)
### HOOFDPROGRAMMA MET FUNCTIEAANROEP
turtle.pendown()
tekenFiguur()
turtle.right(135)
turtle.done()
Heb je code dat je vaker gebruikt, maar er telkens iets anders uit ziet? Dan kan je met parameters aangeven wat er in de functie anders moet.
Stel tekenDriehoek()
moet steeds een ander kleur gebruiken. De functie tekenDriehoek()
moet de kleur weten. De kleur geef je als parameter (extra informatie) mee:
tekenDriehoek( "red" )
(regel 14).
kleur
(regel 3). In de functie zelf wordt elke voorkomen van kleur
, vervangen door "red"
, bijvoorbeeld op regel 4.
import turtle
#FUNCTIEDEFINITIE
def tekenDriehoek( kleur ):
turtle.pencolor( kleur )
turtle.forward(50)
turtle.right(120)
turtle.forward(50)
turtle.right(120)
turtle.forward(50)
#HOOFDPROGRAMMA MET FUNCTIEAANROEP
turtle.pendown()
tekenDriehoek( "red" )
turtle.done()
Hieronder zie je de functie tekenCirkel( kleur )
die als extra informatie (parameter) een kleur meekrijgt. Run de code.
Breid de code uit zodat ook de grootte van de cirkel meegegeven wordt:
def tekenCirkel( kleur, grootte ):
grootte
import turtle
### FUNCTIEDEFINITIE
#tekent een cirkel, en krijgt als informatie (parameter) de kleur mee
def tekenCirkel( kleur ):
turtle.pencolor( kleur )
turtle.circle( 50 )
### HOOFDPROGRAMMA
tekenCirkel( "blue" )
turtle.done()
Pas de functiedefinitie aan zodat naam en land meegegeven wordt, en dat informatie gebruikt wordt voor het afdrukken van de persoonlijke groeten.
### FUNCTIEDEFINITIE
groet( ):
print( "Hallo!" )
### HOOFDPROGRAMMA MET AANROEP VAN FUNCTIE
groet( "Sebas", "Spanje" )
groet( "John", "Engeland" )
groet( "Janneke", "Nederland" )
Functies mogen andere functies aanroepen. Bijvoorbeeld, hieronder zie je hoe de functie tekenLolly()
(regel 17) de functies tekenSnoep()
en tekenStok()
gebruikt om de lolly als geheel te tekenen:
import turtle
#FUNCTIEDEFINITIES
#teken snoep
def tekenSnoep( straal, kleur ):
turtle.fillcolor( kleur)
turtle.begin_fill()
turtle.circle( straal )
turtle.end_fill()
#teken stok
def tekenStok( lengte_stok ):
turtle.right(90)
turtle.forward( lengte_stok )
#tekent lolly
def tekenLolly( straal, kleur, lengte_stok ):
tekenSnoep( straal, kleur )
tekenStok( lengte_stok ) #andere functie wordt aangeroepen om stok te tekenen
#HOOFDPROGRAMMA
turtle.pendown()
tekenLolly(40, "blue", 100 ) #parameters: straal, kleur, lengte_stok)
turtle.done()
Code wordt leesbaarder door:
isEven()
bepaalt of een getal even of oneven is, maar doet verder helemaal niks! Anders wordt het namelijk moeilijker om over je code te redeneren
Commentaar is bedoeld om code toe te lichten. Commentaar geef je aan met een #
. Python negeert deze tijdens de uitvoering. Commentaar is niet alleen nuttig voor anderen die je code lezen, maar ook voor jezelf, aangezien je soms je eigen code later nog moet wijzigen. Gebruik het dus om blokken code samen te vatten, ingewikkelde code uit te leggen, of als je een bestaande functie voor het eerst gebruikt, uit te leggen wat het doet.
#Deze functie heeft als doel om ....
def doeIets():
print( "Iets..." ) # Dit is commentaar
Het idee achter een functie is dat de gebruiker van de functie de code van de functie niet hoeft te kennen. Functiecommentaar schrijf je boven ieder functiedefinitie. Met functiecommentaar geef je aanwijzingen over het gebruik van je functie:
Bijvoorbeeld:
### FUNCTIEDEFINITIE
#Doel: rekent aantal kilometers (groter of gelijk aan 0) om naar meters
#Invoer: kilomters, als int of float
#Uitvoer: meters, als int of float (zelfde type als de invoer)
def rekenKmNaarMeters(afstand_in_km):
afstand_in_m = afstand_in_km * 1000
return( afstand_in_m )
### HOOFDPROGRAMMA MET AANROEP VAN FUNCTIE
aantal_meters = rekenKmNaarMeters( 4 )
print( aantal_meters
Je kunt commentaar ook goed gebruiken om de oorzaak van fouten in je code op te sporen. Met #
kan je een regel in commentaar zetten. Die doet dan niet meer mee aan het programma, en kun je uitsluiten dat de regel een fout veroorzaakt. Ook kun je meerdere regels in commentaar zetten en regel-voor-regel de commentaar weg halen om zo te ontdekken wat de fout veroorzaakt.
Tip: meerdere regels in één keer in commentaar:
/
om de geselecteerde regels allemaal in één keer in commentaar te zetten.
/
, het hele programma uit commentaar.
### FUNCTIEDEFINITIE
en ### HOOFDPROGRAMMA
.
# def rekenKmNaarMeters(afstand_in_km):
# afstand_in_m = afstand_in_km * 1000
# return( afstand_in_m )
# aantal_meters = rekenKmNaarMeters( 4 )
# print( aantal_meters )
Ik kan:
def
's worden overgeslagen en de code in het hoofdprogramma als eerste wordt uitgevoerd./
meerdere regels code in één keer in (of uit) commentaar te zetten.De code hieronder (uit opgave 5.3.2) tekent een lolly: rode snoep met een zwart stokje.
We willen de gebruiker vragen welke kleur gewenst is, hoe groot de lolly moet zijn en hoe lang het stokje moet zijn.
Pas je code stapsgewijs aan en test steeds tussendoor!
tekenSnoep
(op regel 5) aan zodat deze een kleur verwacht.
"red"
.
tekenSnoep
(in je hoofdprogramma) aan zodat de gewenste kleur meegegeven wordt.
Breid je code dan uit voor de gewenste straal van de snoep. Test je programma. Tip: de invoer moet je omzetten naar een int
.
Als dat werkt, vraag je de gebruiker ook hoe lang het stokje moet zijn.
Teken de gewenste lolly.
import turtle
### FUNCTIEDEFINITIES
#teken snoep
def tekenSnoep( ):
turtle.fillcolor("red")
turtle.begin_fill()
turtle.circle( 40 )
turtle.end_fill()
#teken stok
def tekenStok( ):
turtle.right( 90 )
turtle.forward( 100 )
### HOOFDPROGRAMMA
turtle.pendown()
tekenSnoep()
tekenStok()
turtle.done()
Schrijf een programma dat, in kleur, de olympische ringen tekent.
Hier zijn de gegevens van elk van de 5 cirkels:
Bedenk dat je steeds een cirkel wilt tekenen, maar op een ander coördinaat met een ander kleur. Om dit voor elkaar te krijgen schrijf je een functie tekenGekleurdeRing()
die 3 parameters als informatie meekrijgt: de kleur, de x-coördinaat en de y-coördinaat.
Tips:
turtle.setposition(x,y)
kun je turtle naar coördinaat (x,y) laten lopen
turtle.circle(50)
kun je een cirkel met straal 50 laten tekenen
turtle.pencolor("red")
kun je een penkleur aangeven
import turtle
### FUNCTIEDEFINITIE:
### HOOFDPROGRAMMA:
turtle.done()
Schrijf een functie die een getal als parameter krijgt en afdrukt of deze kleiner is dan 0, gelijk is aan 0, of groter is dan 0.
Dus, als je functie het getal 2 meekrijgt (bv. checkGetal(2)
) moet de functie afdrukken: "Het getal 2 is groter dan 0."
Test je functie. Welke testgevallen zijn geschikt om te testen of je functie altijd goed werkt? Tip: Er zijn minstens drie testgevallen, dus je roept je functie minstens drie keer aan om te testen.
### FUNCTIEDEFINITIE
# typ hier je functie
### HOOFDPROGRAMMA MET AANROEP VAN FUNCTIE
# typ hier je functie aanroep
import turtle
### FUNCTIEDEFINITIES
def tekenCirkel():
turtle.circle(50)
def tekenDriehoek():
for i in range(3):
turtle.forward(100)
turtle.right(120)
def tekenVierkant():
for i in range(4):
turtle.forward(100)
turtle.right(90)
### HOOFDPROGRAMMA
print("Wat wil je dat ik teken: cirkel, vierkant, driehoek, of allemaal.")
print("Klaar")
turtle.done()
Heb je 40 punten gehaald, dan is je cijfer een 7.
Schrijf een functie berekenCijfer( aantal_punten )
dat, gegeven het aantal behaalde punten, je cijfer uitrekent en print. In je hoofdprogramma roep je de functie aan. Test je code met verschillende waarden. Hoeveel punten moet je halen voor een 10? En wat is je cijfer als je 0 punten scoort?
tekenMuren()
: voor het tekenen van de muren
tekenDak()
: voor het tekenen van het dak
tekenHuis()
voor het tekenen van een huis:
def ...
(maak zelf verder af)
tekenMuren()
en tekenDak()
aan. Tip: let erop dat je inspringt.
tekenHuis()
al aangeroepen. Test of het werkt.
tekenHuis()
een aantal keer achter elkaar aan (in het hoofdprogramma).
Tussendoor verplaats je de startpunt voor het tekenen met turtle.setposition(x, y)
waarbij je voor x en y coördinaat kiest, bijvoorbeeld turtle.setposition(250, 0)
.
Met turtle.setheading(0)
zorg je dat de pen in de juiste startrichting staat (naar rechts)
Met turtle.penup()
zorg je dat er tussendoor geen lijntje wordt getekend. Wil je weer tekenen, gebruik dan weer turtle.pendown()
.
import turtle
### FUNCTIEDEFINITIES
#Tekent zwarte vierkant
def tekenMuren():
turtle.forward(150)
turtle.right(90)
turtle.forward(150)
turtle.right(90)
turtle.forward(150)
turtle.right(90)
turtle.forward(150)
#Tekent een rood gevulde dak
def tekenDak():
turtle.fillcolor("red")
turtle.begin_fill()
turtle.right(30)
turtle.forward(150)
turtle.right(120)
turtle.forward(150)
turtle.end_fill()
### HOOFDPROGRAMMA
tekenHuis()
turtle.done()
Hieronder staat de tekst van het kinderlied De wielen van de bus. Zoals je ziet is er best veel herhaling. Elk couplet lijkt veel op de vorige, alleen het onderdeel en de bijbehorende actie is anders.
zingCouplet()
dat de eerste couplet afdrukt. Hiervoor gebruik je vier keer een print()
: een print()
per tekstregel.
zingCouplet
aan zodat die twee parameters meekrijgt: een onderdeel
en actie
.
onderdeel
, en draaien rond vervang je door actie
.
zingCouplet( "wielen", "draaien rond" )
.
zingCouplet()
een paar keer aan, telkens met andere parameters aan voor de volgende drie coupletten.
</ol>
Tip: Een lege regel druk je af met print( "\n" )
. Bedenk waar je dat het handigst kan doen. Je hoeft je niet druk te maken om hoofdletters.
De wielen van de bus draaien rond
Draaien rond, draaien rond
De wielen van de bus draaien rond
Als de bus gaat rijden
De deuren van de bus gaan open en dicht
Gaan open en dicht, gaan open en dicht
De deuren van de bus gaan open en dicht
Als de bus gaat rijden
De wissers van de bus gaan heen en weer
Gaan heen en weer, gaan heen en weer
De wissers van de bus gaan heen en weer
Als de bus gaat rijden
De lichten van de bus gaan aan en uit
Gaan aan en uit, gaan aan en uit
De lichten van de bus gaan aan en uit
Als de bus gaat rijden