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

Zo kun je programmeren in Python - Deel 2

Na onze eerste kennismaking met Python is het tijd om wat complexere datastructuren te bekijken: lijsten en dictionary’s. We duiken ook in de structuur van strings, zodat je afzonderlijke letters kunt manipuleren. Start je Python-interpreter maar alvast op!

In de vorige les leerde je met drie datatypes in Python werken: int, float en str. Vooral int en float zijn vrij eenvoudige datatypes. Maar in veel programma’s heb je types met meer structuur nodig, we noemen dit ook wel datastructuren. In dit deel leer je met twee belangrijke datastructuren van Python werken.

Lijsten

In veel programma’s werk je niet met één specifiek gegeven, maar met een hele reeks. Een lijst (in Python list) is daarvoor ideaal. Zo maak je bijvoorbeeld een lijst met namen aan:

>>> namen = ['kees', 'jan', 'pieter', 'jan', 'joris', 'rob']>>> len(namen)

6

>>> lege_lijst = []

>>> len(lege_lijst)

0

De functie len, die we uit de vorige les kennen om de lengte van een string terug te geven, werkt ook op een lijst: dan krijg je het aantal elementen in die lijst.

Overigens kan een lijst elementen van verschillende types bevatten, zoals een float, twee strings en een int. Maar vaak heeft een lijst alleen elementen van hetzelfde type.

Functies, parameters en argumenten

Python deelt heel wat functionaliteit op in functies: stukjes code die een specifieke taak uitvoeren, zoals len om de lengte van een lijst of string op te vragen. Een functie kan een parameter hebben: een variabele waarmee de functie werkt en die als waarde het object krijgt dat je aan die functie doorgeeft. Dat object noemen we het argument van de functie. Een functie kan ook meerdere parameters (en dus argumenten) hebben. In deel 6 leer je je eigen functies definiëren en wordt dit allemaal nog veel duidelijker.

Elementen in een lijst

Python kent ook heel wat mogelijkheden om met de elementen in een lijst te werken. Zo vraag je eenvoudig een element uit de lijst op een specifieke positie (ook ‘index’ genoemd) op:

>>> namen[2]'pieter'

Merk op dat de positie in een lijst vanaf 0 begint te tellen: het eerste element is namen[0], het tweede namen[1], het derde namen[2] enzovoort. Je zou dan denken dat je het laatste element moet opvragen met:

>>> namen[len(namen)-1]'rob'

Dat werkt inderdaad, maar Python laat ook een negatieve positie toe, waarmee je vanachter in de lijst begint te tellen. Het laatste element heeft dan positie -1:

>>> namen[-1]'rob'>>> namen[-2]'joris'

Als je goed hebt opgelet, zie je dat de string ‘jan’ twee keer in bovenstaande lijst zit. Dat aantal keren kun je opvragen met de functie count:

>>> namen.count('jan')2>>> namen.count('pieter')1>>> namen.count('koen')0

Je kunt ook de positie van een element in een lijst opvragen:

>>> namen.index('jan')1>>> namen.index('pieter')2>>> namen.index('koen')Traceback (most recent call last):File "<stdin>", line 1, in <module>ValueError: 'koen' is not in list

Zoals je ziet krijg je een foutmelding (ValueError) als het gevraagde element zich niet in de lijst bevindt. Voor een element dat zich meerdere keren in de lijst bevindt, geeft de functie index alleen de eerste positie terug. Maar je kunt ook vragen om vanaf een specifieke positie te zoeken:

>>> namen.index('jan', 2)3

Een lijst veranderen

Als je een lijst hebt aangemaakt, kun je die nog altijd veranderen. In het eenvoudigste geval verander je bijvoorbeeld één element:

>>> namen['kees', 'jan', 'pieter', 'jan', 'joris', 'rob']>>> namen[1] = 'koen'>>> namen['kees', 'koen', 'pieter', 'jan', 'joris', 'rob']

Je kunt een lijst ook omdraaien of sorteren:

>>> namen.reverse()>>> namen['rob', 'joris', 'jan', 'pieter', 'koen', 'kees']>>> namen.sort()>>> namen['jan', 'joris', 'kees', 'koen', 'pieter', 'rob']

Verder kun je ook een element aan het einde van een lijst toevoegen, of op een specifieke positie tussen de andere elementen voegen:

>>> namen['jan', 'joris', 'kees', 'koen', 'pieter', 'rob']>>> namen.append('aniek')>>> namen['jan', 'joris', 'kees', 'koen', 'pieter', 'rob', 'aniek']>>> namen.insert(0, 'lies')>>> namen['lies', 'jan', 'joris', 'kees', 'koen', 'pieter', 'rob', 'aniek']>>> namen.insert(4, 'mireille')>>> namen['lies', 'jan', 'joris', 'kees', 'mireille', 'koen', 'pieter', 'rob', 'aniek']

Je kunt ook bestaande elementen verwijderen. Zo verwijder je met de functie remove(x) het eerste element waarvan de waarde gelijk is aan x:

>>> namen['lies', 'jan', 'joris', 'kees', 'mireille', 'koen', 'pieter', 'rob', 'aniek']>>> namen.remove('pieter')>>> namen['lies', 'jan', 'joris', 'kees', 'mireille', 'koen', 'rob', 'aniek']>>> namen.remove('pieter')Traceback (most recent call last):File "<stdin>", line 1, in <module>ValueError: list.remove(x): x not in list

Zoals je ziet, krijg je een foutmelding als je vraagt om een element te verwijderen dat niet in de lijst zit.

Je kunt ook een element op een gegeven positie verwijderen. Dat doe je met de functie pop:

>>> namen['lies', 'jan', 'joris', 'kees', 'mireille', 'koen', 'rob', 'aniek']>>> namen.pop(2)'joris'>>> namen['lies', 'jan', 'kees', 'mireille', 'koen', 'rob', 'aniek']

Als je goed hebt opgelet, zie je dat de functie pop niet alleen een element verwijdert, maar op de opdrachtregel ook als waarde het verwijderde element teruggeeft ('joris').

Snijden in een lijst

Python heeft een krachtige manier om een lijst in stukken te snijden: ‘slicing’. Herinner je de notatie [n] voor het n-de element? Met [n:] krijg je de elementen terug vanaf index n, met [:n] de elementen tot index n (niet inbegrepen) en met [m:n] de elementen van index m tot n (die laatste niet inbegrepen). Enkele voorbeelden maken dit duidelijk:

>>> namen = ['lies', 'jan', 'kees', 'mireille', 'koen', 'rob']>>> namen[1:]['jan', 'kees', 'mireille', 'koen', 'rob']>>> namen[:4]['lies', 'jan', 'kees', 'mireille']>>> namen[1:4]['jan', 'kees', 'mireille']

Omdat Python begint te tellen vanaf 0 en in de beginpositie van een slice het element zelf meerekent maar in de eindpositie niet, is de notatie van slicing nogal verwarrend. Het helpt daarom om deze posities te beschouwen als de posities van de komma’s in de lijst, te tellen vanaf 1. Alles tussen de komma’s op die posities is dan de gevraagde slice. Neem bijvoorbeeld namen[1:4]. Omdat namen gelijk is aan ['lies', 'jan', 'kees', 'mireille', 'koen', 'rob'], nemen we alles tussen de eerste en de vierde komma, dus van vóór 'jan' tot ná 'mireille', oftewel ['jan', 'kees', 'mireille'].

Slicing is ook een krachtige manier om een deel van een lijst te veranderen. Zo vervang je eenvoudig voorgaande slice in de lijst door een andere naam:

>>> namen['lies', 'jan', 'kees', 'mireille', 'koen', 'rob']>>> namen[1:4] = ['bas']>>> namen['lies', 'bas', 'koen', 'rob']

Nog eens strings

In een string krijg je net zoals in een lijst toegang tot het n-de element met de notatie [n]. Zo krijg je met 'aniek'[1] het tweede teken van de string 'aniek', of de letter n. Ook slicing werkt bij een string: 'aniek'[1:4] is gelijk aan nie. Maar let op: in tegenstelling tot een lijst kun je een string niet veranderen. De poging 'aniek'[1:4] = 'r' geeft een foutmelding.

Dictionary’s

In een lijst heeft elk element als index zijn positie, zodat je eenvoudig het element op een specifieke positie kunt opvragen. Een andere datastructuur is de ‘dictionary’, die als index voor zijn elementen een sleutel gebruikt, vaak een string of een getal. Elke sleutel van de dictionary moet uniek zijn, zodat je eenvoudig de waarde die bij een specifieke sleutel hoort kunt opvragen.

Een voorbeeld maakt duidelijk hoe je met een dictionary werkt:

>>> scores = {'lies': 5, 'bas': 2, 'kees': 1, 'aniek': 3}>>> scores['aniek']3>>> scores['bert']Traceback (most recent call last):File "<stdin>", line 1, in <module>KeyError: 'bert'>>> len(scores)4

Op deze manier kun je eenvoudig de score van een persoon opvragen op basis van zijn of haar naam. Je ziet hier ook dat je een foutmelding krijgt als je een element opvraagt met een index die niet in de dictionary bestaat.

Een dictionary kun je net zoals een lijst veranderen. Je kunt de waarde bij een specifieke sleutel veranderen, maar je kunt even eenvoudig een nieuw element toevoegen: ken gewoon een waarde toe aan een nieuwe sleutel. Bijvoorbeeld:

>>> scores{'lies': 5, 'bas': 2, 'kees': 1, 'aniek': 3}>>> scores['lies'] += 1>>> scores{'lies': 6, 'bas': 2, 'kees': 1, 'aniek': 3}>>> scores['bert'] = 1>>> scores{'lies': 6, 'bas': 2, 'kees': 1, 'aniek': 3, 'bert': 1}

Een sleutel en de bijbehorende waarde uit de dictionary verwijderen, doe je met het speciale keyword del:

>>> scores{'lies': 6, 'bas': 2, 'kees': 1, 'aniek': 3, 'bert': 1}>>> del scores['kees']>>> scores{'lies': 6, 'bas': 2, 'aniek': 3, 'bert': 1}

Samenvatting

In dit deel zijn we lang stil blijven staan bij een van de meest gebruikte datastructuren in Python: de lijst. De kennis die je hebt opgedaan over lijsten, kun je voor heel wat andere datatypes in Python hergebruiken. Zo toonden we hoe de notatie voor een index en voor ‘slicing’ hetzelfde is bij een string. Een ander belangrijk datatype dat je in dit deel zag, is de dictionary, waarin je geen positie maar een sleutel als index gebruikt. In het volgende deel verlaten we de interactieve Python-sessies en schrijven we onze eerste programma’s.

Opdracht 1

Je hebt de volgende lijst met namen: >>> namen = ['lies', 'jan', 'kees', 'mireille', 'koen', 'rob', 'aniek'] Splits deze lijst in zijn laatste element en de rest van de lijst.

Uitwerking opdracht 1

*>>> namen ['lies', 'jan', 'kees', 'mireille', 'koen', 'rob', 'aniek']

laatste_persoon = namen.pop() namen ['lies', 'jan', 'kees', 'mireille', 'koen', 'rob'] laatste_persoon 'aniek'* Dit is een veel gebruikte toepassing van de functie pop(), die niet alleen het element op een specifieke index verwijdert, maar ook het verwijderde element teruggeeft. Waarschijnlijk heb je deze opdracht opgelost met: laatste_persoon = namen.pop(-1) Maar de -1 is niet nodig: zonder index geeft de functie pop het laatste element terug.

Opdracht 2

Haal uit een string alle tekens behalve het eerste en het laatste.

Uitwerking opdracht 2

*>>> naam = 'aniek'

naam[1:-1] 'nie'* Slicing werkt bij een string exact zoals bij een lijst. Bovendien kunnen we ook gebruikmaken van een negatieve index in slicing: -1 verwijst dan naar het laatste element. Omdat Python begint te tellen vanaf 0 en in de beginpositie van een slice het teken zelf meerekent maar in de eindpositie niet, verwijst de slice [1:-1] dus naar alle tekens in de string behalve het eerste en het laatste.

Cheatsheet

datastructuur: een datatype dat uit elementen bestaat die met elkaar samenhangen. dictionary: een datastructuur waarin je elementen opvraagt aan de hand van een unieke sleutel. index (in een lijst): positie van een element in een lijst, te beginnen vanaf 0. index (in een dictionary): sleutel van een element waarmee het uit een dictionary op te vragen is. lijst: een datastructuur waarin je elementen opvraagt aan de hand van hun positie. slicing: het in stukken snijden van een lijst of string.

▼ Volgende artikel
Wifi wel snel op je telefoon, maar traag op je laptop? Hier ligt dat aan!
© A Stockphoto
Huis

Wifi wel snel op je telefoon, maar traag op je laptop? Hier ligt dat aan!

Je zit op de bank en streamt probleemloos een 4K-video op je telefoon, maar zodra je je laptop openklapt om een webpagina te laden, lijkt het alsof de verbinding vastloopt. Ligt het aan de router of aan je computer? In dit artikel leggen we uit waarom wifi-snelheden zo sterk kunnen verschillen per apparaat en wat je eraan kunt doen.

Je betaalt voor een snelle internetverbinding, dus is de verwachting dat elk apparaat in huis die snelheid ook daadwerkelijk haalt. Toch voelt het surfen op je computer soms stroperig aan, terwijl je smartphone ernaast nergens last van heeft. Vaak wordt er direct naar de internetprovider gewezen, maar het probleem zit meestal in de apparatuur zelf. Het verschil in hardware, leeftijd en software tussen mobiele apparaten en computers is namelijk groter dan je denkt. Na het lezen van dit stuk weet je precies waar die vertraging vandaan komt.

Generatiekloof: waarom je laptop vaak achterloopt

Het snelheidsverschil tussen je telefoon en je computer komt vaak neer op een simpele generatiekloof. We vervangen onze telefoons gemiddeld elke twee tot drie jaar, waardoor ze vaak uitgerust zijn met de nieuwste wifi-chips (zoals wifi 6 of 6E). Een laptop gaat vaak veel langer mee, soms wel vijf tot zeven jaar. Hierdoor probeert een verouderde netwerkkaart in je laptop te communiceren met een moderne router, wat resulteert in een lagere maximumsnelheid.

Daarnaast speelt de manier waarop data wordt verwerkt een grote rol. Een telefoon is geoptimaliseerd voor directe consumptie: apps op de achtergrond worden gepauzeerd om de app die je nú gebruikt voorrang te geven. Een computer werkt anders. Terwijl jij probeert te surfen, kan Windows of macOS op de achtergrond bezig zijn met zware updates, het synchroniseren van clouddiensten of het maken van back-ups. Je laptop snoept dus al bandbreedte weg zonder dat jij het doorhebt, waardoor er voor je browser minder overblijft.

Wanneer je laptop de strijd wél wint

De laptop wint het van de telefoon wanneer de omstandigheden optimaal zijn voor stabiliteit in plaats van pure mobiliteit. Als je beschikt over een moderne laptop met een recente netwerkkaart en je bevindt je in dezelfde ruimte als de router, kan de laptop vaak stabieler grote bestanden binnenhalen.

Dat geldt vooral als je laptop verbonden is met de 5GHz-frequentieband. Deze frequentie is veel sneller dan de oude 2.4GHz-band, maar heeft een korter bereik. Als je dicht bij het toegangspunt zit, profiteert je laptop van zijn krachtigere processor om complexe webpagina's sneller op te bouwen dan een telefoon dat kan, mits de verbinding zelf niet de bottleneck is.

Waarom je telefoon soepeler aanvoelt

Het verschil wordt pijnlijk duidelijk zodra je verder van de wifi-bron af gaat zitten, bijvoorbeeld op zolder of in de tuin. Smartphones zijn vaak agressiever geprogrammeerd om het sterkste signaal te pakken of snel tussen frequenties te schakelen. Veel laptops blijven daarentegen te lang plakken op een zwak 5GHz-signaal of vallen onnodig terug op de trage en vaak overvolle 2.4GHz-band (het zogeheten 'sticky client'-probleem).

Daarnaast hebben smartphones een trucje dat laptops helaas moeten missen: wifi-assist (of een vergelijkbare term). Als de wifi even hapert, gebruikt de telefoon ongemerkt een beetje 4G- of 5G-data om de stroom stabiel te houden. Je laptop heeft die optie meestal niet en laat direct een laadicoontje zien. Hierdoor voelt de telefoon sneller aan, terwijl hij eigenlijk een beetje vals speelt door mobiele data bij te schakelen.

Harde grenzen: wanneer traagheid onvermijdelijk is

Er zijn situaties waarin je laptop de strijd sowieso verliest, ongeacht hoe dicht je bij de router zit. Dit zijn de harde grenzen:

  • Verouderde standaarden: Als je laptop alleen wifi 4 (802.11n) ondersteunt, zul je nooit de snelheden halen van een telefoon met wifi 6 (802.11ax). De hardware kan het simpelweg niet aan.

  • Actieve VPN-verbinding: Veel werklaptops hebben een actieve VPN-verbinding voor beveiliging. Dit vertraagt de internetsnelheid aanzienlijk vergeleken met een 'open' telefoonverbinding.

  • De 2,4GHz-valkuil: In dichtbevolkte wijken is de 2,4GHz-band zo vervuild door signalen van de buren, dat een laptop die hierop vastzit nauwelijks vooruitkomt.

  • Batterijbesparing: Als je laptop niet aan de lader ligt en in Eco-modus staat, wordt de stroom naar de wifi-kaart vaak geknepen, wat direct ten koste gaat van het bereik en de snelheid.

Zo check je of jouw hardware het probleem is

Om te bepalen of je laptop de boosdoener is, moet je eerst kijken naar de verbinding. Klik op het wifi-icoon op je laptop en controleer of je verbonden bent met een 5GHz-netwerk (vaak te zien bij Eigenschappen of netwerkinformatie). Is dat niet het geval en sta je wel dicht bij de router? Dan is je netwerkkaart waarschijnlijk verouderd of staan de instellingen niet goed.

Kijk ook eens kritisch naar je gebruik. Heb je toevallig nog applicaties openstaan zoals Steam, OneDrive of Dropbox? Deze programma's kunnen de verbinding volledig dichttrekken. Op een telefoon gebeurt dit zelden automatisch op de achtergrond. Als je laptop ouder is dan vijf jaar, kan een simpele upgrade met een moderne wifi-usb-dongle het probleem vaak al verhelpen, zonder dat je een hele nieuwe computer hoeft aan te schaffen.

Kortom: leeftijd en software maken het verschil

Dat je telefoon sneller is op wifi dan je laptop, komt meestal doordat telefoons nieuwere netwerkchips hebben en slimmer omgaan met datastromen. Laptops hebben vaak last van zware achtergrondprocessen of blijven hangen op een tragere frequentieband. Daarnaast schakelen telefoons bij zwak wifi soms ongemerkt over op 4G/5G, wat de ervaring vloeiender maakt. Controleer of je laptop op de 5GHz-band zit en sluit zware achtergrondprogramma's af om snelheid te winnen.

▼ Volgende artikel
Tomodachi Life: Waar Dromen Uitkomen arriveert op 16 april
Huis

Tomodachi Life: Waar Dromen Uitkomen arriveert op 16 april

Tomodachi Life: Waar Dromen Uitkomen komt op 16 april uit voor Nintendo Switch.

Dat heeft Nintendo vanmiddag aangekondigd in een speciale Direct-uitzending die om de game draait. Ondanks dat de game voor de eerste Switch verschijnt, zal hij via backwards compatibility ook speelbaar zijn op Nintendo Switch 2.

In de Tomodachi Life-games van Nintendo kunnen spelers zelf Mii-personages creëren en bijvoorbeeld baseren op het uiterlijk van henzelf, vrienden en familie of beroemdheden. Deze Mii's leiden vervolgens hun eigen leven op een eiland, wat allerlei gekke en hilarische situaties oplevert. Spelers kunnen zelf ook invloed uitoefenen op deze verschillende situaties.

Watch on YouTube

Over Tomodachi Life: Waar Dromen Uitkomen

In de Direct-uitzending werd meer informatie gegeven over het aankomende Tomodachi Life: Waar Dromen Uitkomen. Zo is duidelijk dat spelers hun Mii-personages unieke persoonlijkheden, gewoontes en woningen kunnen geven. Spelers kunnen tijdens de game zien waar de personages aan denken, en ze helpen bij problemen. De tijd in de game verstrijkt daarbij net zo snel als in de echte wereld, wat het de moeite waard maakt om het spel op verschillende momenten op te starten.

Het is daarbij mogelijk om de verschillende Mii-personages kennis met elkaar te laten maken, om te zien wat er vervolgens gebeurd. Personages kunnen bijvoorbeeld praten over hun favoriete eten en filmgenres. Het is daarnaast mogelijk om acht Mii-personages bij elkaar in een huis te laten wonen, wat weer unieke reacties van de personages veroorzaakt.

Op het eiland waar de game zich afspeelt kunnen spelers de personages winkels te laten bezoeken. Bijvoorbeeld een supermarkt waar allerlei etenswaren worden verkocht, of de mogelijkheid om kleding en kostuums te kopen. In een speciale marktkraam worden redelijk geprijsde artikelen meerdere malen per dag ververst.

Ook is er een ontwerpatelier, waar spelers verschillende voorwerpen kunnen maken, waaronder kledingstukken, versiering voor huizen en zelfs huisdieren. Het eiland kan sowieso naar eigen smaak worden ingedeeld, met bankjes, bomen, planten en meer.

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.