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
Document beschermen in Word: zo voeg je een watermerk toe
© ID.nl
Huis

Document beschermen in Word: zo voeg je een watermerk toe

Je document is af, maar je wilt duidelijk maken dat het vertrouwelijk is of dat het een conceptversie betreft of enkel intern mag worden gedeeld. Dat kan eenvoudig met een watermerk. Zo geef je het bestand niet alleen een professionele uitstraling, maar ook een duidelijke bescherming.

Dit gaan we doen

In dit artikel laten we zien hoe je in Word een watermerk toevoegt. Eerst plaatsen we een watermerk op één specifieke pagina, daarna op alle pagina's tegelijk. Tot slot leggen we uit hoe je een afbeelding gebruikt als watermerk en hoe je zorgt dat de tekst goed leesbaar blijft.

Lees ook: Meer dan alleen Word: verborgen parels in Microsoft 365

Stap 1: Op één pagina

Word biedt uitgebreide mogelijkheden om een watermerk toe te voegen. Je kunt niet alleen het lettertype en de stijl aanpassen, maar ook de lay-out naar wens instellen. Net als kop- en voetteksten verschijnt een watermerk standaard op alle pagina's van een document, behalve op de omslagpagina. Wil je een watermerk slechts op één pagina plaatsen? Klik dan op de gewenste plek in het document. Ga vervolgens in het lintmenu naar het tabblad Ontwerpen en kies in de sectie Pagina-achtergrond de knop Watermerk. Via het pijltje eronder krijg je verschillende lay-outs te zien. Klik met de rechtermuisknop op de gewenste optie en selecteer Invoegen op huidige documentpositie. Het watermerk verschijnt direct in zachtgrijs onder de tekst. Omdat het in een tekstvak staat, kun je het eenvoudig bewerken. Pas de tekst aan, wijzig het lettertype en geef het de gewenste stijl, net zoals bij ieder ander tekstvak.

Het watermerk wordt als een tekstvak onder de inhoud geplaatst.

Stap 2: Op alle pagina's

Wil je een watermerk op alle pagina's van het Word-document? Ga dan naar Ontwerpen / Watermerk / Aangepast watermerk. Er verschijnt een venster met de titel Afgedrukt watermerk. Kies daar de optie Tekstwatermerk (standaard staat Geen watermerk geselecteerd). Vul de gewenste tekst in en bepaal het lettertype en de grootte. Met de optie Semitransparant maak je het watermerk subtieler. Tot slot kies je voor een horizontale of diagonale weergave, klik je op Toepassen en bevestig je met OK.

Gebruik de functie Afgedrukt watermerk om het watermerk op alle pagina's te plaatsen.

Stap 3: Afbeeldingswatermerk

In hetzelfde venster kun je ook een afbeeldingswatermerk toevoegen. Vink hiervoor de optie Afbeelding als watermerk aan en klik op Afbeelding selecteren. Je kiest vervolgens een grafisch bestand op de harde schijf of op OneDrive. Ook is het mogelijk om via Bing online naar een afbeelding te zoeken. In dit voorbeeld kiezen we een afbeelding van de harde schijf. Laat de instelling Schaal bij voorkeur op Automatisch staan, zodat de grootte van het watermerk zich aanpast aan de bladspiegel. Met de optie Wassen maak je de afbeelding lichter, zodat de tekst goed leesbaar blijft.

De optie Wassen maakt de gekozen afbeelding lichter.
▼ Volgende artikel
Wat doet de stoomfunctie van een wasmachine en wanneer heeft het zin?
© Octopus16 - stock.adobe.com
Huis

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

De stoomfunctie is inmiddels op veel wasmachines te vinden. Fabrikanten gebruiken deze techniek vooral om kreuk te verminderen, geurtjes aan te pakken en kleding snel op te frissen. De werking is vrij simpel. De machine verhit een kleine hoeveelheid water en laat de stoom op een precies moment in de trommel. Dat kan tijdens een normaal wasprogramma of via een apart stoomprogramma. Die twee toepassingen hebben elk een ander effect, waardoor het handig is om het verschil te kennen.

In dit artikel

De stoomfunctie op een wasmachine klinkt handig, maar wat doet deze functie nu precies? Je leest hoe stoom wordt ingezet tijdens wasprogramma's en opfrisbeurten, wat het effect is op kreuk en geurtjes en wanneer een hygiëneprogramma zin heeft. Ook leggen we uit wat je er in de praktijk van kunt verwachten.

Lees ook: Ecostand op wasmachines: hoe werkt dat en wat bespaar je ermee?

Hoe stoom tijdens een wasprogramma werkt

Bij de meeste wasprogramma's wordt stoom in de laatste fase ingezet. De warme damp ontspant de vezels, waardoor de was minder gekreukt uit de trommel komt, vaak nog voordat het centrifugeren begint. Dat effect zie je vooral bij synthetische stoffen en gemengde materialen. Katoen blijft gevoeliger voor kreuk en reageert minder sterk op stoom. Ook de belading speelt een rol. Zit de trommel vol, dan kan de stoom minder goed bij het wasgoed komen en is het effect dus kleiner.

De manier waarop stoom wordt verspreid, verschilt per wasmachine. Sommige modellen blazen de damp van bovenaf in de trommel, andere via de bodem. Het principe is hetzelfde, maar de maar de manier waarop de damp door de trommel wordt verspreid varieert per merk. Belangrijk om te weten is dat stoom het water en het wasmiddel niet vervangt Het ondersteunt de was, maar maakt stoffen niet op zichzelf schoon.

View post on TikTok

Extra hygiëne met een stoomprogramma

Naast stoom tijdens een gewone wasbeurt beschikken veel machines ook over aparte hygiëneprogramma's. Deze werken met een gecontroleerde temperatuur die hoog genoeg is om allergenen te verminderen, maar lager blijft dan bij een kookwas. Vooral pollen en huisstofmijt worden op deze manier aangepakt. Fabrikanten noemen soms percentages voor bacteriereductie, al zijn die gebaseerd op tests met kleine lapjes stof. In een volle trommel valt het effect lager uit. Stoom vormt daarmee vooral een extra aanvulling: hygiënischer dan een koud opfrisprogramma, maar geen volwaardige vervanging van een intensieve wasbeurt.

Kleding opfrissen zonder wasbeurt

Het opfrisprogramma is voor veel mensen de meest gebruikte toepassing van stoom. De trommel draait hierbij rustig, terwijl de stof warm en licht vochtig blijft. Stoom-opfrisprogramma's duren meestal zo'n 20 tot 30 minuten, afhankelijk van het merk, de vulling van de trommel en het gekozen programma. Sommige machines geven precies 20 minuten aan, bij andere loopt het op tot ongeveer een half uur. Geuren die zich in textiel vastzetten, zoals rook, kooklucht of andere vervelende geurtjes die in textiel zijn blijven hangen, verdwijnen doorgaans goed. Vlekken en vetresten worden hiermee niet verwijderd. De techniek werkt vooral bij kleding die je kort hebt gedragen en verder schoon is. Doordat er weinig water wordt gebruikt en de trommel minder intensief beweegt, blijft de belasting voor de stof beperkt.

Energieverbruik en slijtage van kleding

Het maken van stoom kost warmte en dus energie. Toch ligt het totale verbruik meestal lager dan bij een volledige wasbeurt, omdat er nauwelijks water door de machine stroomt. Voor kleding is een stoomprogramma relatief mild. De vezels worden minder zwaar belast dan tijdens een normale was, al kunnen elastische materialen bij zeer frequent gebruik gevoeliger reageren op warmte. Dat effect verschilt per stof en per merk.

©Sergei Klopotov

Wat stoom wel én niet doet

De stoomfunctie werkt vooral in specifieke situaties. Kreukvermindering zie je vooral bij synthetische stoffen en een niet te volle trommel. Hygiëneprogramma's helpen allergenen te verminderen, maar vervangen niet de klassieke wasbeurt. Opfrisprogramma's verwijderen geuren, maar laten vlekken ongemoeid. In de praktijk levert stoom vooral gemak op. Je hoeft minder te strijken, kleding blijft langer fris en je kunt een kort programma gebruiken voor was die nog niet echt vies is.

Conclusie

De stoomfunctie is een handige aanvulling op de gewone was. Kleding komt frisser uit de trommel, je kunt kleding vaker dragen zonder dat je een compleet wasprogramma  hoeft te dragen en de extra hygiëne van stoom is ideaal tegen allergenen. De techniek neemt de rol van water en wasmiddel niet over, maar stoom voegt wel extra gemak toe voor wie minder wil strijken en kleding langer mooi wil houden.

Echte wasmachinereviews, van echte consumenten

Op Review.nl kun je lezen wat echte gebruikers vinden van producten. Weten wat hun oordeel over de nieuwste wasmachines van Samsung, LG en Haier is? Lees hier de Review.nl-wasmachine-testresultaten. P.S. Je kunt je ook zelf aanmelden om de nieuwste producten te testen!

 5x Wasmachines met stoomfunctie

De Hisense WF3S9043BW3/BLX is een moderne wasmachine die opvalt door zijn opvallend lage energieverbruik, met een label dat maar liefst 30% zuiniger is dan de standaard A-klasse. Met een trommelinhoud van 9 kilogram biedt het apparaat voldoende ruimte voor de was van een groot gezin. De machine haalt een toerental van 1400 rotaties per minuut en zet stoom in voor een extra diepe, hygiënische reiniging van het textiel. Voor wie weinig tijd heeft, zijn er handige opties zoals het Power Wash-programma van 49 minuten of een ultrakorte cyclus van een kwartier.

De Samsung WW11DB7B34GBU3 Bespoke EcoBubble heeft een trommelcapaciteit van 11 kilogram. Voor een diepgaande reiniging beschikt de machine over een gespecialiseerd stoomprogramma dat afrekent met allergenen en bacteriënt. Naast de fysieke prestaties biedt het apparaat slimme functies via de SmartThings-app. Dankzij de EcoBubble-technologie wordt het wasmiddel krachtig de stof in geblazen, waardoor kleding ook op lagere temperaturen grondig schoon wordt en de kwaliteit van het textiel behouden blijft.

De AEG LR7604UC4 uit de 7000-serie (vulgewicht 10 kilo) is ontworpen om kleding langer mooi te houden door vaker te stomen in plaats van te wassen, wat slechts twee liter water per cyclus verbruikt. Met het Steam Refresh-programma zijn muffe geurtjes en kreukels binnen 25 minuten verdwenen, terwijl de UniversalDose-lade ervoor zorgt dat wasmiddelcapsules sneller oplossen voor een beter resultaat bij koude wasbeurten. De PreciseWash-technologie optimaliseert de instellingen automatisch op basis van het gewicht, wat een besparing tot 40% op tijd en energie oplevert bij kleinere ladingen. Voor de dagelijkse was biedt het MixLoad-programma een snelle oplossing door gemengd textiel in 69 minuten grondig te reinigen op slechts 30 graden.

De Siemens WG44G2ZWNL (vulcapaciteit 9 kilo) heeft een zeer zuinig energielabel A en biedt dankzij het speedPack L maximale tijdsbesparing. Voor hardnekkige vlekken past het antiVlekken-systeem de temperatuur en spoeltijd automatisch aan. De stoomfunctie, genaamd smartFinish, strijkt zelfs sterk gekreukte items in slechts 20 minuten glad. De innovatieve waveTrommel zorgt ervoor dat zijde en andere fijne stoffen behoedzaam worden behandeld. Dankzij de koolborstelloze iQdrive-motor is de machine niet alleen stil en efficiënt, maar ook nagenoeg slijtagevrij.

De Bosch Serie 4 WAN282E4FG (vulgewicht 8 kilo) is een uiterst efficiënte wasmachine met energielabel A. Met de Iron Assist-functie wordt kleding gedurende 20 minuten met stoom behandeld, wat kreukels tot wel 50% vermindert. Sensoren van Active Water Plus zorgen ervoor dat het waterverbruik exact wordt afgestemd op de hoeveelheid wasgoed, terwijl de SpeedPerfect-optie de wastijd met 65% verkort voor een snelle, schone resultaat. Voor extra hygiëne doodt het Hygiene Plus-programma bacteriën al op 40 graden, wat ideaal is voor babykleding of mensen met een allergie. De bijvulfunctie maakt het mogelijk om een vergeten kledingstuk tijdens de wasbeurt alsnog toe te voegen.

Wasmiddel!

(groot inkopen, dan grijp je nooit mis)