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
Review Poco F8 Ultra – Toptoestel zodra de prijs zakt
© Wesley Akkerman
Huis

Review Poco F8 Ultra – Toptoestel zodra de prijs zakt

De smartphones van Poco zijn over het algemeen goed geprijsd als je kijkt naar wat je ervoor terugkrijgt. De nieuwe Poco F8 Ultra heeft een prijskaartje van minimaal 800 euro. Gaat die regel ook hier op?

Uitstekend
Conclusie

De Poco F8 Ultra oogt uniek, vindt in de subwoofer een handige toevoeging en voelt stevig aan. De door ons geteste Denim Blue-uitvoering heeft bovendien een faux denimlaagje op de achterkant voor extra grip (wat deze variant een paar gram zwaarder maakt dan de zwarte versie). Wel plaatsen we wat kanttekeningen bij de software- en camera-ervaring. De prijs is misschien gevoelsmatig nog wat hoog, zeker voor dit merk. Maar zakt de prijs richting de 600 euro, dan krijg je een toptoestel dat zijn prijs meer dan waarmaakt en waar je langdurig plezier van hebt.

Plus- en minpunten
  • Bose-subwoofer
  • Faux denim achterop
  • Stevig, handzaam en licht
  • Vlotte en overzichtelijke software
  • Gemiddeld tot goed softwarebeleid
  • Batterijduur
  • Kleuren kunnen beter
  • Camera laat te wensen over
  • Bloatware en advertenties
CategorieSpecificatie
Display6,9 inch Amoled-display, 120Hz (adaptief), 3500 nits maximale helderheid
ProcessorSnapdragon 8 Elite Gen 5 (3nm)
Geheugen12 GB of 16 GB LPDDR5X (9600 Mbps)
Opslag256 GB of 512 GB (UFS 4.1)
Batterij6500 mAh met 100W HyperCharge en 50W draadloos laden
Camera achter50 MP hoofdcamera (OIS), 50 MP periscooptelelens (OIS), 50 MP ultragroothoek
Camera voor32 MP met autofocus
VideoTot 8K op 30 fps (achter) / 4K op 60 fps (voor)
SoftwareXiaomi HyperOS 3
BouwIP68 waterbestendig, POCO Shield Glass, 218 (Black) - 220 gram (Denim Blue)
Connectiviteit5G, Wifi 7, Bluetooth 6.0, NFC
Extra'sUltrasone vingerafdrukscanner, Infrarood (IR-blaster), Bose audio

Want wat voor smartphone kun je precies aanbieden als je er net wat meer geld tegenaan gooit? Dat idee heeft een unieke telefoon opgeleverd, voorzien van een denimlook én een extra subwoofer achterop. Gewaagde keuzes, maar in een wereld waarin smartphones steeds meer naar elkaar toe groeien, en in hun identiteitscrisis meer en meer op iPhones gaan lijken, geen verkeerde ontwikkeling. Alleen daarom al zijn we enthousiast over de Poco F8 Ultra (Blue Denim-uitvoering).

Het helpt dan ook zeer dan de subwoofer daar niet alleen voor de show zit. Dit compacte speakertje geeft geluiden en audio meer dan genoeg ruimte om beter tot hun recht te komen vergeleken met reguliere smartphonespeakers. Weg is dat blikkige geluid, dat nu ruimte maakt voor warmere tonen en een bredere soundstage. Klinkt de muziek perfect? Dat kun je niet verwachten, maar we zijn desondanks onder de indruk van de Bose-luidspreker.

©Wesley Akkerman

Uniek en tof

De Poco F8 Ultra ligt prettig in de hand en voelt solide aan dankzij het aluminium frame. Met 220 gram is hij ook niet overdreven zwaar. Het fauxdenim op de achterkant draagt daarbij merkbaar bij aan de grip, waardoor hij niet snel uit je handen glipt. Juist door dat eigenzinnige uiterlijk is dit zo'n smartphone die je liever zonder hoesje gebruikt, ook al loop je daarmee iets meer risico op valschade.

Het grote amoled-paneel van 6,9 inch stelt evenmin teleur. Met zijn hoge resolutie (1.200 bij 2.608 pixels) en verversingssnelheid (120 Hertz) kom je niets tekort en oogt alles scherp en vlot. Het contrast is breed en zwartwaarden zijn diep, maar de kleuren kunnen soms net even wat flets ogen. Dat valt alleen op in directe vergelijkingen met andere smartphones; de kans is heel klein dat dit je hier iets van merkt in het dagelijkse gebruik of als je een minder geoefend oog hebt.

©Wesley Akkerman

©Wesley Akkerman

Wat je mag verwachten

Ook al draait de Poco F8 Ultra niet op de krachtigste processor die Qualcomm te bieden heeft, in de praktijk merk je daar weinig van. De Snapdragon 8 Elite Gen 5 voelt vlot aan bij multitasking en kan games zonder moeite aan, al moet je er wel rekening mee houden dat de Gen 5 warm (niet heet, gelukkig) kan worden wanneer je high-end spellen speelt. Niets om je zorgen over te maken, je zult hier namelijk je vingers niet aan branden.

Ook de accu stelt niet teleur. Met een capaciteit van 6.500 mAh haal je in veel gevallen probleemloos twee dagen, al hangt dat vanzelfsprekend af van hoe intensief je de smartphone gebruikt. Speel je veel games, dan loopt hij sneller leeg, maar opladen gaat razendsnel. Met een geschikte 100w-lader, die je zelf moet aanschaffen, zit de accu binnen ongeveer veertig minuten weer helemaal vol.

0,7x

1x

2x

Camera en software

Toch is niet alles goud wat er blinkt. Onder de juiste lichtomstandigheden maakt de Poco F8 Ultra kleurrijke en gedetailleerde beelden. Zoomen is geen probleem en ook de selfiecam lijkt goed om te gaan met verschillende huidtypen. De groothoeklens presteert echter minder goed: kleuren komen minder goed uit de verf en details vallen weg. De avondmodus stelt teleur, met een overdaad aan exposure, gebrekkige kleurenaccuraatheid en trage vastlegging.

Aangezien Poco een dochteronderneming is van Xiaomi, draait het toestel op HyperOS 3.0. De Poco staat daardoor vol met overbodige en dubbele apps, waaronder die van Xiaomi, waarvan je het gros kunt verwijderen. Ook kom je her en der wat reclame tegen. Verder is het besturingssysteem vlot en overzichtelijk, twee eigenschappen die we extreem belangrijk vinden. Je krijgt tot slot 'maar' vier Android-upgrades, evenals zes jaar aan beveiligingsupdates.

5x

10x

Poco F8 Ultra kopen?

Ondanks de kanttekeningen die we plaatsen bij de software- en camera-ervaringen, zijn er eigenlijk weinig redenen om niet voor de Poco F8 Ultra te kiezen. Hij oogt uniek, vindt in de subwoofer een handige toevoeging en voelt stevig aan. De door ons geteste Denim Blue-uitvoering heeft bovendien een faux denimlaagje op de achterkant voor extra grip (wat deze uitvoering wel een paar gram zwaarder maakt dan de Poco F8 Ultra Black). De prijs is misschien gevoelsmatig nog wat hoog, zeker voor dit merk. Maar zakt de prijs richting de 600 euro, dan krijg je een toptoestel dat zijn prijs meer dan waarmaakt en waar je langdurig plezier van hebt.

52137934

▼ Volgende artikel
Spatial audio: de zin en onzin van 3D-geluid
© ER | ID.nl
Huis

Spatial audio: de zin en onzin van 3D-geluid

Spatial audio, oftewel ruimtelijke audio, belooft een luisterervaring waarbij het geluid niet alleen van links en rechts komt, maar je volledig omringt. Hoewel de marketingkreten je geregeld om de oren vliegen, is de techniek niet in elke situatie even zinvol. In dit artikel ontdek je wanneer ruimtelijke audio je ervaring verrijkt en wanneer je prima zonder kunt.

Vergeet het statische geluid van je oude vertrouwde stereo-set. Met spatial audio krijgt geluid eindelijk de diepte die het verdient. Dankzij slimme algoritmes die de akoestiek van de echte wereld nabootsen, ontsnapt de audio aan je koptelefoon of soundbar. Geluid beweegt vrij door de kamer, waardoor een helikopter in een film ook echt boven je hoofd lijkt te cirkelen. Het is de overstap van een platte foto naar een hologram, maar dan voor je oren.

Bioscoopervaring thuis

De meest logische toepassing voor spatial audio is zonder twijfel de moderne filmervaring. Wanneer je een blockbuster kijkt die is gemixt in formaten zoals Dolby Atmos, komt de techniek pas echt tot leven. Een helikopter die overvliegt of regen die op een dak klatert, krijgt een verticale dimensie die voorheen onmogelijk was met een standaard hoofdtelefoon of een simpele soundbar.

Voor filmliefhebbers die niet de ruimte hebben voor een volledige surround-installatie met fysieke speakers in het plafond, biedt spatial audio een overtuigend en compact alternatief dat de zogenaamde immersie aanzienlijk vergroot.

Spatial audio in de praktijk

Je komt ruimtelijke audiotechnieken op steeds meer plekken tegen, vaak zonder dat je er specifiek naar hoeft te zoeken. In de filmwereld is Dolby Atmos de absolute standaard, waarbij streamingdiensten zoals Netflix en Disney+ deze techniek inzetten om geluidseffecten via een soundbar dwars door je kamer te laten bewegen.

Muziekliefhebbers vinden soortgelijke ervaringen bij Apple Music en Tidal, waar speciale mixes van bekende albums een breder en dieper geluidsveld bieden dan de originele stereoversie. Ook in de gamingwereld is het inmiddels de norm; Sony gebruikt de Tempest 3D-technologie voor de PlayStation 5 om spelers midden in de actie te plaatsen, terwijl Microsoft met Windows Sonic en Dolby Atmos for Headphones vergelijkbare resultaten behaalt op de Xbox en pc.

©ER | ID.nl

Muziek met een extraatje

Voor muziek is het nut van ruimtelijke audio iets genuanceerder en sterk afhankelijk van de productie. Bij klassieke concerten of live-opnames kan de techniek je het gevoel geven dat je midden in de concertzaal zit, waarbij de akoestiek van de ruimte tastbaar wordt. Ook bij moderne popmuziek die specifiek voor dit formaat is geproduceerd, kunnen artiesten creatiever omgaan met de plaatsing van instrumenten of subtiele geluidseffecten.

Toch blijft voor de purist die zweert bij een eerlijke, ongefilterde weergave van een studio-album de traditionele stereomix vaak de voorkeur genieten, omdat spatial audio de oorspronkelijke balans soms onnatuurlijk kan veranderen.

Gaming en de functionele voorsprong

In de wereld van gaming verschuift de waarde van spatial audio van puur esthetisch naar functioneel. Vooral in competitieve shooters is het horen van de exacte positie van een tegenstander een serieus dingetje. Door gebruik te maken van ruimtelijke audio kun je voetstappen boven, onder of achter je nauwkeurig lokaliseren. Dat geeft niet alleen een intensere spelervaring waarbij je volledig wordt opgeslokt door de spelwereld, maar biedt ook een tactisch voordeel dat met standaard audio simpelweg niet te evenaren is. Hierdoor is de techniek voor fanatieke gamers bijna onmisbaar geworden.

Wanneer kun je het beter uitschakelen?

Ondanks de indrukwekkende demonstraties is spatial audio niet altijd de beste keuze. Voor dagelijks gebruik, zoals het luisteren naar podcasts of het kijken van het journaal, voegt de extra ruimtelijkheid weinig toe en kan het de verstaanbaarheid van stemmen zelfs negatief beïnvloeden. Ook bij oudere opnames die door softwarematige kunstgrepen naar ruimtelijk geluid worden omgezet, ontstaat er vaak een hol en onnatuurlijk resultaat. In dergelijke gevallen is een zuivere stereoweergave nog altijd de meest betrouwbare weg naar een prettige luisterervaring.

Populaire merken voor spatial audio

Verschillende fabrikanten lopen voorop in de adoptie van ruimtelijke audiotechnieken. Apple heeft met de integratie in de AirPods Max en AirPods Pro in combinatie Apple Music de techniek toegankelijk gemaakt voor de massa, terwijl Sony met hun 360 Reality Audio een sterk eigen ecosysteem heeft gebouwd dat vooral schittert bij gaming en specifieke streamingdiensten. Daarnaast is Sonos een dominante speler op het gebied van home-entertainment met soundbars die Dolby Atmos ondersteunen. Bose en Sennheiser zijn eveneens belangrijke namen die met hun geavanceerde algoritmes en hoogwaardige hardware zorgen dat de ruimtelijke beleving ook voor de veeleisende luisteraar geloofwaardig blijft.