ID.nl logo
Zo kun je programmeren in Python - deel 8
© Reshift Digital
Zekerheid & gemak

Zo kun je programmeren in Python - deel 8

Tot nu toe leerde je heel wat mogelijkheden van de programmeertaal Python. Misschien ben je buiten onze lessen zelf al aan de slag gegaan met je kennis. Super, want programmeren leer je door het veel te doen. Maar een goed programma is ook gedocumenteerd en goed getest. Dat leer je in onze achtste les.

Hier vind je les 1 van de Python-cursus.

Verkeerde gewoontes leer je niet snel af, daarom dat we nu even een stapje terugdoen en nadenken over wat ‘goede code’ is. Na deze les kun je code produceren die niet alleen goed gedocumenteerd en goed getest is, maar weet je ook hoe je informatie over Python-modules opzoekt met de helpfunctie.

Code documenteren met commentaar

Tot nu toe schreven we onze code zonder enige vorm van documentatie. Als je met anderen samenwerkt aan een programma, is het belangrijk dat je die documenteert, zodat je anderen duidelijk maakt wat je met je code bedoelt. Maar ook als je helemaal alleen programmeert, is documentatie geen overbodige luxe. Zo begrijp je je eigen code nog als je er over een jaar opnieuw naar kijkt.

De eerste manier om je code te documenteren is met commentaar. Alles na het #-teken (hekje) tot het einde van de regel (behalve als het hekje ín een string voorkomt) is commentaar en wordt door Python genegeerd. Op die manier kun je een uitleg voor jezelf of anderen schrijven. Als je bijvoorbeeld in de functie is_palindroom van deel 6 in de war raakt met die indexen, schrijf er dan gerust wat commentaar bij:

if letters[0] != letters[-1]: # Als de eerste en de laatste letter verschillen

Het getuigt van goede stijl om twee spaties tussen je code en het erna volgende commentaarteken te houden en één spatie tussen het commentaarteken en je commentaar. Overigens kun je ook commentaar op een nieuwe losstaande regel beginnen, dan spreken we van een commentaarregel:

# Als de eerste en de laatste letter verschillen

if letters[0] != letters[-1]:

Het is de gewoonte om een commentaarregel te zetten op de regel vóór de regel waarover hij gaat.

Code uitcommentariëren

Het commentaarteken (#) wordt ook weleens gebruikt om code die je aan het testen bent maar die niet blijkt te werken tijdelijk ‘uit te commentariëren’ ofwel uit te zetten. Door een commentaarteken voor de code te zetten, wordt de code door Python genegeerd, maar kun je hem erna wel eenvoudig weer inschakelen door het commentaarteken weg te halen. Op deze manier gebruik je het commentaarteken dus niet voor documentatie, maar eigenlijk als hulpmiddel bij het debuggen.

Code documenteren met docstrings

Commentaar gebruik je om te documenteren waarom je iets doet en hoe je het doet, maar voor gebruikers van je code is vooral belangrijk wat die doet. Om dat te documenteren, gebruik je docstrings: in het begin van elke module, elke klasse en elke functie of methode geef je met een string tussen drie dubbele aanhalingstekens aan wat het stuk code doet.

Zo zouden we onze klassen uit de vorige les als volgt kunnen documenteren:

"""Klassen om met tweedimensionale, driedimensionale en hogerdimensionale punten te werken."""

import math

class Point:
"""Stelt een punt voor in een willekeurig aantal dimensies."""

def __init__(self, *coordinates):
"""Initialiseer het punt met de opgegeven coördinaten."""
self.coordinates = list(coordinates)

def __repr__(self):
"""Geef een leesbare voorstelling van het punt terug."""
return 'Point(' + ', '.join(str(co) for co in self.coordinates) + ')'

def displacement(self, other_point):
"""Geef het verschil terug tussen dit punt en een ander punt.

De overeenkomstige coördinaten worden van elkaar afgetrokken.

Voorbeeld: het verschil tussen Point(1, 4, 2) en Point(3, 4, 1) is gelijk aan Point(2, 0, -1).
"""
return Point(*[a-b for a, b in zip(other_point.coordinates, self.coordinates)])

def distance(self, other_point):
"""Geef de Euclidische afstand terug tussen dit punt en een ander punt."""
relative_position = self.displacement(other_point)
return math.sqrt(sum(i**2 for i in relative_position.coordinates))
class Point2D(Point):
"""Stelt een tweedimensionaal punt voor."""

def __init__(self, x=0, y=0):
"""Initialiseer het punt met de opgegeven x- en y-coördinaten."""
Point.__init__(self, x, y)
self.x = x
self.y = y
def get_x(self):

"""De x-coördinaat van het punt."""
return self.coordinates[0]

def set_x(self, x):
self.coordinates[0] = x

x = property(get_x, set_x)

def get_y(self):
"""De y-coördinaat van het punt."""
return self.coordinates[1]

def set_y(self, y):
self.coordinates[1] = y

y = property(get_y, set_y)

Je ziet hier dat documentatie niet lang hoeft te zijn. De docstrings bij de module, de klassen en bij de meeste methodes zijn maar één regel lang.

De moeilijkste methode om te begrijpen is displacement en daarom is het zinvol om daar wat meer uitleg bij te geven. Bij een docstring van meer dan één regel raden we aan om na de eerste regel een lege regel te houden, en om de drie dubbele aanhalingstekens op het einde op een nieuwe regel te zetten. Dat geeft wat meer overzicht.

Merk op: bij onze eigenschappen x en y van de klasse Point2D documenteren we alleen de methode die de waarde van de eigenschap opvraagt. Zo toont de ingebouwde helpfunctie van Python (die we op het einde van deze les bespreken) deze documentatie bij de eigenschap.

Interactieve voorbeelden in docstrings

We hebben in de docstring van de methode displacement al een voorbeeld van het gebruik van de methode gegeven als documentatie. Maar dat bleef nogal informeel. We kunnen die documentatie ook in de vorm van echte Python-code doen die je in een interactieve terminalsessie zou kunnen invoeren. Zo kan de gebruiker die de documentatie leest, onmiddellijk de voorbeelden kopiëren uit de documentatie en plakken in de Python-interpreter om ze uit te proberen. Dat zou voor de methode displacement er dan als volgt uitzien:

def displacement(self, other_point):"""Geef het verschil terug tussen dit punt en een ander punt.

De overeenkomstige coördinaten worden van elkaar afgetrokken.

>>> Point(1, 4, 2).displacement(Point(3, 4, 1))Point(2, 0, -1)"""return Point(*[a-b for a, b in zip(other_point.coordinates, self.coordinates)])

Je ziet hier dat je de code na de >>> exact in een Python-terminalsessie zou kunnen invoeren en dan ook het resultaat zou krijgen dat hier staat. In feite hebben we wat hier staat gewoon eerst in de terminal van Thonny ingevoerd en dan samen met de uitvoer gekopieerd en hier in de docstring geplakt.

Code testen met doctest

Stel dat je nu ooit de code van de methode displacement aanpast omdat je denkt een verbetering te zien, maar er een fout in maakt, waardoor het resultaat verkeerd is. Dan kun je dat testen door de voorbeeldcode in je docstring uit te voeren in een Python-terminalsessie. Voer je de code uit en komt het resultaat niet overeen met de uitvoer in de docstring, dan klopt je code niet meer.

Maar zouden we die test niet automatisch kunnen doen? Jazeker! Python kent daarvoor de module doctest, die automatisch alle docstrings in een module kan testen op interactieve voorbeelden. Dat voer je als volgt uit in een Linux- of macOS-terminal of de Windows Opdrachtprompt:

python3 -m doctest -v point.py

Hierbij is point.py de naam van de module met je code erin. Je krijgt dan als uitvoer de tests die doctest in je docstrings ziet en het resultaat. Als je het alleen wilt zien als een test een fout vindt, haal dan de optie -v weg. Stel dat je bijvoorbeeld per ongeluk de * vergeten bent in de methode displacement om de lijst naar een willekeurig aantal argumenten voor de klasse Point om te zetten, dan zal doctest die fout opmerken met de volgende melding:

**********************************************************************

File "point.py", line 21, in point.Point.displacement

Failed example:

Point(1, 4, 2).displacement(Point(3, 4, 1))

Expected:

Point(2, 0, -1)

Got:

Point([2, 0, -1])

**********************************************************************

1 items had failures:

1 of

***Test Failed*** 1 failures.

Een goede manier van programmeren is dan ook dat je je code zoveel mogelijk documenteert met docstrings en daarin ook interactieve voorbeelden opneemt, die je na elke wijziging van je code automatisch test met doctest om je ervan te verzekeren dat je geen fouten hebt geïntroduceerd.

De helpfunctie gebruiken

Als je code is gedocumenteerd, hoef je niet je codebestand in Thonny te openen om de documentatie te bekijken. Je kunt dit in een interactieve Python-sessie, bijvoorbeeld in Thonny, maar ook in een Python-sessie in een Linux- of macOS-terminal of de Windows Opdrachtprompt. Het enige wat je hoeft te doen, is de functie help op te roepen met de naam van de module, klasse, functie of methode waarvoor je de documentatie wilt zien. Bijvoorbeeld in Thonny:

>>> help(Point.displacement)

Help on function displacement in module __main__:

displacement(self, other_point)

Geef het verschil terug tussen dit punt en een ander punt.

De overeenkomstige coördinaten worden van elkaar afgetrokken.

>>> Point(1, 4, 2).displacement(Point(3, 4, 1))

Point(2, 0, -1)

Overigens zijn alle standaardmodules van Python uitgebreid gedocumenteerd met docstrings. Daardoor kun je van alle modules, klassen, functies en methodes heel eenvoudig documentatie opvragen in je Python-terminalsessie. Let er wel op dat je een module eerst dient te importeren voordat je er documentatie van kunt opvragen met help.

Samenvatting

In deze les ging het minder over het programmeren zelf, maar over het documenteren en testen van je Python-programma’s en het uitzoeken van meer informatie over de standaard Python-modules of je eigen modules. Hoe complexer je programma’s zijn, hoe belangrijker dit soort zaken rond je code zijn. Maak er daarom een gewoonte van om documentatie en tests niet als een nabeschouwing te zien, maar al tijdens de ontwikkeling van je programma in je code te integreren. In de volgende les maken we het nog complexer: dan gaan we extra modules installeren die niet in Python ingebouwd zijn.

Opdracht 1

Voer de helpfunctie eens uit op je klasse Point2D. Wat zou er nog beter kunnen aan de getoonde documentatie?

Uitwerking opdracht 1

*>>> from point import Point2D

help(Point2D)* De helpfunctie van onze klasse toont niet alleen de eigenschappen x en y bij de Data descriptors, maar toont ook de methodes get_x, set_x, get_y en set_y. Dat is wat te veel van het goede. Die methodes hoeven niet getoond te worden. Daar doen we in de volgende opdracht iets aan.

Opdracht 2

We hebben een eigenschap zoals x in de klasse Point2D tot nu toe geconstrueerd met methodes get_x en set_x en een opdracht als x = property(get_x, set_x) om deze methodes samen als eigenschap te gebruiken. Maar je kunt een eigenschap ook met een decorator definiëren en dan worden die methodes niet in de helpuitvoer getoond. Zoek zelf met de ingebouwde helpfunctie van Python op hoe je dat doet.

Uitwerking opdracht 2

Met help(property) krijg je uitleg over de opdracht property. Je leert er zelfs dat het geen opdracht maar een klasse is. Het in de helpuitvoer getoonde voorbeeld kun je bijna rechtstreeks toepassen op onze klasse Point2D. Dan kom je tot de volgende code voor x: *@propertydef x(self):"""De x-coördinaat van het punt."""return self.coordinates[0]@x.setter**def x(self, x):*self.coordinates[0] = x Doe hetzelfde voor y. Voer de helpfunctie opnieuw uit op je klasse en verifieer dat je alleen nog maar hulp over de eigenschappen krijgt en niet meer over de methodes die de eigenschappen opbouwen.

Cheatsheet

Commentaar: een regel die begint met # en dient als uitleg bij een stukje code. Debuggen: fouten (bugs) in je code opsporen en verhelpen. Docstring: een string tussen drie dubbele aanhalingstekens die een module, klasse, functie of methode documenteert. Uitcommentariëren: een regel code uitschakelen door er een commentaarteken voor te zetten.

▼ Volgende artikel
De eerste Masters of the Universe-trailer is nu te zien
Huis

De eerste Masters of the Universe-trailer is nu te zien

Amazon MGM en Sony Pictures hebben de eerste teaser trailer online gedeeld van de aankomende film Masters of the universe.

Het gaat voor duidelijkheid om een live-action verfilming van de animatieserie He-Man and the Masters of the Universe, dat in de jaren tachtig van veel populariteit genoot. In dat decennium is de serie ook al eens verfilmd, al was dat niet bepaald een kritische hit. De animatieserie is dan weer gebaseerd op een speelgoedlijn.

Over de film

De nieuwe Masters of the Universe-film draait om Adam (gespeeld door Nicholas Galitzine), die van oorsprong van de planeet Eternia komt en als kind op aarde terechtkomt, gescheiden van zijn krachtige Power Sword.

Twintig jaar later vindt hij zijn zwaard terug, en keert hij terug naar Eternia om de planeet te redden van Skeletor. Dit gevaarlijke monster houdt de planeet in zijn ijzeren greep. De rol van Skeletor wordt in de film vertolkt door Jared Leto.

Vanaf 5 juni in de bioscoop

Masters of the Universe draait vanaf 5 juni in de bioscoop. De regie is in handen van Travis Knight (Bumblebee), en verder hebben ook Idris Elba, Kristen Wiig, Alison Brie en Camila Mendes rollen. Wanneer de film op Amazon Prime Video komt te staan is overigens nog niet bekend.

Watch on YouTube
Nieuw op ID: het complete plaatje

Misschien valt het je op dat er vanaf nu ook berichten over games, films en series op onze site verschijnen. Dat is een bewuste stap. Wij geloven dat technologie niet stopt bij hardware; het gaat uiteindelijk om wat je ermee beleeft. Daarom combineren we onze expertise in tech nu met het laatste nieuws over entertainment. Dat doen we met de gezichten die mensen kennen van Power Unlimited, dé experts op het gebied van gaming en streaming. Zo helpen we je niet alleen aan de beste tv, smartphone of laptop, maar vertellen we je ook direct wat je erop moet kijken of spelen. Je vindt hier dus voortaan de ideale mix van hardware én content.

▼ Volgende artikel
Kort programma op je wasmachine gebruiken: slim of juist niet?
© Sergei Klopotov
Huis

Kort programma op je wasmachine gebruiken: slim of juist niet?

Je favoriete broek is vies. Eigenlijk wil je hem morgen weer aan, maar je moet zo weg. Het korte programma lijkt dan een logische keuze: binnen een half uur (en soms zelfs korter) ben je klaar. Maar ís het wel zo slim? Dat hangt sterk af van wat je erin stopt en wat je ervan verwacht.

In dit artikel

Je ziet wanneer een kort programma handig is en wanneer het beter is om een ander programma te kiezen. We leggen uit hoe schoon zo'n snelle was echt wordt, wat het betekent voor je energieverbruik en wat vaak wassen op lagere temperaturen met je machine doen. Ook lees je hoe je een kort programma zo gebruikt dat je was goed schoon wordt en je machine fris blijft.

Lees ook: Wat doet de stoomfunctie van een wasmachine en wanneer heeft het zin?

Korte wasprogramma's: zo zit het

Een kort wasprogramma is bedoeld om licht vervuilde was in weinig tijd schoon te krijgen. Daardoor doet de wasmachine een paar dingen anders dan bij een standaardprogramma. De wastijd is kort, de fase waarin wasmiddel echt kan inwerken is beperkt en ook het spoelen en centrifugeren duren vaak korter. Ook de temperatuur is lager dan bij reguliere wasprogramma's. Veel korte programma's draaien op 30 graden en soms zelfs op 20 graden. Vaak kun je die temperatuur nog wel iets aanpassen, maar soms ook niet.

Wanneer werkt een kort programma wél?

Een kort programma doet het goed bij kleding die nauwelijks vuil is. Denk aan een shirt dat je mar één dag hebt gedragen, een blouse die wat naar rook of eten ruikt, of sportkleding die je direct na het trainen wast. In die situaties is vuil nog niet in de vezels getrokken. Een korte wasbeurt is dan vaak al voldoende om je kleding snel op te frissen.

Wanneer werkt een kort programma minder goed?

Bij echt vuil textiel red je het zelden met een kort programma. Hardnekkige vlekken zoals vet, modder, gras en opgedroogd zweet hebben tijd nodig om los te weken. En juist die tijd ontbreekt bij korte programma's. Het wasmiddel heeft niet voldoende tijd om zijn werk te doen en ook spoelt een kort programma minder grondig dan bij een standaard was. Gebruik je zo'n korte cyclus toch voor beddengoed, handdoeken of echt vieze kleding met vlekken, dan voelt of ruikt de was na afloop misschien wel frisser, maar is hij niet écht schoon.

Waarom kort niet automatisch zuinig is

Veel mensen kiezen voor een snel programma omdat ze denken dat dat minder energie kost. Klinkt logisch, maar het werkt anders. Het grootste deel van het energieverbruik gaat naar het opwarmen van water, en dat hangt vooral af van de hoeveelheid water en de gewenste temperatuur. Of de machine dat snel of langzaam doet, maakt vooral verschil in de piek van het stroomgebruik, niet in de totale hoeveelheid energie.

Eco-programma's zijn juist zuiniger omdat ze minder water gebruiken en op lagere temperatuur wassen. De machine neemt de tijd om hetzelfde resultaat te bereiken. Een kort programma op een hogere temperatuur moet in korte tijd veel warmte leveren, en dat jaagt je energieverbruik juist op.

View post on TikTok

Kort programma? Gebruik niet te veel wasmiddel!

Korte programma's wassen vaak op een lagere temperatuur. Gebruik je poeder, dan kan dat wat langzamer oplossen. En omdat zo'n programma ook korter spoelt, kunnen er eerder witte waasjes of zeepresten in de stof achterblijven. Dat merk je soms ook aan je huid, vooral als die snel reageert.

Doseer daarom precies. Volg het advies op de verpakking en gebruik bij een snelle was liever iets minder waspoeder dan te veel, zeker als de was maar licht vervuild is. Je kunt ook kiezen voor vloeibaar wasmiddel, omdat dat meestal sneller oplost dan poeder.

Veel korte programma's = meer kans op vetluis

Als je vaak op 20 of 30 graden wast, blijft er na verloop van tijd wat vet en vuil achter in de trommel, de rubbers en de slangen. Dat laagje heet 'vetluis': een mengsel waarin bacteriën zich makkelijk kunnen vermeerderen. Je merkt het meestal aan een muffe geur in de machine, of aan wasgoed dat niet helemaal fris meer ruikt.

Laat je wasmachine daarom af en toe op hoge temperatuur draaien. Een onderhoudsprogramma of een hete was helpt om opgehoopte viezigheid beter op te lossen en houdt de machine fris. Hoe vaak dat nodig is, verschilt per huishouden. Draai je vooral korte programma's op lagere temperaturen, dan is het verstandig om geregeld een heter programma te draaien.

Lees ook: Vetluis in je wasmachine? Zo kom je er vanaf!

Zo haal je het meeste uit een kort programma

Een kort programma is vooral bedoeld om kleding op te frissen. Dan helpt het om de trommel niet te vol te stoppen: de was moet ruim kunnen bewegen, zodat water en wasmiddel overal bij kunnen. Doseer het wasmiddel ook zuinig; bij een korte was spoelt een teveel aan wasmiddel minder goed uit je kleding (waarom dat zo is, legden we eerder al uit). En: stel de temperatuur niet te hoog in. Misschien denk je dat een hogere temperatuur de verkorte wastijd compenseert, maar zo werkt het niet. Voor een kort programma (dat vooral bedoeld is om kleding op te frissen) is 20 of 30 graden echt voldoende. Stel je de temperatuur hoger in, dan maakt dat voor het resultaat vaak weinig verschil. Het is vooral je wasmachine zelf die harder moet werken en meer energie verbruikt.

Conclusie

Een kort programma is handig, zolang je het gebruikt voor licht vervuilde was die vooral opgefrist moet worden. Wil je écht schoon wassen of energie besparen, dan ben je met een langer programma vaak beter uit.

👉4x uitstekende wasmachines voor snelle wasjes

De Miele WEA 135 WCS Excellence is een wasmachine met 8 kg vulgewicht. Voor snelle wasjes zit er een Express 20-programma op, bedoeld voor kleding die je vooral even wilt opfrissen. Met 1400 tpm komt je was droger uit de trommel dan bij 1200 tpm, wat scheelt als je daarna nog moet drogen, terwijl het geluidsniveau tijdens centrifugeren met 72 dB binnen de gebruikelijke marges blijft. Qua energie zit dit model op energieklasse A met een extra marge (A-10%) en het ECO 40-60-programma is de zuinige standaard voor normaal bevuild katoen. Handig in gebruik zijn AddLoad (nog snel iets toevoegen), CapDosing (capsules voor specifieke stoffen zoals wol) en de SoftCare-trommel die kleding wat zachter behandelt.

In de LG F4X1009NWB kun je 9 kilo wasgoed kwijt. Voor snelle wasjes is er een Quick 30-programma. Je kunt ook koud wassen. Je kiest verder uit programma's als Eco, Cotton, Easy Care, Wool en Sports, met Tub Clean om de trommel schoon te houden. De trommel is van roestvrij staal en de motor is koolborstelloos, wat meestal zorgt voor minder slijtage. Spa Steam (stoomfunctie) is er voor een hygiënischere was en de machine heeft vuilherkenning om de wasbeurt beter op de lading af te stemmen. Handig: je kunt deze wasmachine aan de ThinQ-app koppelen, voor bediening op afstand..

 De Hisense WF5I8043BWF is een smalle wasmachine met 8 kg vulgewicht en een diepte van 47 cm. Dat maakt hem interessant als je weinig ruimte hebt, maar wel een normale trommelinhoud wilt. Met 1400 toeren centrifugeert hij stevig. Voor snelle wasbeurten heb je Power Wash 39' en 59' en een Quicker Wash-optie die de wastijd inkort. Daarnaast is er een stoomfunctie voor kleding die je hygiënischer wilt opfrissen of net wat frisser uit de trommel wilt halen. Deze wasmachine heeft energielabel A met een extra marge (A(-30%)). Bedienen kan op het display, maar je kunt hem ook via wifi koppelen aan de ConnectLife-app om de was op afstand te starten, de voortgang te volgen en meldingen te krijgen.

De Samsung WW90CGC04AAHEN is een wasmachine met 9 kg vulcapaciteit. EcoBubble mengt water en wasmiddel tot schuim, zodat het wasmiddel sneller in de stof kan trekken. Voor snelle wasjes zit er een QuickWas 15'-programma op, bedoeld voor kleine ladingen die vooral een opfrisbeurt nodig hebben. Ook fijn: je houdt de trommel zelf schoon met Drum Clean. Qua energie zit dit model volgens Samsung op energieklasse A met een extra marge (A-10%), en via SmartThings kun je AI Energy Mode gebruiken om bij 20-40 °C zuiniger te wassen en je verbruik bij te houden. Daarnaast krijg je programma's als hygiënisch stomen (tegen bacteriën en allergenen) en een microplastic-programma dat is bedoeld om vezelverlies bij synthetische kleding te beperken.