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

Zo kun je programmeren in Python - Deel 4

In de href="https://computertotaal.nl/artikelen/pc/zo-kun-je-programmeren-in-python-deel-3/" rel="noopener noreferrer" target="_blank">vorige les</a> gebruikten we in Python de functies input en print voor invoer en uitvoer. In deze les gaan we hiermee verder en bespreken we allerlei manieren om de uitvoer aan te passen. Omdat we vaak de elementen uit een lijst of dictionary op een speciale manier willen tonen, gaan we ook nog dieper in op hoe je door de elementen van een lijst of dictionary loopt.

In de vorige les gebruikte je de functie input om een getal aan de gebruiker te vragen en de functie print om uitvoer op het scherm te tonen. Die uitvoer bleef tot nu toe vrij elementair. Daarom bekijken we eerst allerlei mogelijkheden om de uitvoer aan te passen.

De uitvoer van print aanpassen

In de vorige les gebruikten we deze opdracht om een getal uit een dictionary op het scherm te tonen:

print(getallen[getal])

Maar wat als je meerdere objecten op dezelfde regel wilt tonen? Dat kan eenvoudig door meerdere objecten aan de functie print door te geven, gescheiden door een komma. Verander bijvoorbeeld de laatste regel in het laatste programma van vorige les door:

>>> print(getal, "is gelijk aan", getallen[getal])1 is gelijk aan één

Alle objecten die je aan print doorgeeft, worden gescheiden door een spatie getoond.

Na de objecten die je aan de functie print doorgeeft, kun je nog argumenten toevoegen die de uitvoer van print veranderen, namelijk sep en end. Met sep (afkorting van separator) verander je de spatie tussen objecten door een andere afscheiding, en met end vervang je het einde van de uitvoer (standaard ‘\n’ waarmee je een newline of een nieuwe regel aanduidt) door iets anders. Bijvoorbeeld:

>>> print(getal, getallen[getal], sep = ': ', end = '\n\n')1: één>>>

Door aan het argument end twee newlines toe te kennen, komt er een lege regel na de uitvoer.

Plaatshouders

Als je meerdere objecten in één uitvoer met print wilt opnemen en/of complexere zaken aan de uitvoer wilt veranderen, komt de functie format van pas. In de eenvoudigste vorm pas je die functie toe op een string waarin je met {} plaats vrijhoudt. Het argument dat je aan de functie doorgeeft, komt op de plaats van die {}:

>>> 'Je hebt {} gekozen.'.format(1)'Je hebt 1 gekozen.'

Dat werkt ook met meerdere plaatshouders:

>>> 'Je hebt {} gekozen tussen de getallen {} en {}.'.format(2, 1, 10)'Je hebt 2 gekozen tussen de getallen 1 en 10.'

Je kunt de plaatshouders ook een volgnummer geven, zodat ze in een andere volgorde in de uitvoer komen dan de argumenten die je aan format doorgeeft:

>>> '{1} <= {0} <= {2}'.format(2, 1, 10)'1 <= 2 <= 10'

Maar vaak is het duidelijker als je de argumenten een naam geeft en die namen ook in de plaatshouders gebruikt:

>>> '{min} <= {getal} <= {max}'.format(min=1, max=10, getal=2)'1 <= 2 <= 10'

Door een lijst lopen met for

Vaak wil je niet één regel uitvoer tonen met print, maar meerdere, bijvoorbeeld voor alle elementen in een lijst of dictionary. We hebben dus een manier nodig om al die elementen af te gaan. Dat kan met een for-lus, zoals in het volgende programma:

namen = ['lies', 'jan', 'kees', 'mireille', 'koen', 'rob']for naam in namen:print(naam)

Python gaat elk element uit de lijst met namen af en toont dit element met print. Als je zowel de index als de inhoud van elk element wilt tonen, maak je gebruik van de handige functie enumerate:

namen = ['lies', 'jan', 'kees', 'mireille', 'koen', 'rob']

for index, naam in enumerate(namen):print('{}: {}'.format(index, naam))

Door een dictionary lopen met for

We kunnen met een for-lus ook door alle elementen van een dictionary lopen. Afhankelijk van waarin je juist geïnteresseerd bent, kan dat op drie manieren. We tonen in het volgende programma achtereenvolgens hoe je door alleen de sleutels gaat, door alleen de waardes en door de sleutels met hun bijbehorende waardes:

scores = {'lies': 6231, 'bas': 2, 'kees': 18, 'mireille': 482, 'aniek': 35, 'bert': 184}

print('Spelers')for speler in scores:print(speler)

print()

print('Scores')for score in scores.values():print(score)

print()

print('Spelers met score')for speler, score in scores.items():print('{}: {}'.format(speler, score))

De sleutels van een dictionary kun je ook opvragen met de functie keys, maar dat is hier niet nodig. Bijvoorbeeld:

scores.keys()

Tupels

In de for-lus waarmee we zowel de index als de waarde van alle elementen van een lijst doorlopen en de for-lus waarmee we zowel de sleutel als de waarde van alle elementen van een dictionary doorlopen zie je dat we twee elementen tegelijk na de for zetten: index, naam respectievelijk speler, score. Twee elementen met een komma ertussen vormen een speciaal datatype in Python: een tupel (tuple). Je kunt ook variabelen van het type tuple aanmaken, maar dat heb je normaal niet vaak nodig.

List comprehension

For-lussen zijn handig, maar voor complexere bewerkingen wat omslachtig. Stel dat we de lengte van de langste naam uit een lijst willen berekenen. Met een for-lus kunnen we dat als volgt doen:

namen = ['lies', 'jan', 'kees', 'mireille', 'koen', 'rob']

max_lengte = 0

for naam in namen:lengte = len(naam)if lengte > max_lengte:max_lengte = lengte

print(max_lengte)

Dit werkt en is vrij duidelijk, maar het kan beter. Voor dit soort bewerkingen heeft Python een handig concept: list comprehension. Daarmee kunnen we de hele voorgaande berekening vervangen door één regel:

namen = ['lies', 'jan', 'kees', 'mireille', 'koen', 'rob']

print(max([len(naam) for naam in namen]))

Deze regel zegt: voor elke naam in de lijst met namen bereken je de lengte van de naam, en daarvan bereken je het maximum. Het stuk [len(naam) for naam in namen] is een beknopte manier waarmee we een lijst aanmaken van de lengtes van alle elementen in de lijst namen.

Tekst uitlijnen en opvullen

Dan gaan we nu even terug naar de functie format. Daarmee kunnen we tekst uitlijnen, zowel links, rechts als gecentreerd, en lege ruimte opvullen met willekeurige tekens. Een voorbeeld:

>>> '{:=^15}'.format('Titel')'=====Titel====='

En met iets als:

print('{naam:<6} : {score:0>6}'.format(naam='kees', score=3))

krijgen we als uitvoer:

kees : 000003

Met ^ centreren we tekst, met < lijnen we tekst links uit en met > lijnen we tekst rechts uit. Na het uitlijningsteken komt het totaal aantal tekens dat de tekst maximum mag innemen. Vóór het uitlijningsteken kan nog optioneel een teken komen waarmee we lege ruimte opvullen. En als we de argumenten van format een naam geven, komt die naam vóór de dubbele punt.

Samenvatting

In deze les hebben we allerlei manieren gezien om de uitvoer van print aan te passen, zoals tekst uitlijnen en lege ruimte opvullen. We hebben ook gezien hoe je door de elementen van een lijst of dictionary loopt, zodat je die een voor een kunt tonen. Verder zijn we ook op list comprehension ingegaan, een krachtige manier om zonder lus berekeningen uit te voeren op alle elementen in een lijst of dictionary. In de volgende les gaan we het weer over invoer en uitvoer hebben, maar dan met bestanden. Bovendien kijken we ook hoe je foutmeldingen in je programma afvangt.

Opdracht 1

Neem de volgende dictionary met scores: scores = {'lies': 6231, 'bas': 2, 'kees': 18, 'mireille': 482, 'aniek': 35, 'bert': 184} Gebruik list comprehension om een lijst met tupels aan te maken waarvan elk tupel bestaat uit de naam met een hoofdletter en de score gedeeld door 100.

Uitwerking

>>> scores = {'lies': 6231, 'bas': 2, 'kees': 18, 'mireille': 482, 'aniek': 35, 'bert': 184}>>> [(speler.capitalize(), score/100) for (speler, score) in scores.items()][('Lies', 62.31), ('Bas', 0.02), ('Kees', 0.18), ('Mireille', 4.82), ('Aniek', 0.35), ('Bert', 1.84)] Met scores.items() krijgen we een lijst van tupels terug van de sleutels en waardes van de dictionary. Met list comprehension passen we in elk van deze tupels de sleutel en waarde zoals gevraagd aan.

Opdracht 2

Neem de volgende dictionary met scores: scores = {'lies': 6231, 'bas': 2, 'kees': 18, 'mireille': 482, 'aniek': 35, 'bert': 184} Met alle kennis uit deze les kun je deze personen en hun scores in een tabel tonen, met als linkerkolom de namen en als rechterkolom de bijbehorende scores. De namen moeten links uitgelijnd zijn en de scores rechts met nullen vooraan. Je code moet met namen en scores van willekeurige lengte kunnen werken.

Uitwerking

scores = {'lies': 6231, 'bas': 2, 'kees': 18, 'mireille': 482, 'aniek': 35, 'bert': 184} max_naam = max([len(naam) for naam in scores]) max_getal = max([len(str(score)) for score in scores.values()]) for speler, score in scores.items(): print('{speler:<{speler_breedte}}{score:0>{score_breedte}}'.format(speler=speler, speler_breedte=max_naam+3, score=score, score_breedte=max_getal)) Dit is een heel compact programma waarin alle kennis tot nu toe en van deze les bij elkaar komt. We berekenen eerst de maximumlengte van een naam door list comprehension toe te passen op de sleutels van de dictionary met scores. Daarna doen we hetzelfde voor de maximumlengte die we nodig hebben om de scores weer te geven. Daarna lopen we door alle spelers en bijbehorende scores. We geven aan de functie format als argumenten de speler, de maximumlengte van de spelersnaam (waarbij we 3 optellen om de kolommen van elkaar te scheiden), de score en de maximumlengte van de score door. In de plaatshouder voor de speler geven we met < aan dat de naam van de speler links wordt uitgelijnd, en met {speler_breedte} daarna geven we aan hoeveel tekens lang de uitlijning dient te zijn. Daarna doen we hetzelfde voor de score, maar daar lijnen we rechts uit en vullen we de cijfers aan met nullen vooraan. Merk op dat alles in onze code wat begint met print op één lange regel komt.

Cheatsheet

for: een lus die voor alle elementen in een lijst of dictionary uitgevoerd wordt. list comprehension: een beknopte manier om een lijst aan te maken. newline: het teken \n waarmee je een nieuwe regel aanduidt. tupel: een reeks objecten met een komma ertussen.

▼ Volgende artikel
Review Dyson V16 Piston Animal: zuigt beter dan dat hij dweilt
© Rens Blom
Huis

Review Dyson V16 Piston Animal: zuigt beter dan dat hij dweilt

Met de Dyson V16 Piston Animal kun je draadloos stofzuigen én dweilen, mits je het dweilopzetstuk er ook bij koopt. Dyson mikt met deze steelstofzuiger op huishoudens met dieren, maar de antiklitborstels blijken ook handig om lange menselijke haren op te zuigen. Een review van deze twee-in-één-gadget.

Uitstekend
Conclusie

De Dyson V16 Piston Animal is een krachtige en complete steelstofzuiger voor mensen met huisdieren en/of lange haren. De stevige prijs is begrijpelijk, maar niet mals. Dat kan wachten op een aanbieding de moeite waard kan maken. De optionele dweilmond à 149 euro weet ons niet helemaal te overtuigen.

Plus- en minpunten
  • Compleet en licht verbeterd ontwerp
  • Accuduur van 1 uur
  • Zuigt ook (lange) haren effectief op
  • Optionele dweil niet fantastisch
  • Stevige adviesprijs

Dyson staat bekend om zijn premium apparatuur met stevige prijzen, en dat is bij de V16 Piston Animal niet anders. De stofzuiger heeft een adviesprijs van 849 euro. Wil je daar ook de Submarine-dweilborstel bij, dan ben je in totaal bijna 1000 euro kwijt. Dyson kennende zullen deze prijzen binnen een jaar wel enigszins dalen, waardoor de V16 Piston Animal een betere prijs-kwaliteitverhouding krijgt.

Verbeterd ontwerp

Het ontwerp van de stofzuiger steekt goed in elkaar. De kunststof behuizing voelt degelijk aan en heeft een matzwarte afwerking, wat wij persoonlijk mooier vinden dan het grijs van voorgaande Dyson-stofzuigers. De verwijderbare batterij aan de onderkant blijft een goede zet, net als het lcd-schermpje in je gezichtsveld. Op dit scherm zie je hoelang je nog kunt stofzuigen (of dweilen) en via grafieken welk soort vuil je opzuigt.

©Rens Blom

Op het display zie je wat voor soort vuil je opzuigt en hoelang de accu nog meegaat.

Het is fijn dat je het HEPA-filter aan de achterzijde van de stofzuiger kunt losdraaien om hem te wassen. Zo blijft de stofzuiger op de lange termijn zelf zo schoon mogelijk.

©Rens Blom

Het HEPA-filter kan in de wasmachine, zodat je niet steeds nieuwe hoeft te kopen.

Een prettige verbetering in de V16 Piston Animal ten opzichte van vorige geteste Dyson-modellen is het stofreservoir. De draadloze steelstofzuiger heeft een opvangbak van 1,3 liter. Door een hendeltje te gebruiken, pers je het opgezogen vuil samen en raakt het stofreservoir minder snel vol. Wanneer je het stofreservoir boven je vuilnisbak leegt, valt de inhoud netjes naar beneden. Bij andere geteste Dyson-stofzuigers wil het vuil door de kracht van het geopende stofreservoir nog weleens in een cirkel omlaag dwarrelen, waardoor een deel buiten je vuilnisbak belandt. Het is goed om te zien dat Dyson hiervan heeft geleerd.

©Rens Blom

Je kunt de stofzuiger zonder van opzetstuk te wisselen op vloeren en kleden gebruiken.

Haren opzuigen

Effectieve stofzuigers bouwen doet Dyson al jaren, en daar vormt de V16 Piston Animal geen uitzondering op. De ster van de show is een nieuwe brede zuigmond met een speciale structuur om lange haren op te zuigen zonder dat ze vastklitten in de bewegende onderdelen van het mondstuk. Dat mondstuk werkt als een trein, hebben we de afgelopen vier weken gemerkt in een huishouden met twee verharende katten, een nog erger verharende oppashond én een vriendin met lang haar. De V16 Piston Animal zuigt de complete vloer schoon, waarbij delen van kattenbakkorrels, broodkruimels, ander vuil en dus al die haren soepel de stofzuiger in verdwijnen. Dat is best een prettig aanzicht, zeker dankzij het ingebouwde laserlicht dat een deel van je vloer groen laat oplichten om beter te zien wat je opzuigt.

©Rens Blom

De ingebouwde verlichting laat extra goed zien wat je opzuigt.

Slim aan die vernieuwde brede zuigmond is dat hij werkt op harde vloeren én tapijt of een kleed. De stofzuiger past zijn manier van zuigen aan als hij een andere ondergrond detecteert. Je kunt in één moeite dus je hele kamer stofzuigen, wat een fijne manier van werken is die past bij de hoge prijs van de stofzuiger.

Dyson levert de V16 Piston Animal met drie extra opzetstukken. Een langere, smallere zuigmond tovert de stofzuiger om tot een flinke kruimeldief, terwijl de twee-in-één-zuigmond bedoeld is voor tafels, traptreden en andere kleine oppervlakken. Het meest interessant vinden we een kleine zuigmond met dezelfde antiklitconstructie als de grote zuigmond. Deze kleine zuigmond leent zich goed om de bank, stoelen en je matras te stofzuigen.

©Rens Blom

De inhoud van de verpakking, inclusief de prijzige Submarine 2.0-dweilborstel.

De Dyson V16 Piston Animal heeft drie zuigmodi: de zuinige ecostand, de automatische stand en de boost-modus voor maximale zuigkracht. De automatische stand is het nuttigst, want die schakelt automatisch naar boost zodra hij veel vuil tegenkomt. Wij konden de stofzuiger zo'n 60 minuten gebruiken op de automatische stand. De accu opladen duurt grofweg vierenhalf uur.

Dweilen vraagt om versie 3

Voor 149 euro extra koop je de V16 Piston Animal met een dweilmond, door Dyson de Submarine 2.0 genoemd. Dat komt omdat er al een dweil met Submarine 1.0-techniek is, die overigens niet werkt met de V16 Piston Animal. Andersom kun je de 2.0-dweil niet gebruiken met vorige Dyson-apparaten. Makkelijk upgraden of uitwisselen zit er dus niet in.

©Rens Blom

De 2.0-dweilborstel vervangt de Submarine 1.0-versie.

Over de 1.0-dweil waren we niet heel enthousiast, en hoewel de 2.0-versie beter is, blijft het dweilen wat wiebelig en krijgen we snel strepen. De waterbak legen is wel eenvoudiger. Al met al een prima gadget om de vloer even op te frissen, maar een serieuze dweil biedt nog steeds beter resultaat.

©Rens Blom

De dweil reinigt de vloer, maar doet dat nogal wiebelig

Conclusie: Dyson V16 Piston Animal kopen?

De Dyson V16 Piston Animal is een krachtige en complete steelstofzuiger voor mensen met huisdieren en/of lange haren. De stevige prijs is begrijpelijk, maar niet mals. Dat kan wachten op een aanbieding de moeite waard kan maken. De optionele dweilmond à 149 euro weet ons niet helemaal te overtuigen.

▼ Volgende artikel
Nieuw van JBL: open-ear koptelefoon voor kinderen
© JBL | Ali Harper | Stocksy.com
Huis

Nieuw van JBL: open-ear koptelefoon voor kinderen

JBL breidt zijn Junior-serie uit met de JBL Junior FREE, de eerste open-ear koptelefoon van het merk die speciaal is ontworpen voor kinderen. Het model combineert een open ontwerp met ouderlijk toezicht via een app en een maximale geluidssterkte van 85 decibel, zodat kinderen veilig kunnen luisteren zonder volledig afgesloten te zijn van hun omgeving.

De Junior FREE maakt gebruik van JBL's OpenSound-technologie, waarbij geluid via luchttrillingen naar het oor wordt geleid zonder de gehoorgang af te sluiten. Daardoor horen kinderen nog wat er om hen heen gebeurt, wat handig is tijdens huiswerk of onderweg. Tegelijkertijd beperkt de ingebouwde JBL Safe Sound-functie het volume tot 85 decibel, een niveau dat als veilig wordt beschouwd voor jonge oren. Ouders kunnen via de JBL Headphones-app het volume en de luistertijd in real-time volgen, en krijgen dagelijkse of wekelijkse rapporten over gebruik en geluidsblootstelling.

Het ontwerp is afgestemd op kinderen: lichtgewicht, flexibel en gemaakt van zacht siliconenmateriaal. De open-ear constructie rust op het oor in plaats van erin, wat volgens JBL extra comfort biedt bij langdurig gebruik. De grotere knoppen maken de bediening eenvoudig, en de spatwaterdichte behuizing (IPX4) moet de koptelefoon bestand maken tegen dagelijkse ongelukjes. De batterij houdt het tot tien uur vol, en met tien minuten opladen komt daar nog eens drie uur bij.

JBL heeft ook gedacht aan speelse details. De verpakking kan worden omgevormd tot een telefoonstandaard en in de doos zitten stickers waarmee kinderen hun koptelefoon kunnen versieren.

©JBL

De JBL Junior FREE is vanaf november verkrijgbaar in paars, turquoise en perzik. De adviesprijs is 69,99 euro.