Eigen Functies Verdieping
Let op: log eerst in bij repl.it, en druk in je browser of 'F5' (verversen)Terug naar de eerste uitleg over Eigen Functies
Terug naar de cursus pagina
In hoofdstuk 8 Eigen Functies heb je geleerd over wat functies zijn en hoe je ze kunt gebruiken. Functies gebruik je voor.:
- Decompositie: Een (complexe) probleem opdelen in kleinere stukken om het makkelijker op te lossen. Ieder stuk ontwikkel en test je los van de rest op. De code kun je dan later gebruiken zonder er verder over na te denken.
- Hergebruik: Met functies kun je een bepaalde stuk code op meerdere plekken in je programma gebruiken. Je kunt dan beter verwijzen naar waar de code staat (de functie) dan het te kopiëren. Ook kun je dan code aan andere programmeurs beschikbaar stellen (via modules).
- Abstractie: Met parameters kun je de code voor meerdere toepassingen gebruiken, en wordt het ook makkelijker te lezen en te onderhouden.
- Overzichtelijkheid: Met functies kun je lange code opsplitsen en daardoor overzichtelijker maken.
Omdat ze zo ontzettend belangrijk zijn, gaan we er nog wat mee oefenen.
Verschillende soorten functies - met en zonder parameters en retourwaarden
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:
- Wat doet de bakker? Hij bakt brood.
- Welk informatie heeft de bakker van je nodig? Hij moet weten welk brood je wilt, en bijvoorbeeld of je een hele of een halve brood wil. Dit informatie geef je aan de bakker.
- Wat geeft de bakker jou? De bakker levert een brood op dat hij aan jou geeft.
- Geef je geen informatie aan (dus zonder parameters), en geeft niets terug (dus levert geen retourwaarde op): Soms kan iemand iets doen zonder dat hij of zij daar specifiek informatie voor nodig heeft, en zonder dat het echt een tastbare retourwaarde (of resultaat) oplevert. Bijvoorbeeld de buschauffeuse: ze rijdt rondjes en stopt op vaste locaties, je stapt in de bus, je hoeft haar niet te vertellen waar ze heen (geen parameters) moet rijden en ze geeft jou ook niets (levert geen concrete resultaat op).
- Geef je wel informatie aan (dus met parameters), maar geeft niets terug (dus levert geen retourwaarde op): Soms heeft iemand specifiek informatie om iets te doen, maar het hoeft niet per se een tastbare retourwaarde (of resultaat) op te leveren. Bijvoorbeeld de bibliothecaresse die boeken inneemt, je geeft haar jouw boeken, zei registreert dat je ze in hebt geleverd en zet op de juiste plek terug in de bibliotheek.
- Geef je wel informatie aan (dus met parameters), en geeft je iets terug (dus levert met
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. - Geef je geen informatie aan (dus zonder parameters), maar geeft je wel iets terug (dus levert met
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.
I. Functies zonder parameters, zonder retourwaarde
Soms gebruik je functies zonder parameters (zonder dat je het specifieke informatie hoeft te geven) en zonder dat het een retourwaarde (of resultaat) teruggeeft. Dan gebruik je het om je code te structureren en op te ruimen. Heb je code dat bij elkaar hoort of code dat je vaker gebruikt? Daar kun je dan een functie van maken.Opgave 8b.1 Spirograaf
Klik hier voor een uitwerking.II. Functies met parameters, zonder retourwaarde
Soms geef je specifieke informatie aan een functie mee (parameter) zodat het precies doet wat jij in die situatie wil. We bekijken nu een voorbeeld zonder dat de functie een retourwaarde (of resultaat) teruggeeft. Heb je code dat je vaker gebruikt, maar er telkens iets anders uit ziet? Daar kun je dan een functie van maken. In het programma hieronder wordt een kunstwerk gemaakt. Je ziet een functietekenVierkant
die als extra informatie (parameter) meekrijgt met welke kleur dat moet gebeuren. In het hoofdprogramma wordt telkens een nieuwe kleur gekozen, de functie aangeroepen om de vierkant te tekenen, en dan een klein stukje gedraaid.
III. Functies met parameters, met retourwaarde
Voor de meeste berekeningen heb je informatie (parameters) nodig, en lever je ook een retourwaarde (resultaat) op. In je programma kun je later met dat resultaat verder werken. Merk op dat:- De variabele
kosten
aangemaakt wordt binnen de functie, en daardoor alleen binnen de functie bestaat. Dit heet een lokale variabele. kosten
wordt aangemaakt op regelnummer 11, en bestaat niet meer na regel 12.- Wil je de waarde van variabele
kosten
na de functie nog gebruiken, dan moet je deze met eenreturn
opleveren aan het hoofdprogramma. - De waarde van
kosten
wordt in dit voorbeeld op regel 18 teruggegeven aan het hoofdprogramma en wordt opgeslagen alsprijs
.
Een grote voordeel van met functies werken is dat je elk brok los van elkaar kunt bedenken, schrijven en testen. Zo is het makkelijker, als je een fout maakt, er achter te komen waar het zit en te bedenken hoe je het moet oplossen. In de code hierboven kan ik dus, als ik de kosten ga berekenen, me alleen daarmee bezig houden. Met veel print
kan ik waarden naar het scherm afdrukken om te controleren of er ook echt gebeurt wat ik verwacht dat er gebeurt: dat heet testen. Als ik een fout vind kan ik diezelfde print
jes gebruiken om te achterhalen waar de fout zit: dat heet debuggen.
Opgave 8b.4 Korting berekenen
Klik hier voor een uitwerking.Opgave 8b.3 Gevoelstemperatuur
Klik hier voor een uitwerking.IV. Functies zonder parameters, met retourwaarde
Een functie kan informatie opleveren, zonder dat het per se informatie nodig heeft. In het geval hieronder is een compliment de retourwaarde. De functie zelf heeft geen informatie nodig, en heeft dus ook geen parameters.Opgave 8b.4 Wachtwoord Generator
Klik hier voor een uitwerking.Globale variabelen
Zoals in Hoofdstuk Functies met parameters, met retourwaarde werd uitgelegd, bestaat een variabele dat binnen een functie wordt aangemaakt alleen binnen dat functie. Dit heet een lokale variabele. Wil je hem daarna gebruiken, dan moet je het retourneren met een return
.
Maar hoe zit het dan met globale variabelen? Een globale variabele is een variabele dat je bovenaan je code aanmaakt en gedurende je hele programma wilt gebruiken en deze eventueel wilt aanpassen. Let op: Het is beter om met return
te werken dan met global
.
We kijken even terug naar de code voor het geven van een willekeurige compliment:
In de functie kiesWillekeurigeCompliment()
wordt de globale variabele complimenten_lijst
gebruikt.
Zoals je ziet werkt het programma nog gewoon. Geen probleem dus.
Of toch wel? Nou, dit werkt wel, maar alleen als je het lijst niet aanpast. Wil je binnen een functie een globale variabele gaan aanpassen, dan werkt het niet.
We proberen nu in de functie de lijst aan te passen:
Wat zie je? De functie retourneert compliment_van_de_dag
, en daarom heeft deze in het hoofdprogramma de willekeurige waarde dat in de functie gegeven is.
Wil je in je functie een variabele gebruiken dat buiten de functie is aangemaakt, gebruik dan global
.
Binnen de functie geeft global complimenten_lijst
aan dat het om de globale variabele complimenten_lijst
gaat.
Opgave 8b.5 Global omzetten naar parameters en retourwaarden
Klik hier voor een uitwerking.Leesbaarheid van je code
Onderzoek met eye-trackers heeft aangetoond dat terwijl je programmeert je telkens je eigen code opnieuw aan het lezen bent. Ook als je op zoek gaat naar fouten, of aan de slag wil met uitbreidingen, ga je weer code lezen dat je al geschreven hebt. Je maakt het jezelf makkelijker door je code overzichtelijk te maken. Dat scheelt tijd en daardoor maak je minder fouten. Hier volgen een paar tips:
- Structuur: zet je globale variabelen helemaal bovenaan je code, dan je functiedefinities, en dan je hoofdprogramma. Gebruik commentaar om deze structuur aan te geven.
- Naamgeving: Kies zinvolle namen en gebruik standaard conventies:
variabel_namen
met lage-streepje tussen de woorden enfunctieNamen
met een hoofdletter voor een nieuwe woord. - Commentaar: licht blokken code toe met een regel commentaar. Bijvoorbeeld, vat samen wat een bepaalde while loop doet.
- Functies: Maak gebruik van functies om je code in brokken op te delen die bij elkaar horen
Commentaar
Als je een boek leest hebben de letters van een woord een betekenis. De woorden in een zin hebben een bepaalde betekenis. De zinnen in een paragraaf samen maken dat je glimlacht, lacht of huilt. Als je een samenvatting geeft van een boek, of een hoofdstuk van een boek, dan leg je niet regel-voor-regel uit wat er staat, maar ga je op zoek naar de betekenis en geef je dat in eigen woorden weer.
Op dezelfde manier hebben meerdere regels code samen een betekenis. Als je code leest (en dat doe je elke keer als je een programma schrijft), dan ben je in je hoofd bezig met de betekenis van de code dat er staat, want daar bouw je op verder. Ook moet je daar wel eens foutjes uit halen. Het is daarom handig om korte 'samenvattingen' te schrijven bij elke brok code. Een brok code is een aantal regels dat samen iets voor elkaar krijgt. Vaak is het de code dat bij een loop hoort, of bij een if-then-else. Het is een goede gewoonte om daar commentaar bij te schrijven: een regel commentaar dat in eigen woorden samenvat wat een brok code doet. Ook bij een functie zet je commentaar dat uitlegt wat het doet en wat de parameters en retourwaarden zijn.
Het is echt niet nodig om per regel commentaar te geven. Van een enkele regel code kan je ook zelf wel lezen wat er staat. Wel moet je bij een regel commentaar zetten als je iets nieuws gebruikt (bijvoorbeeld, je hebt een functie op internet gevonden), of omdat je een keuze hebt gemaakt om een probleem op een bepaalde manier op te lossen. Dit leg je dan kort uit met commentaar.
Als je een groter programma maakt, zoals een spel, dan is het handig om:
- in je code de volgende regels op te nemen:
#GLOBALE VARIABELEN
,#FUNCTIE DEFINITIES
en#HOOFDPROGRAMMA
. Als je code schrijft, zet je dat telkens onder het juiste kopje. Zo houd je je code gestructureerd en overzichtelijk, - de blokken die je in je stroomdiagram hebt getekend als commentaar in je code te schrijven voordat je begint met programmeren. Zo heb je een raamwerk dat je langzaam kan uitbreiden.
- per blok code een regel commentaar toe te voegen dat in je eigen woorden samenvat wat het doet.
- bij een
else
in commentaar te schrijven welk situatie dit is.
Afsluitende Opgaven
Afsluitende opgave 8b.2 Talendetector
Klik hier om je eigen oplossing te vergelijken met een model oplossing.Afsluitende opgave 8b.3 Vat samen
Deze opdracht wordt nog niet automatisch gecontroleerd. Klik hier om je eigen oplossing te vergelijken met een model oplossing.Afsluitende opgave 8b.4 Vat samen
Klik hier om je eigen oplossing te vergelijken met een model oplossing.Afsluitende opgave 8b.5 Valide wachtwoord
Deze opdracht wordt nog niet automatisch gecontroleerd. Klik hier om je eigen oplossing te vergelijken met een model oplossing.Wat je geleerd hebt over Eigen Functies
In dit hoofdstuk is het volgende besproken:
- Het nut van functies
- Functies maken
- Parameters en argumenten
- Waardes uit functies retourneren middels
return
- Leesbaarheid van je code, o.a. functie/variabele namen, commentaar.
- Variabele scope en levensduur
- Lokale en globale variabelen, en gebruik van
global
binnen een functie - Parameters en retourwaarden gebruiken in plaats van
global
Terug naar de cursus pagina