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
Waar voor je geld: vijf Android-tablets met een 10 inch-scherm en groter
© lev dolgachov
Huis

Waar voor je geld: vijf Android-tablets met een 10 inch-scherm en groter

Bij ID.nl zijn we dol op kwaliteitsproducten waar je niet de hoofdprijs voor betaalt. Een paar keer per week speuren we binnen een bepaald thema naar zulke deals. Zoek je een goede tablet met een lekker groot scherm? We hebben vijf mooie exemplaren voor je gevonden.

Lenovo Tab M11 (ZADA0134SE)

Lenovo bewijst met zijn Tab M11 dat een goede tablet helemaal niet zo veel geld hoeft te kosten. Zo komen diverse onafhankelijke testers op Kieskeurig.nl tot een gemiddelde score van een 9. Vaak benoemde pluspunten zijn onder meer de hoge beeldkwaliteit, de lange accuduur en het goede geluid. Verder vinden gebruikers het prettig dat er al een stylus is inbegrepen. Handig voor wie graag tekeningen of handgeschreven notities maakt. Het lcd-scherm telt 1920 × 1200 pixels. De resolutie is weliswaar wat lager vergeleken met die van duurdere modellen, maar je kunt nog altijd films in Full-HD-kwaliteit streamen. De beelden ogen op het 11inch-scherm dan ook scherp. Ondanks de lage aanschafprijs heeft deze stevige tablet een metalen behuizing.

Voor het opslaan van apps en eigen data bevat de Tab M11 128 GB intern geheugen. Breid dat desgewenst uit met een eigen microSD-kaart van maximaal 1 TB. Het rekencentrum bestaat uit de veelgebruikte MediaTek Helio G88-processor en 4 GB werkgeheugen. Voor basistaken als e-mailen, internetten, webwinkelen en video's streamen is dat ruimschoots voldoende.

Samsung Galaxy Tab S9+ WiFi

Zoek je een krachtige tablet met een groot scherm? De Samsung Galaxy Tab S9+ WiFi heeft amoledscherm van 12,4 inch. Dat is een prettig formaat om bijvoorbeeld de digitale krant te lezen of Netflix-series te bingewatchen. Verder draait de aanwezige Qualcomm Snapdragon 8 Gen 2-processor zijn hand niet om voor zware taken, zoals het spelen van 3D-games of monteren van video's. Deze chipset bevat acht rekenkernen waarvan de snelste cores zijn afgeregeld op een maximale klokfrequentie van 3,36 GHz. In combinatie met 12 GB werkgeheugen kun je vlot op deze tablet werken. Gebruik hiervoor eventueel de bijgesloten drukgevoelige stylus.

Voor beeldbewerkingen komt de respectabele resolutie van 2800 × 1752 pixels goed van pas. Foto's en video's ogen hierop haarscherp. Daarnaast ondersteunt het amoledscherm een vernieuwingsfrequentie van 120 hertz. Je speelt dus snelle games zonder haperingen. De basisuitvoering heeft 256 GB interne opslag. Kies tussen de kleurstellingen grafiet en beige. Je kunt de Galaxy Tab S9+ WiFi ook met 512 GB interne opslag kopen (grafiet/beige). Overigens heeft de waterdichte behuizing een microSD-kaartslot, waardoor je de opslagcapaciteit eenvoudig met maximaal 1 TB kunt uitbreiden.

Xiaomi Pad 6

De Xiaomi Pad 6 is een krachtige tablet die zich richt op zowel entertainment als productiviteit. Het absolute hoogtepunt is het 11-inch WQHD+ scherm met een verversingssnelheid van 144Hz. Dit zorgt voor een aanzienlijk vloeiender beeld. Onder de motorkap vind je een snelle Snapdragon 870-processor, waardoor zware apps en games moeiteloos draaien.

De tablet heeft een luxe, volledig metalen behuizing en vier luidsprekers met Dolby Atmos-ondersteuning voor een ruimtelijk geluid. De accu van 8840 mAh gaat lang mee en laadt snel op (33W). Let wel dat de optionele stylus niet standaard wordt meegeleverd.

Logicom Tab XXL

De naam zegt het al: de Logicom Tab XXL is een grote tablet voor wie graag wat meer ruimte op het scherm heeft. Met het grote 14,1-inch display kijk je comfortabel films en series, lees je makkelijk langere teksten en heb je genoeg overzicht als je meerdere apps tegelijk gebruikt. Hij leent zich goed voor dagelijkse dingen zoals surfen op internet, mailen, videobellen en het gebruiken van bekende Android-apps. Ook voor thuiswerken of studeren is het grote scherm prettig, bijvoorbeeld bij het bekijken van documenten of online vergaderingen.

De camera’s zijn handig voor videogesprekken en snelle foto’s, terwijl wifi en bluetooth het eenvoudig maken om accessoires zoals een koptelefoon of toetsenbord te koppelen. Door de flinke batterij kun je de tablet langere tijd gebruiken zonder steeds naar een oplader te hoeven grijpen. De meegeleverde hoes maakt het geheel net wat praktischer in gebruik, zowel op de bank als aan tafel.

Lenovo Tab P12 (ZACH0112SE)

De Lenovo Tab P12 heeft een schermdiagonaal van 12,7 inch. De resolutie is met 2944 × 1840 pixels eveneens prima op orde, zodat je foto's en video's in een hoge kwaliteit kunt bekijken. Verder heeft de fabrikant ook aan een goed geluid gedacht. De metalen behuizing bevat vier minispeakers van het bekende audiomerk JBL. Een bluetooth-koptelefoon koppelen kan uiteraard ook.

De Tab P12 geschikt voor alledaagse apps, zoals Facebook, YouTube, Chrome en simpele spelletjes. es rekenkernen presteren op 2 GHz, terwijl de twee resterende cores zijn geklokt op 2,6 GHz. Deze tablet heeft daarnaast 8 GB werkgeheugen en 128 GB interne opslag. Overigens breid je de opslagcapaciteit makkelijk uit met een eigen microSD-kaart van maximaal 1 TB. Lenovo levert bij dit product een stylus mee. Benieuwd naar ervaringen van andere gebruikers? Lees dan deze reviews op Kieskeurig.nl.

▼ Volgende artikel
Nieuwe Philips Airfryer Dual Stacked 4000 bespaart bijna de helft aan ruimte op het aanrecht
© Philips
Huis

Nieuwe Philips Airfryer Dual Stacked 4000 bespaart bijna de helft aan ruimte op het aanrecht

Philips breidt zijn assortiment heteluchtfriteuses uit met de Airfryer Dual Stacked 4000-serie. Je ziet meteen waar de naam vandaan komt: de twee bakmanden zijn gestapeld (stacked). Hierdoor neemt het apparaat tot 45 procent minder ruimte in op het aanrecht dan traditionele dubbele airfryers, terwijl de totale inhoud met 10 liter gelijk blijft aan grotere modellen.

Philips is niet de eerste die met een verticaal ontwerp komt. Merken als Ninja (met de Double Stack) en Princess hebben al soortgelijke modellen. Het is een duidelijke trend in de keukenmarkt: consumenten willen wel de voordelen van twee mandjes, maar hebben geen zin in een apparaat dat het halve aanrecht in beslag neemt.

De Philips Airfryer Dual Stacked 4000-serie richt zich vooral op huishoudens met kleine(re) keukens. De twee manden hebben elk een capaciteit van 5 liter, zodat je bijvoorbeeld vlees in de ene mand en groenten in de andere kunt bereiden. De synchronisatiefunctie zorgt ervoor dat beide zones op precies hetzelfde moment klaar zijn, ook als de bereidingstijden verschillen.

©Philips

Voor de bereiding leunt Philips op de bekende RapidAir-technologie, waarbij hete lucht met hoge snelheid door de manden circuleert. Volgens de fabrikant zorgt dat voor een gelijkmatige garing met weinig of geen olie. Handig zijn de kijkvensters: je houdt het bakproces in de gaten zonder dat je de laden hoeft te openen. Zo ontsnapt er niet onnodig warme lucht.

Je bedient de airfryer via een digitaal touchscreen met dertien voorgeprogrammeerde instellingen voor bekende gerechten. Wil je meer controle, dan kun je de temperatuur en tijd ook handmatig per mand instellen.

Ook handig: na afloop kunnen de losse onderdelen in de vaatwasser, wat het schoonmaken na het koken makkelijker maakt.

©Philips

Beschikbaarheid

De Philips Airfryer Dual Stacked 4000-serie is per direct verkrijgbaar bij diverse elektronicaspeciaalzaken en online winkels. Het apparaat heeft een adviesprijs van 229,99 euro.

Wat is RapidAir-technologie?

De meeste airfryers werken als een kleine heteluchtoven, maar de RapidAir-techniek van Philips onderscheidt zich door de vorm van de bodem in de bakmand. Deze heeft vaak een stervormig profiel (de 'zeespiegelbodem'). Hierdoor wordt de opstijgende hete lucht krachtig teruggekaatst en ontstaat er een werveling. Dit zorgt ervoor dat het voedsel van alle kanten direct wordt geraakt door de hitte, wat resulteert in een krokantere buitenkant zonder dat het product uitdroogt.