ID.nl logo
Zo kun je programmeren in Python - Deel 6
© PXimport
Huis

Zo kun je programmeren in Python - Deel 6

In de href="https://computertotaal.nl/artikelen/pc/zo-kun-je-programmeren-in-python-deel-5/" rel="noopener noreferrer" target="_blank">vorige les</a> leerde je met bestanden werken en zag je hoe je je programma kunt laten reageren op exceptions. Zo beginnen je programma’s ondertussen al vrij complex te worden. Tijd dus om wat structuur in je programma’s te brengen, en dat doen we in deze les met functies en modules. We bekijken ook enkele standaardmodules van Python.

Wil je meer leren over programmeren? Bekijk dan onze Cursus: programmeren in Phyton (boek & online cursus).

Tot nu toe waren onze Python-programma’s vrij kort, maar je hebt ondertussen al genoeg Python-bagage om zelf al eens aan de slag te gaan en je eigen ideeën uit te werken in programma’s. En dan merk je al snel dat je programma lang en ondoorzichtig wordt. Gelukkig kent Python verschillende manieren om wat meer structuur in je programma’s te brengen.

De eerste manier ben je al tegengekomen: functies. We hebben immers in de vorige lessen al diverse standaardfuncties van Python gebruikt, zoals len, print, input, format, split, open, read en write. Een functie is een afzonderlijk stukje code dat een afgebakende taak uitvoert die je meerdere keren zou willen uitvoeren op verschillende gegevens. Zodra je in je programma dus merkt dat je een stukje code telkens aan het herhalen bent, zou je eerste gedachte moeten zijn: ik maak er een functie van!

Een functie definiëren

We tonen je als voorbeeld hoe je een functie maakt om te berekenen of een woord een palindroom is. Een palindroom of spiegelwoord is een woord dat van achteren naar voren gelezen hetzelfde is als van voor naar achter. Een eenvoudige functie om te bepalen of een woord een palindroom is, ziet er als volgt uit:

def is_palindroom(woord):letters = list(woord)palindroom = Truewhile len(letters) > 0 and palindroom:if letters[0] != letters[-1]:palindroom = Falseelse:letters.pop(0)if len(letters) > 0:letters.pop()return palindroom

Dit is niet de efficiëntste manier om te bepalen of een woord een palindroom is, maar wel een die goed te begrijpen is. Je ziet dat er in de definitie van deze functie eigenlijk maar twee zaken nieuw zijn: de eerste en de laatste regel. In de eerste regel geven we met def is_palindroom(woord): aan dat we een functie definiëren met de naam is_palindroom en dat die één parameter meekrijgt, die we woord noemen. Dan komt onze hele berekening, die je met al je kennis uit de vorige lessen na een kleine studie zou moeten begrijpen, en op het einde geven we met return palindroom aan dat we de waarde die na onze berekening in de variabele palindroom zit teruggeven.

Een functie aanroepen

Breek je hoofd nog even niet over de inhoud van de functie. Typ de code in Thonny in en sla het bestand op onder de naam palindroom.py. Voer het dan uit met een druk op F5. Er gebeurt niets, maar de functie is nu gedefinieerd. In de terminal onderaan Thonny kun je nu de functie aanroepen. Enkele voorbeelden:

>>> is_palindroom('nepalapen')True>>> is_palindroom('napalm')False>>> is_palindroom('koortsmeetsysteemstrook')True

Denk nu eens even na over wat er gebeurt als je is_palindroom('nepalapen') aanroept. De functie is_palindroom wordt dan uitgevoerd en aan de variabele woord van de functie wordt de string 'nepalapen' toegekend. Dan gebeurt die hele berekening, en geeft de functie als resultaat True of False. En voor elke andere string die je aan de functie doorgeeft, gebeurt de berekening op dezelfde manier. Op deze manier heb je de berekening ingekapseld in een afzonderlijk stukje code, de functie, die herbruikbaar is.

Overigens zijn door die inkapseling de parameter woord net zoals de variabelen letters en palindroom alleen binnen het blok van de functie gedefinieerd: het zijn wat we noemen lokale variabelen.

Recursieve functies

In onze functie is_palindroom gaan we met een while-lus alle letters in het woord af. Een andere manier om de functie te definiëren is met recursie: in de functie roepen we de functie opnieuw aan, maar op een deel van het woord. Dat ziet er als volgt uit:

def is_palindroom2(woord):if len(woord) < 2:return Trueif woord[0] != woord[-1]:return Falsereturn is_palindroom2(woord[1:-1])

Voeg deze functie in Thonny gewoon aan hetzelfde bestand toe als is_palindroom, sla het bestand op en druk op F5 om het uit te voeren. Je kunt nu deze functie is_palindroom2 uitproberen op enkele woorden. Het resultaat moet telkens hetzelfde zijn als is_palindroom op hetzelfde woord.

De functie is_palindroom2 is een mooi voorbeeld van een recursieve functie. We bekijken eerst of het woord minder dan twee letters bevat. In dat geval (het woord is leeg of heeft één letter) is het altijd een palindroom en daarom geven we in dat geval True terug. Daarna controleren we of de eerste letter verschilt van de laatste letter van het woord. Verschillen die, dan is het woord al zeker geen palindroom en geven we dus False terug.

Dan blijft er nog één geval over: de eerste en laatste letter van het woord zijn gelijk, maar van de andere letters weten we nog niets. Wat doen we dan? We roepen de functie is_palindroom2 opnieuw op, maar op die andere letters. Die verkrijgen we door de slice (zie les 2) [1:-1] op het woord toe te passen, die het woord zonder de eerste en laatste letter teruggeeft.

Belangrijk bij recursieve functies

Als je een recursieve functie schrijft, is het belangrijk dat je de functie telkens oproept op een kleinere invoer dan waarmee je begon, zodat je uiteindelijk bij een basistest uitkomt, zoals in ons geval if len(woord) < 2: en if woord[0] != woord[-1]:. In beide gevallen roepen we de functie is_palindroom2 niet meer aan, maar geven we een waarde True of False terug. Doordat we in het derde geval altijd de eerste en de laatste letter van het woord verwijderen voor we de functie opnieuw oproepen, verzekeren we dat de functie uiteindelijk altijd bij een van de basistests uitkomt.

Met modules werken

Zonder dat je het weet, heb je nu al je eerste module geschreven. Elk Python-bestand waarin je code schrijft, is immers een module voor Python. Maak nu een nieuw Python-bestand aan in Thonny en noem het bijvoorbeeld test_palindroom.py. Als je in dit bestand de code uit palindroom.py wilt gebruiken, moet je de module palindroom importeren. Dat gaat als volgt:

import palindroom

print(palindroom.is_palindroom("nepalapen"))

Met import palindroom zeggen we aan de Python-interpreter dat we toegang willen tot alle code in de module palindroom. Python zoekt dan naar bestanden met de naam palindroom.py in zijn zoekpad. Omdat de code test_palindroom.py in dezelfde directory staat als palindroom.py, vindt Python de module en zijn de functies is_palindroom en is_palindroom2 daarin beschikbaar onder de namen palindroom.is_palindroom en palindroom.is_palindroom2.

In dit geval is het niet zo handig dat je voor elke functie uit de module palindroom de aanduiding palindroom. dient te zetten, omdat dit nogal lang is. We kunnen de naam van een module die we gebruiken gelukkig ook afkorten:

import palindroom as pal

print(pal.is_palindroom("nepalapen"))

Het is ook mogelijk om het voorvoegsel voor de module volledig weg te laten door de specifieke functies die we willen gebruiken te importeren:

from palindroom import is_palindroom

print(is_palindroom("nepalapen"))

Dat kan ook met meerdere functies:

from palindroom import is_palindroom, is_palindroom2

print(is_palindroom("nepalapen"))

print(is_palindroom2("parterretrap"))

Zodra je Python-code wat langer wordt, is het aan te raden om ze in modules op te splitsen. Een goede vuistregel is dat elke module code voor één specifiek doel moet bevatten. In ons geval bevat de module bijvoorbeeld alle mogelijke code die met palindromen te maken heeft. Als we daarnaast ook code voor anagrammen zouden willen toevoegen, doe je dat het best in een afzonderlijke module, anagram.py.

Systeeminformatie

Python zelf bestaat ook uit een heleboel standaardmodules waarin allerlei handige functies zitten. Zo is er de module platform om informatie over het platform waarop je Python-programma draait op te vragen:

>>> import platform>>> platform.architecture()('64bit', 'ELF')>>> platform.platform()'Linux-4.15.0-33-generic-x86_64-with-Ubuntu-18.04-bionic'>>> platform.processor()'x86_64'>>> platform.python_version()'3.6.7'>>> platform.system()'Linux'

Verder bevat de standaardmodule os allerlei functies die met het besturingssysteem te maken hebben. Zo kun je een lijst opvragen van de bestanden in de huidige directory:

>>> import os>>> os.listdir()['palindroom.py', 'test_palindroom.py']

Werken met getallen

Als je met getallen wilt werken, komt de module math goed van pas. Die bevat allerlei functies voor berekeningen, zoals je in het volgende voorbeeld ziet:

>>> import math>>> math.floor(4.3)4>>> math.ceil(4.3)5>>> math.gcd(28, 12)4>>> math.sqrt(2)1.4142135623730951>>> math.e2.718281828459045>>> math.pi3.141592653589793>>> math.sin(2*math.pi)-2.4492935982947064e-16

In de laatste regel zie je al een nadeel van berekeningen met floats: door afrondingsfouten geeft de berekening van de sinus van 2 keer pi een heel klein getal (-2 en nog iets maal 10 tot de -16de macht) in plaats van het juiste resultaat 0.

Een andere nuttige module is random, waarmee je willekeurige getallen kunt genereren:

>>> import random>>> random.randint(1, 10)7>>> random.choice(['lies', 'jan', 'kees', 'mireille', 'koen', 'rob'])'rob'>>> namen = ['lies', 'jan', 'kees', 'mireille', 'koen', 'rob']>>> random.shuffle(namen)>>> namen['jan', 'rob', 'koen', 'mireille', 'lies', 'kees']

Zo geeft de functie randint(a, b) een willekeurig geheel getal tussen a en b terug (a en b inbegrepen). Met choice kies je een willekeurig element uit een lijst. En met shuffle schud je een lijst willekeurig door elkaar.

Samenvatting

In deze les heb je geleerd om je Python-code wat meer te structureren. Enerzijds heb je berekeningen die je vaak herhaalt in functies leren opnemen. Anderzijds heb je geleerd hoe je functies die bij elkaar horen kunt afscheiden in een afzonderlijke module. We hebben tot slot ook met enkele standaardmodules van Python kennisgemaakt. In de volgende les gaan we op de structuur van datatypes in: we tonen je hoe je zelf eigen datatypes kunt definiëren in de vorm van klassen.

Opdracht

Open de module palindroom.py in Thonny en voer ze uit met een druk op F5. Voer in de terminal onderaan de volgende opdrachten in: *>>> is_palindroom('parterretrap')True>>> woord**Traceback (most recent call last):**File "

Uitwerking

De parameter woord in de functie is een lokale variabele: die is alleen binnen het blok van de functie gedefinieerd. Als je de functie met het argument 'parterretrap' oproept, wordt die string in de functie aan de lokale variabele woord toegekend, maar na het uitvoeren van de functie is die variabele niet meer beschikbaar en geeft Python dus met een NameError aan dat het de naam woord niet kent.

Cheatsheet

Functie: een afzonderlijk stukje code dat je meerdere keren uitvoert. Importeren: aangeven dat je een module wilt gebruiken. Lokale variabele: een variabele die alleen binnen een specifiek blok (bijvoorbeeld van een functie) gedefinieerd is. Module: een afzonderlijk bestand met Python-code. Recursieve functie: een functie die zichzelf aanroept.

▼ Volgende artikel
Waar voor je geld: 5 A-label-koelkasten met grote inhoud
Huis

Waar voor je geld: 5 A-label-koelkasten met grote inhoud

Bij ID.nl zijn we dol op producten die niet alleen betaalbaar zijn, maar ook een bijdrage kunnen leveren aan een beter milieu en kosten kunnen besparen. Een koelkast met veel ruimte én een laag energieverbruik is natuurlijk dubbel zo prettig. Wij vonden vijf geschikte modellen.

Koelkasten met energielabel A zijn op dit moment nog vrij schaars; er is maar een klein aantal fabrikanten die dergelijke modellen op de markt hebben gebracht. Op Kieskeurig.nl hebben we er een vijftal voor je gevonden.

EDY EDHC8091A

De EDY EDHC8091A is een moderne koel-vriescombinatie die niet alleen strak oogt met zijn inox-look, maar ook uitblinkt in energiezuinigheid. Deze koelkast is voorzien van energielabel A en verbruikt op jaarbasis slechts 109 kWh. Deze koelkast is uitgerust met een led-display in de deur waarop je temperatuurinstellingen kunt aflezen en aanpassen. Binnenin vind je stevige glazen legplateaus, ruime deurvakken en handige groentelades. Erg fijn is ook de 5 jaar fabrieksgarantie die EDY geeft op deze koelkast.

❄️ Inhoud koelkast: 238 liter
🧊 Inhoud vriezer: 98 liter
🔌Verbruik op jaarbasis: 109kWh

Samsung RB38A7B6AS9

De Samsung RB38A7B6AS9 is een ruime en stille koel-vriescombinatie, waarbij het koelgedeelte en de vriezer apart worden gekoeld, wat geurvermenging voorkomt en de luchtvochtigheid optimaal houdt. Daardoor blijven verse producten als groente en fruit langer houdbaar. De koelkast biedt een royale opslagcapaciteit. Verder heeft deze Samsung RB38A7B6AS9 een zogeheten convertible zone, waarin je een deel van de vriezer flexibel kunt omzetten naar koelruimte. De deur heeft een geïntegreerd led-display, waarmee je gemakkelijk de temperatuur kunt aflezen en aanpassen.

❄️ Inhoud koelkast: 238 liter
🧊 Inhoud vriezer: 273 liter
🔌Verbruik op jaarbasis: 108kWh

Samsung RB38C7B6AB1/EF

De Samsung RB38C7B6AB1/EF heeft een opvallende stijlvolle zwarte buitenkant. De koelkast heeft geavanceerde functies die het dagelijkse gebruik gemakkelijker maken, zoals een speciale zone waarmee je de vriezer kunt omzetten naar koelruimte; handig als je wat extra koelruimte nodig hebt. De Twin Cooling Plus-technologie zorgt er verder voor dat de koelkast en het vriesgedeelte apart worden geregeld, waardoor voedingsmiddelen langer vers blijven. Dankzij zijn ruime inhoud is deze koelkast ideaal voor voor grotere gezinnen of voor wie graag alles overzichtelijk bewaart. Verder is hij voorzien van heldere ledverlichting en een fraai led-display op de deur.

❄️ Inhoud koelkast: 273 liter
🧊 Inhoud vriezer: 114 liter
🔌Verbruik op jaarbasis: 108kWh

Samsung RB53DG706AS9 

Deze vrijstaande koelkast van Samsung is met zijn hoogte van 203 centimeter en breedte van 75 centimeter een flink apparaat. Binnenin is er flink wat plek: in totaal 538 liter, waarvan 370 liter in het koelgedeelte en 168 liter in het vriesvak. Dankzij de slimme opbouw zijn de wanden dunner dan bij veel andere modellen, waardoor je meer inhoud hebt zonder dat de buitenmaten toenemen. Ook bij deze koelkast blijft de luchtvochtigheid op peil dankzij een systeem met gescheiden luchtstromen voor het koel- en vriesgedeelte. Verder vind je in het vriesvak een handige draaibare ijsblokjesmaker, en kun je met speciale knoppen snel extra koelen of invriezen. Door de extra functies ligt het verbruik van deze koelkast wel ietsje hoger dan de andere modellen in dit overzicht.

❄️ Inhoud koelkast: 370 liter
🧊 Inhoud vriezer: 168 liter
🔌Verbruik op jaarbasis: 128kWh

Hisense RB440N4ACA

Tussen de A-labelkoelkasten van Samsung vinden we ook nog een Hisense. De RB440N4ACA is geen klein model. Hij is zo'n 202 centimeter hoog, 60 centimeter breed en 58 centimeter diep. Binnenin heb je in totaal 336 liter aan ruimte: 238 liter in het koelgedeelte bovenin en 98 liter in het vriesgedeelte onderin. Dankzij de No Frost-techniek hoef je de vriezer nooit meer handmatig te ontdooien. De deuren kun je naar wens links- of rechtsdraaiend monteren, wat handig is bij het inrichten van je keuken. Binnenin zorgt ledverlichting voor goed zicht, en het luchtcirculatiesysteem verdeelt de koude lucht gelijkmatig, zodat alles op de juiste temperatuur blijft. Ook handig: de snelle invriesfunctie voor als je net boodschappen hebt gedaan. Verder vind je twee groentelades met vochtregeling, stevige glasplaten, een flessenrek en een eierhouder.

❄️ Inhoud koelkast: 238 liter
🧊 Inhoud vriezer: 98 liter
🔌Verbruik op jaarbasis: 109kWh

▼ Volgende artikel
Wat betekenen die ovenicoontjes? Zo haal je alles uit je (combi-)oven!
© MENDIFOTO
Huis

Wat betekenen die ovenicoontjes? Zo haal je alles uit je (combi-)oven!

Wie een moderne oven of combi-magnetron in huis haalt, krijgt er meteen een reeks functies en symbolen bij. Handig, maar in het begin soms wat verwarrend. Wat doen al die icoontjes precies? En hoe weet je welke stand je moet kiezen voor jouw gerecht? In dit artikel leggen we het je uit.

Eerlijk is eerlijk: een pizza laten draaien op volle magnetronkracht of per ongeluk grillen in plaats van ontdooien: het overkomt de beste. Door de symbolen op je oven te leren kennen, voorkom je dat soort keukenmissers. We nemen de negen meestgebruikte icoontjes op jouw oven onder de loep.

Lees ook: Hoe kies je de juiste inbouwoven?

Zodra je een moderne oven of combi-magnetron in gebruik neemt, valt één ding meteen op: de hoeveelheid knopjes en symbolen. Sommige herken je meteen, andere lijken meer een soort hiëroglyfen. Toch zijn die icoontjes er niet voor niets: ze helpen je het maximale uit je apparaat te halen. Tenminste, als je weet wat ze betekenen...

In dit artikel leggen we stap voor stap uit waar de belangrijkste symbolen voor staan en hoe je ze in de praktijk gebruikt. Zo voorkom je veelgemaakte fouten en maak je koken weer overzichtelijk!

Uit

De oven staat in de veilige standby-stand. 

©DD | ID.nl

Boven- en onderwarmte

Bij deze stand komt de warmte gelijkmatig van boven en onder. Het is de klassieke ovenmodus die je voor bijna alles kunt gebruiken – van ovenschotels tot het bakken van taarten. Betrouwbaar en veelzijdig.

©DD | ID.nl

Onderwarmte

Hierbij verwarmt alleen het element aan de onderkant van de oven. Ideaal als je een gerecht hebt dat onderin goed heet moet worden, zonder dat de bovenkant al te snel kleurt of verbrandt. Denk aan een lasagne met een dikke kaaslaag. Je kunt ook afwisselen tussen deze modus en de gecombineerde boven- en onderwarmte, afhankelijk van hoe snel het gaat.

©DD | ID.nl

Grillen

De grillstand wordt meestal aangegeven met een kartelig lijntje. Deze functie is bedoeld om vlees een mooie, knapperige buitenkant te geven, terwijl het vanbinnen goed gaart. Het resultaat doet denken aan wat je van een barbecue verwacht: ideaal voor spareribs of een sappige steak. 

©DD | ID.nl

Hetelucht

Steeds meer ovens hebben naast de elektrische standen ook een heteluchtfunctie. Die verdeelt de warmte met behulp van een ventilator, wat zorgt voor een gelijkmatige temperatuur. Voor gevoelige baksels als cakes en taarten is het beter om voor een elektrische stand te kiezen, omdat daar de temperatuur preciezer is. Voor ovenschotels of een plaat vol koekjes is hetelucht dan weer ideaal.

©DD | ID.nl

Lees ook: Wat is het verschil tussen een combi-oven en een combi-magnetron?

Magnetron

Heb je een combi-oven, dan is de kans groot dat die ook een magnetronfunctie heeft. Die herken je aan drie golvende lijntjes. Meestal staat dit symbool voor de standaardstand, vaak rond de 700 watt. Soms zie je varianten met een bordje of mok erbij; die zijn bedoeld voor het opwarmen van specifieke dingen zoals dranken of maaltijden, vaak op een aangepast vermogen.

©DD | ID.nl

Magnetron + oven

Deze stand combineert de magnetronfunctie met de klassieke ovenwarmte van boven en onder. Handig als je iets sneller wilt garen én verwarmen. Maar wees voorzichtig: niet elk gerecht kan goed tegen die combinatie van directe hitte en microgolven. Er bestaat ook een variant die de heteluchtfunctie in plaats van de elektrische ovenstand gebruikt.

©DD | ID.nl

Lees ook: Waar voor je geld: 5 vrijstaande combimagnetrons van max 200 euro

Magnetron + grill

Bij combi-ovens met grillfunctie kun je ook kiezen voor een gecombineerde stand. Terwijl de magnetron de binnenkant van je eten snel opwarmt, zorgt de grill voor een krokante bovenkant. Vooral handig als je iets gratineert of een knapperig korstje wilt.

©DD | ID.nl

Ontdooien

Bevroren producten ontdooien kan prima in de magnetron, mits op laag vermogen – meestal rond de 200 watt. Zo voorkom je dat je gerecht al begint te garen terwijl het nog ontdooit. Sommige ovens geven dit aan met een sneeuwvlokje of ijskristal.

©DD | ID.nl

Tot slot

Het lijkt misschien een wirwar aan icoontjes, maar zodra je weet waar elk symbool voor staat, wordt koken met je oven of combi-magnetron een stuk leuker én eenvoudiger. Je kiest gerichter de juiste stand en voorkomt zo halfgare ovenschotels, aangebrande vleesgerechten of te droge taarten. Of je nu iets wilt ontdooien, gratineren of perfect wilt bakken: met een beetje kennis van de symbolen ben je goed voorbereid. Zo wordt je oven pas echt een hulp in de keuken in plaats van een bron van frustratie.