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
Waarom je monitor op het moederbord aansluiten je pc vertraagt
© Provokator
Huis

Waarom je monitor op het moederbord aansluiten je pc vertraagt

Je sluit je nieuwe monitor aan, de pc start op, maar de prestaties in zware programma's en games vallen vies tegen. In dit artikel ontdek je waarom de aansluiting op je moederbord de grafische kracht van je computer negeert en hoe je dat direct oplost voor maximale rekenkracht.

Het is een klassieke fout bij het opbouwen van een werkplek: de videokabel in het eerste gat steken dat je tegenkomt aan de achterzijde van je computerkast. Vaak belandt de kabel dan in een van de poorten van het moederbord, terwijl de krachtige videokaart een verdieping lager ongebruikt blijft. Dit misverstand ontstaat omdat beide aansluitingen identiek ogen, maar de interne route die de data aflegt verschilt als dag en nacht. Daarom leggen we je uit hoe je het volledige potentieel van je hardware benut en waarom die extra investering in je grafische kaart anders weggegooid geld is.

De interne omweg via de processor

Als je de HDMI- of DisplayPort-kabel in het moederbord plugt, dwing je de computer om de geïntegreerde grafische chip van de processor te gebruiken (mits die is ingeschakeld via het BIOS). Wij hebben dat uiteraard nog even getest en merkten dat alles inderdaad veel minder soepel aanvoelt zodra de processor deze dubbelrol moet vervullen. In plaats van dat de data direct naar de gespecialiseerde kernen van de videokaart gaat, moet de processor nu zowel de algemene berekeningen als de visuele output verwerken.

Dat veroorzaakt een een hoop warmte in de behuizing en de ventilatoren van de CPU beginnen sneller te loeien om de extra last op te vangen. Het is al met al een onhandige route waarbij de dure videokaart onderin je kast simpelweg geen signaal doorgeeft aan je scherm.

©stas_malyarevsky

Hier moet je de HDMI-kabel dus níét in steken als je de beste prestaties wilt.

Aansluiting heeft wel degelijk een functie

Er zijn echter specifieke scenario's waarin deze aansluiting juist je beste vriend is, bijvoorbeeld tijdens het stellen van een diagnose als er iets opeens niet werkt. Als je pc bijvoorbeeld geen beeld geeft via de videokaart, is inpluggen op het moederbord de enige manier om te controleren of de rest van je systeem nog wel functioneert.

Ook voor een eenvoudige kantoormonitor, die alleen wordt gebruikt voor tekstverwerking en e-mail, volstaat de interne chip van de processor en is een dedicated videokaart niet eens nodig. Deze route bespaart energie en houdt de pc stiller, omdat de zware videokaart (als die er is) in een diepe slaapstand kan blijven. Voor een secundair scherm waarop je alleen statische informatie zoals een chatvenster of Spotify in beeld hebt, kan deze configuratie zelfs een slimme manier zijn om de hoofdvideokaart te ontlasten van onnodige basistaken.

Verlies grafische rekenkracht

Zodra je echter een zware taak start, zoals videobewerking of een moderne game, loopt de pc direct tegen een muur aan. De geïntegreerde graphics hebben namelijk geen eigen snel geheugen en snoepen zodoende rekenkracht van het werkgeheugen van je systeem. Je merkt dat aan haperende beelden, een lage framerate en textures die traag laden.

Zo kan het gebeuren dat een krachtige gaming-pc, die normaal gesproken honderd frames per seconde (100 fps) haalt, via de moederbordaansluiting terugvalt naar een onwerkbare diavoorstelling van minder dan 10 fps. De hardware is aanwezig, maar de snelweg naar het scherm is afgesloten, waardoor je in feite maar een fractie van de capaciteit krijgt waarvoor je hebt betaald.

Situaties waarin je deze aansluiting sowieso moet vermijden

Het aansluiten op het moederbord is een absolute dealbreaker voor iedereen die met visuele content werkt of veeleisende games speelt. Als je voor honderden euro's een videokaart hebt aangeschaft, is het een kostbare vergissing om de monitor ergens anders in te pluggen.

Ook bij het gebruik van een 4K-monitor kan de interne chip de verversingssnelheid vaak niet bijbenen, waardoor je naar een schokkerig beeld zit te kijken terwijl je hardware veel vloeiender kan presteren. Voor creatieve professionals die software gebruiken voor 3D-rendering is het gewoon onmogelijk om te werken; de software zal vaak zelfs een foutmelding geven omdat de benodigde grafische bibliotheken niet worden ondersteund door de standaard processor-chip.

De snelle poorten zitten meestal verder naar onderen en zijn doorgaans horizontaal gepositioneerd.

Zo vind je de juiste poort

Kijk eens goed naar de achterkant van je computerkast om te bepalen of je de volle snelheid benut. De aansluitingen van het moederbord staan altijd verticaal in een blok met andere poorten, zoals usb en ethernet. De aansluitingen van de videokaart zitten een stuk lager en staan horizontaal in een aparte sleuf. Zit je kabel in het bovenste blok, dan werk je op de 'reservemotor'.

Verplaats de kabel naar de horizontale poorten onderaan en je zult direct horen dat de pc anders reageert bij het opstarten. Soms moet je na deze wissel de pc even herstarten, zodat de drivers de nieuwe configuratie herkennen en de resolutie optimaal kunnen instellen voor jouw specifieke beeldscherm.

Klaar voor optimale prestaties?

Het aansluiten van een monitor op het moederbord in plaats van de videokaart zorgt ervoor dat de grafische rekenkracht van de pc onbenut blijft omdat het systeem terugvalt op de beperkte interne chip van de processor. Dat leidt tot een drastische afname in prestaties bij games en zware software, aangezien de gespecialiseerde hardware van de videokaart volledig wordt gepasseerd. Voor een optimale ervaring moet je de monitor altijd in de horizontale poorten van de videokaart prikken. Alleen in noodgevallen of bij eenvoudiger kantoortaken is de moederbordaansluiting een bruikbaar alternatief.

▼ Volgende artikel
Bespaar nu al op de nieuwste Samsung Galaxy bij Belsimpel!
Huis

Bespaar nu al op de nieuwste Samsung Galaxy bij Belsimpel!

Nu de presentatie van de nieuwe Samsung Galaxy-topreeks nadert, draait de geruchtenmolen op volle toeren. Terwijl de techwereld uitkijkt naar de officiële onthulling op 25 februari, rijst de vraag hoe jij deze smartphone als eerste in huis haalt zonder meteen de hoofdprijs te betalen. Bij Belsimpel staat de deur al op een kier voor vroege vogels die willen profiteren van scherpe kortingen.

Partnerbijdrage - in samenwerking met Belsimpel

Het mag geen verrassing zijn dat Samsung dit jaar vol inzet op wat zij noemen 'een nieuw tijdperk voor AI', waarbij de hardware volledig in dienst staat van slimme software. Of je nu razendsnel tekst wilt vertalen of je foto’s naar een professioneel niveau wilt tillen zonder ingewikkelde bewerkingsprogramma’s, de nieuwe generatie toestellen is ontworpen om dit soort processen vloeiender dan ooit te laten verlopen. De relevantie van deze upgrade zit 'm vooral in de naadloze integratie van AI in je dagelijkse handelingen, waardoor je telefoon proactief met je meedenkt in plaats van alleen commando's uitvoert.

Haal deze nieuwe Galaxy S via Belsimpel als eerste in huis!

©Samsung

Komende woensdag wordt bekend hoe de opvolger van de Galaxy S25 er uit zal zien.

Krachtige techniek onder de motorkap

Achter de vertrouwde schermen schuilt een flinke dosis nieuwe rekenkracht. Voor de Europese markt wijzen alle signalen op het gebruik van de eigen Exynos 2600-chip, die qua prestaties niet onderdoet voor de krachtigste processors van de concurrentie. In de praktijk betekent dit dat apps sneller opstarten en zware taken, zoals het renderen van video’s of intensief gamen, moeiteloos worden afgehandeld.

Het meest opvallende aan de nieuwe Ultra-variant is de mogelijke overstap naar de Snapdragon 8 Elite Gen 5, die met een indrukwekkende kloksnelheid van 4,74 GHz de absolute top van de markt opzoekt. Gecombineerd met een standaard opslagcapaciteit die is verdubbeld naar 256 GB heb je direct genoeg ruimte voor al je media en applicaties zonder dat je je zorgen hoeft te maken over een volgelopen geheugen.

Visuele beleving voor elk moment

De visuele ervaring blijft een speerpunt met drie verschillende schermformaten die variëren van handzaam tot gewoon lekker groot. Of je nu kiest voor de reguliere 6,3-inch variant of het indrukwekkende 6,9-inch scherm van de Ultra, de variabele verversingssnelheid zorgt ervoor dat animaties altijd vloeiend ogen terwijl de batterij wordt gespaard tijdens het lezen van tekst.

Voor de fotografieliefhebber brengt de nieuwe generatie verbeterde camerasoftware, die ruis minimaliseert en details verscherpt, zelfs als de lichtomstandigheden verre van ideaal zijn. Met de mogelijkheid om video's in 8K-resolutie op te nemen, leg je herinneringen vast in een kwaliteit die nog wel even mee kan.

©Samsung

Ook de Galaxy S25 Ultra krijgt dit jaar uiteraard een opvolger.

Welke moet je hebben?

Het vinden van de juiste match hangt natuurlijk af van hoe je je toestel gebruikt. Voor de gebruiker die veel onderweg is en waarde hecht aan een compact toestel dat makkelijk met één hand te bedienen is, blijft het basismodel de meest logische keuze. Wie echter de grenzen van mobiele fotografie wil opzoeken of een groot canvas nodig heeft voor werk en entertainment, vindt in de Ultra-opvolger de nodige extra's, zoals een groter diafragma voor superieure nachtfotografie. Het Plus-model vormt hierbij de gulden middenweg voor wie een groot scherm wenst zonder direct over te stappen naar de meest geavanceerde (camera)technologie.

Direct profiteren van persoonlijke voordelen

Het omarmen van al deze nieuwe technologie hoeft niet ingewikkeld te zijn. Belsimpel maakt de overstap extra aantrekkelijk door een systeem van persoonlijke kortingscodes aan te bieden aan iedereen die zich vooraf inschrijft. Hierdoor combineer je het voordeel van de nieuwste hardware met een direct financieel extraatje.

Wanneer je je aanmeldt bij Belsimpel , ontvang je niet alleen toegang tot exclusieve prijzen, maar profiteer je ook van 200 euro opslagvoordeel en een cashback van 30 euro. De ideale manier om direct bij release de beste deal te bemachtigen voor jouw nieuwe dagelijkse compagnon.

Klaar voor de opvolger?

Meld je hier vast aan voor extra voordeel!

Jouw weg naar de nieuwe Galaxy

De officiële onthulling vindt plaats op 25 februari om 19.00 uur Nederlandse tijd. Je kunt dit evenement live volgen via de kanalen van Belsimpel, waarbij je ook nog eens kans maakt om een van de nieuwe toestellen te winnen. Door je nu alvast in te schrijven via de actiepagina van Belsimpel, verzeker je jezelf van de hoogste korting en ben je als een van de eersten op de hoogte van alle officiële specificaties.

De opvolgers van de Samsung Galaxy S25-serie bieden met de Exynos 2600-chip en uitgebreide AI-functies een krachtige upgrade voor elke gebruiker. Dankzij een verdubbelde standaardopslag van 256 GB en geavanceerde camera-opties met 8K-video is het toestel volledig voorbereid op de toekomst. Door je vooraf in te schrijven bij Belsimpel, profiteer je van exclusieve kortingen tot wel 230 euro! Het Galaxy Unpacked-evenement op 25 februari markeert het officiële startpunt van dit nieuwe AI-tijdperk.

Maak je ecosysteem compleet!

Naast de nieuwe smartphones onthult Samsung op 25 februari ook de langverwachte opvolgers van de Galaxy Buds 3 Pro. Of je nu op zoek bent naar nog betere ruisonderdrukking of een kristalhelder geluid voor je favoriete playlists, deze nieuwe oortjes zijn ontworpen om naadloos samen te werken met de nieuwste Galaxy-toestellen. Goed nieuws voor wie direct wil upgraden: ook op deze nieuwe Buds geeft Belsimpel direct bij de lancering een hoge korting. Zo geniet je niet alleen van de nieuwste techniek in je broekzak, maar ook van de beste audio-ervaring in je oren tegen een extra scherpe prijs!