ID.nl logo
Zo kun je programmeren in Python - Deel 6
© Reshift Digital
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
Meer grip op je data: zo wis je je Facebook-geschiedenis
© ID.nl
Huis

Meer grip op je data: zo wis je je Facebook-geschiedenis

Alles wat je op Facebook doet, wordt automatisch op de achtergrond opgeslagen. Iedere video die je bekijkt en iedere reactie die je achterlaat, belandt achter de schermen in een archief. Voel je je daar niet prettig bij? Geen paniek: je kunt die geschiedenis bekijken en zelf wissen.

Dit gaan we doen

Facebook bewaart al je acties in een activiteitenlogboek: van bekeken video's tot zoekopdrachten en reacties. In dit artikel zie je waar je dat logboek vindt, hoe je per categorie losse items verwijdert of in één keer een hele reeks wist, en hoe je je zoekgeschiedenis opruimt. Tot slot loop je door de diepere lagen van het logboek, zodat je ook gekoppelde data, zoals je Instagram-zoekopdrachten, weghaalt. 

Lees ook: 20 tips om je online privacy te waarborgen

Activiteitenlogboek

Om je Facebook-geschiedenis te wissen, open je de app in een internetbrowser en klik je rechtsboven op je profielfoto. Kies Instellingen en privacy in het keuzemenu en open vervolgens Instellingen. Scrol in de linkerkolom tot het onderdeel Je activiteit en toestemmingen en dubbelklik op Activiteitenlogboek.

Aan de rechterkant zie je een overzicht van je volledige geschiedenis: livevideo's, bekeken video's, zoekopdrachten, reacties, groepsberichten, opmerkingen, verhalen, pagina-likes, vrienden, inlogsessies en relaties. Al deze informatie vind je netjes in deze rubrieken terug. Blader door het logboek en verwijder wat je liever kwijt dan rijk bent.

Controleer het Activiteitenlogboek en verwijder wat je wilt laten verdwijnen.
View post on TikTok

Item per item of meteen de volledige categorie verwijderen

Het is niet mogelijk om al die geschiedenis in één keer te elimineren. Dat staat Facebook niet toe. Je moet dus elke sectie doorlopen en zien wat tot nu toe is verzameld en wat je wilt verwijderen. Bijvoorbeeld, in de sectie Video's die je hebt bekeken, zie je de lijst van alle filmpjes die je hebt bekeken sinds je je account hebt aangemaakt. Je kunt dus een reis terug in de tijd maken door in deze sectie de knop Weergeven te gebruiken.

Wil je één bepaald item uit de geschiedenis verwijderen, dan klik je op de drie puntjes aan de rechterkant van dat item en kies je de opdracht Verwijderen. Als je de volledige kijkgeschiedenis wilt zappen, scrol je omhoog en selecteer je in dit voorbeeld de knop Kijkgeschiedenis van video wissen.

Het is mogelijk om de volledige kijkgeschiedenis van video in één keer te verwijderen.

Zoekgeschiedenis

Je zoekgeschiedenis kun je ook via een andere route wissen: ga naar Instellingen / Accountcentrum / Je gegevens en toestemmingen / Zoekgeschiedenis. Klik op het pijltje rechts en vervolgens op de blauwe knop Alle zoekopdrachten wissen.

Wil je nog dieper gaan? Open opnieuw het Activiteitenlogboek en klik op Je Facebook-activiteit. Daar verschijnt weer een menu met reacties, berichten, groepen, pagina's, polls en meer. Doorloop elke categorie en verwijder alles wat je definitief kwijt wilt.

Zo wis je in één keer niet alleen je zoekopdrachten op Facebook, maar ook op Instagram.

Ben je juist een mega-fan van Facebook?

Dan wil je dit misschien wel aan de muur
▼ Volgende artikel
Router of powerline-adapter: wat is de beste keuze voor betere wifi?
© ER | ID.nl
Huis

Router of powerline-adapter: wat is de beste keuze voor betere wifi?

Haperende streams en trage downloads op zolder zijn grote ergernissen in veel huishoudens. Om dat op te lossen twijfelen veel mensen tussen een krachtiger router of een set powerline-adapters. In dit artikel leggen we precies uit wanneer je voor welke oplossing moet kiezen, zodat je geen geld verspilt aan de verkeerde apparatuur.

Voordat je naar de winkel rent: je moet eerst begrijpen wat er precies misgaat met je verbinding. Wifi-problemen kun je doorgaans opdelen in twee categorieën: een gebrek aan bereik of een gebrek aan capaciteit. Bij een gebrek aan bereik komt het signaal simpelweg niet ver genoeg, bijvoorbeeld omdat dikke betonnen muren of plafonds het signaal blokkeren. Je hebt dan op zolder één streepje bereik of zelfs helemaal geen verbinding. Bij een gebrek aan capaciteit is het signaal wel sterk, maar is de router niet krachtig genoeg om alle data te verwerken. Dat merk je als het internet traag wordt zodra iedereen thuis tegelijk online is. Het onderscheid tussen deze twee oorzaken bepaalt of je een router of een powerline-adapter nodig hebt.

Wanneer is een nieuwe router de oplossing?

De router is het hart van je thuisnetwerk en regelt al het verkeer. Vaak gebruiken mensen het standaardmodem dat ze van hun internetprovider hebben gekregen, maar deze apparaten blinken zelden uit in prestaties. Een losse, hoogwaardige router kopen is de beste keuze wanneer je merkt dat de verbinding in de buurt van het modem al niet optimaal is of wanneer je regelmatig met veel apparaten tegelijk online bent.

Als je in de woonkamer zit en de verbinding hapert zodra de kids op hun tablets zitten, is je huidige router waarschijnlijk niet krachtig genoeg om al die gelijktijdige datastromen te verwerken. Een moderne router met ondersteuning voor wifi 6 kan veel meer apparaten tegelijk bedienen en zorgt voor een hogere, stabielere snelheid op de verdieping waar hij staat.

©Andrii

Internet via het stopcontact met powerline

Een powerline-adapter, ook wel homeplug genoemd, werkt volgens een totaal ander principe. Dit systeem maakt gebruik van het bestaande stroomnet in huis om het internetsignaal te verplaatsen. Je stopt één adapter in het stopcontact bij je router en de tweede adapter in een stopcontact op de plek waar je internet nodig hebt, bijvoorbeeld op zolder of in het tuinhuis.

Dit is de ideale oplossing wanneer het wifi-signaal door dikke betonnen muren of plafonds moet dringen. Waar wifi-golven afketsen op gewapend beton, stuurt de powerline het signaal simpelweg via de koperdraden in de muur naar boven. Dat maakt powerline-adapters uitermate geschikt voor specifieke 'dode zones' die te ver weg liggen voor het bereik van een gewone router.

Populaire merken voor netwerkoplossingen

Als je op zoek gaat naar powerline-adapters, kom je al snel uit bij Devolo. Dit Duitse merk is de onbetwiste marktleider op het gebied van homeplugs en staat bekend om de Magic-serie die zeer stabiele verbindingen via het stroomnet garandeert.

Voor routers en mesh-systemen is TP-Link een zeer populaire keuze vanwege de goede balans tussen prijs en prestaties, met modellen voor elk budget. Netgear richt zich met de Nighthawk-serie vaak op de veeleisende gebruiker en gamers die maximale snelheid wensen. Tot slot is AVM, bekend van de FRITZ!Box, een merk dat zowel uitstekende routers als powerline-oplossingen biedt die naadloos met elkaar samenwerken in één netwerk.

Stabiliteit versus snelheid

Bij de keuze tussen deze twee speelt ook het gebruiksdoel een rol. Powerline-adapters zijn vaak de favoriete keuze voor gamers of mensen die thuiswerken op een vaste pc. De reden hiervoor is dat de tweede adapter vaak beschikt over een netwerkafsluiting, waardoor je je computer met een kabel kunt aansluiten. Een bekabelde verbinding via powerline is doorgaans stabieler en heeft een lagere vertraging (ping) dan wifi, wat cruciaal is bij online gamen. Een nadeel is wel dat de snelheid van powerline afhankelijk is van de kwaliteit van je stroomnet. Oude bedrading of zware apparaten zoals een wasmachine kunnen storing veroorzaken, waardoor de snelheid soms fluctueert. Een high-end router biedt daarentegen vaak een hogere topsnelheid, maar is dus gevoeliger voor afstand en obstakels.

De opkomst van mesh-systemen

Tegenwoordig is er een hybride oplossing die de traditionele router steeds vaker vervangt: Multiroom Wifi of Mesh. Dit zijn feitelijk meerdere routers die met elkaar communiceren. Als je een groot huis hebt en overal perfecte wifi wilt zonder kabels te trekken, is dit vaak een betere, maar ook duurdere oplossing dan een simpele powerline-set. Kies je echter voor een budgetvriendelijke oplossing om snel internet op één specifieke, lastig bereikbare kamer te krijgen, dan wint de powerline-adapter het vaak op prijs-kwaliteitverhouding. Is je doel echter om de algehele snelheid en capaciteit in de woonkamer en keuken te verbeteren, investeer dan in een goede router.