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

Zo kun je programmeren in Python - Deel 3

Nu je hebt gezien hoe je gegevens structureert in lijsten en dictionary’s, wordt het tijd om ook in je programma’s wat structuur te brengen. In deze les ga je van start met de Python-ontwikkelomgeving Thonny en schrijf je je eerste Python-programma’s.

Tot nu toe heb je al je Python-opdrachten in een interactieve sessie in de Python-interpreter uitgevoerd. Dat is handig voor wat kleine berekeningen, maar voor complexere zaken dien je een volwaardig programma te schrijven. En dat gaan we in deze les dan ook doen, waarbij we ook veel opdrachten zien die Python aanbiedt om een programma op te bouwen.

Thonny

Als je Python-programma’s begint te schrijven die voor meer dienen dan eenvoudige bewerkingen, volstaat de Python-interpreter niet: je hebt dan een ontwikkelomgeving nodig die je helpt bij het opbouwen van je programma. In deze les gebruiken we Thonny, dat standaard wordt geïnstalleerd met Python vanaf versie 3.7.

Als je Thonny opstart, krijg je twee tekstvelden te zien. In het tekstveld bovenaan typ je je Python-programma in. Het tekstveld onderaan is een ‘shell’: dit is hetzelfde als de Python-interpreter die we in de vorige lessen gebruikten. Om kort wat opdrachten uit te proberen terwijl je een programma aan het schrijven bent, kan dit tekstveld handig zijn.

©PXimport

Waar of niet waar

Maar voordat we een programma schrijven, dienen we eerst nog één datatype van Python uit te leggen, en wel een heel eenvoudig: bool. Dit stelt een booleaanse waarde voor: waar of niet waar, of in Python: True of False. Heel wat functies en operatoren in Python geven een van deze waardes terug. Voer de volgende opdrachten maar eens in het shell-tekstveld van Thonny in:

>>> namen = ['lies', 'jan', 'kees', 'mireille', 'koen', 'rob']>>> 'kees' in namenTrue>>> 'aniek' in namenFalse>>> namen[0] == 'lies'True>>> namen[1] != 'kees'True>>> 2 < 5True>>> 2 > 5False>>> 3.1.is_integer()False>>> 3.0.is_integer()True

Zoals je ziet, kun je met in testen of een element zich in een lijst bevindt. Met == test je op de gelijkheid van twee objecten en met != op de ongelijkheid. Vergelijkingen zoals < (kleiner dan) en > (groter dan) geven ook een booleaanse waarde terug. Daarnaast heb je ook <= (kleiner dan of gelijk aan) en >= (groter dan of gelijk aan). En een functie zoals is_integer() is handig om van een float te bepalen of het een gehele waarde is.

Met booleaanse waarden zelf kun je ook ‘rekenen’, namelijk met de operatoren and, or en not. De uitdrukking xor y is True als x of y of beide objecten True zijn; x and y is True als beide objecten True zijn; en not x is True als x False is en andersom.

Waardes testen: if

Dan gaan we nu ons eerste Python-programma schrijven. Het programma vraagt de gebruiker om een geheel getal van 1 tot 10 in te vullen en toont het getal dan in een woord uitgeschreven. Maar als de gebruiker een getal kleiner dan 1 of groter dan 10 invult, krijgt hij een foutmelding. Het programma ziet er zo uit:

getallen = {1: 'één', 2: 'twee', 3: 'drie', 4: 'vier', 5: 'vijf', 6: 'zes', 7: 'zeven', 8: 'acht', 9: 'negen', 10: 'tien'}

getal = int(input("Voer een geheel getal van 1 tot 10 in: "))

if getal < 1:

print("Het getal is kleiner dan 1.")

elif getal > 10:

print("Het getal is groter dan 10.")

else:

print(getallen[getal])

Op de eerste regel maken we een dictionary aan met de getallen van 1 tot 10 als sleutel, met telkens als bijbehorende waarde een string met het getal in een woord uitgedrukt. Daarna roepen we de functie input aan met als argument een string met de vraag om een getal in te voeren. De functie input geeft als waarde de string terug die de gebruiker heeft ingevoerd. Die string zetten we met int om naar een geheel getal, op voorwaarde natuurlijk dat de gebruiker daadwerkelijk een getal heeft ingevoerd.

Daarna testen we met if getal < 1 of het getal kleiner is dan 1. In dat geval wordt de regel erna uitgevoerd. Als aan die eerste voorwaarde niet voldaan is, controleert Python de voorwaarde in de regel elif getal > 10. Zo ja, dan wordt de regel erna uitgevoerd; zo nee, dan wordt de regel na else: uitgevoerd.

Zo’n blok als hierboven kan meerdere controles met elif bevatten: die worden dan één voor één getest tot er aan een voorwaarde is voldaan. Overigens zijn de controles met elif en else optioneel. Je kunt dus eenvoudig alleen met if een voorwaarde testen: in het geval niet aan die voorwaarde is voldaan, gebeurt er niets en gaat het programma gewoon verder.

Voer je programma uit

Voer de code in het programmatekstveld van Thonny in. Je merkt dat Thonny de regels automatisch met vier tekens inspringt nadat je op Enter drukt na een regel met if, elif of else. Let op: zonder deze inspringing is de Python-code niet geldig. Nadat je de volledige code ingetypt hebt, sla je het bestand in Thonny op. Druk daarna op het groene icoontje met het driehoekje om het programma uit te voeren.

Als je een tikfout hebt gemaakt, krijg je in het onderste tekstveld een foutmelding te zien. Dat is bijvoorbeeld het geval als je een : op het einde van een regel met if, elif of else vergeet of als je de code niet correct inspringt. Verbeter dan je code en voer het programma opnieuw uit.

Je programma vraagt nu in het tekstveld onderaan om een getal van 1 tot 10 in te voeren. Test de verschillende onderdelen van je programma eens uit door een getal in te voeren dat te klein, te groot of binnen het bereik ligt. Na elke invoer druk je op Enter en krijg je het resultaat te zien. Voer het programma daarna opnieuw uit voor een volgende poging.

Programma’s op de opdrachtregel uitvoeren

Je hoeft je programma’s niet in Thonny uit te voeren. Als je op de Opdrachtprompt (onder Windows) of de Terminal (onder Linux of macOS) naar de directory gaat waarin je je Python-programma hebt opgeslagen, kun je het programma uitvoeren met de opdracht python3 naamvanprogramma.py.

Een bereik van getallen

Ons programma is ingewikkelder dan nodig. We hoeven eigenlijk niet te weten of het ingevoerde getal kleiner dan 1 is of groter dan 10: we willen gewoon weten of het in het gevraagde bereik van 1 tot 10 ligt. Daarbij kunnen we gebruikmaken van de functie range, die een bereik van getallen voorstelt. Zo kunnen we ons voorgaande programma vereenvoudigen tot:

getallen = {1: 'één', 2: 'twee', 3: 'drie', 4: 'vier', 5: 'vijf', 6: 'zes', 7: 'zeven', 8: 'acht', 9: 'negen', 10: 'tien'}

getal = int(input("Voer een geheel getal van 1 tot 10 in: "))

if getal - 1 in range(len(getallen)):

print(getallen[getal])

else:

print("Het getal ligt niet binnen het bereik van 1 tot 10.")

We hebben nu nog maar één test met if nodig, zonder elif. In die controle testen we immers of het ingevoerde getal in het bereik ligt. Dat bereik berekenen we door de lengte van de dictionary met getallen door te geven aan de functie range. Omdat Python altijd vanaf 0 begint te tellen, is het bereik voor die dictionary met lengte 10 gelijk aan de getallen van 0 tot 9. Maar omdat wij mensen vanaf 1 beginnen te tellen, trekken we 1 van het ingevoerde getal af voordat we testen of het getal zich in het bereik bevindt. En zo komen we aan deze regel:

if getal - 1 in range(len(getallen)):

Voorwaardelijke lussen

Ons programma heeft nog één groot minpunt: als de gebruiker een waarde buiten het bereik invoert, stopt het programma gewoon en moet de gebruiker het programma opnieuw uitvoeren. Waarom kan het programma in dat geval niet uit zichzelf opnieuw naar een getal vragen? Dat kan, namelijk met while:

getallen = {1: 'één', 2: 'twee', 3: 'drie', 4: 'vier', 5: 'vijf', 6: 'zes', 7: 'zeven', 8: 'acht', 9: 'negen', 10: 'tien'}

getal = 0

while getal - 1 not in range(len(getallen)):

getal = int(input("Voer een geheel getal van 1 tot 10 in: "))

print(getallen[getal])

In de regel met while testen we met not in of het ingevoerde getal zich niet binnen het bereik bevindt. In dat geval wordt de ingesprongen opdracht eronder uitgevoerd. En daarna gebeurt de test in de regel met while opnieuw, zolang het getal zich niet binnen het bereik bevindt. Pas wanneer het getal zich wel binnen het bereik bevindt, stopt het while-blok en gaat het programma verder met de laatste regel. Zo’n while-blok noemen we een lus, omdat het programma als het ware in rondjes draait zolang aan de voorwaarde op de while-regel is voldaan.

Let op: we kennen in het begin van het programma 0 toe aan de variabele getal zodat de while-lus de eerste keer sowieso wordt uitgevoerd.

Samenvatting

In deze les hebben we de stap gezet van afzonderlijke Python-opdrachten naar Python-programma’s. Dat deden we in de ontwikkelomgeving Thonny. We bekeken het datatype bool en werkten met voorwaarden in if-blokken en while-lussen. Daarbij maakten we ook gebruik van de functie range voor een bereik van getallen. We gebruikten input en print voor invoer en uitvoer. De volgende les besteden we volledig aan invoer en uitvoer, en bespreken we ook hoe je door elementen in een lijst of dictionary loopt.

Opdracht

Ons laatste programma heeft nog één nadeel: het vraagt bij de invoer van een getal buiten het bereik van 1 tot 10 gewoon opnieuw een getal zonder extra melding dat je iets verkeerds hebt ingetypt. Voeg die extra melding toe, zoals we wel in het programma met if hadden.

Uitwerking

getallen = {1: 'één', 2: 'twee', 3: 'drie', 4: 'vier', 5: 'vijf', 6: 'zes', 7: 'zeven', 8: 'acht', 9: 'negen', 10: 'tien'} getal = int(input("Voer een geheel getal van 1 tot 10 in: ")) while getal - 1 not in range(len(getallen)): print("Het getal ligt niet binnen het bereik van 1 tot 10.") getal = int(input("Voer een geheel getal van 1 tot 10 in: ")) print(getallen[getal]) Dit programma combineert de ideeën achter onze twee vorige programma’s. We initialiseren getal nu niet met 0, maar met de invoer van de gebruiker. Als deze eerste keer het getal onmiddellijk in het bereik van 1 tot 10 ligt, is aan de voorwaarde van de while-lus niet voldaan en wordt het getal getoond. In het andere geval wordt de lus gestart, waarbij zolang het getal niet in het bereik ligt de gebruiker een melding daarvan krijgt en de vraag om een getal in te voeren.

Cheatsheet

argument: een waarde die je aan een functie doorgeeft. bool (‘booleaanse waarde’): waar (True) of niet waar (False). if: een test of er aan een voorwaarde is voldaan. ontwikkelomgeving (development environment): software die je ondersteunt bij het schrijven van programma’s. while: een lus die uitgevoerd wordt zolang er aan een voorwaarde is voldaan.

▼ Volgende artikel
Column: De PlayStation 6 mag nog jaren op zich laten wachten
Huis

Column: De PlayStation 6 mag nog jaren op zich laten wachten

De PlayStation 6 zou wel eens pas ergens na 2028 uit kunnen komen, zo claimde een analist onlangs. Dat betekent dat we minstens acht jaar met de PlayStation 5 opgescheept zitten. Maar niet getreurd: dat is juist goed nieuws voor de gemiddelde gameliefhebber.

Dat de PlayStation 6 in ontwikkeling is bij Sony, mag voor zich spreken. Nadat een nieuwe spelcomputer is uitgekomen, beginnen consolebedrijven vaak al snel met de research voor diens opvolger. Onderzoek naar de juiste specificaties en features van consoles beslaat vaak meerdere jaren, om nog maar te zwijgen over het maken van afspraken met bedrijven die de componenten daadwerkelijk leveren, en natuurlijk het produceren ervan.

Het is dan ook waarschijnlijk dat de specificaties van de PlayStation 6 al geruime tijd vastliggen, en dat Sony intern ook een schatting heeft gemaakt voor een releaseperiode voor de langverwachte console. Misschien was het bedrijf er zelfs van overtuigd dat het de console volgend jaar uit zou kunnen brengen.

Watch on YouTube

Verlengde levenscyclus

Onlangs meldde MST Financial-analist David Gibson dat Sony nu echter overweegt om de PS6 pas ergens na 2028 te leveren. “Sony verwacht dat de levenscyclus van de PlayStation 5 wordt verlengd, en dat de PlayStation 6-release langer op zich laat wachten dan de meesten voorspellen.” Dat zou betekenen dat de PS6 misschien pas ergens in 2029 of zelfs later in de winkels ligt.

De eerdere voorspellingen van ingewijden mikten voorheen vooral op eind 2027 of in de loop van 2028, op basis van wanneer de productie oorspronkelijk zou beginnen. De PlayStation 5 kwam in het najaar van 2020 uit, dus dat zou de console al een levenscyclus van ruim zeven jaar geven voordat de opvolger op de markt komt. Dat is in principe een zeer ruime levensloop voor een spelcomputer, en een release in 2027 of 2028 zou dan ook volkomen logisch zijn.

©PXimport

Stijgende RAM-prijzen

Maar de wereld houdt geen rekening met consolereleases, en gezien de huidige ontwikkelingen is de komst van een PlayStation 6 in 2027 of 2028 helemaal niet zo logisch meer. Dat heeft voor een groot deel te maken met de prijzen van RAM (Random Access Memory), die steeds hoger oplopen. RAM is namelijk in grote getale nodig om de alsmaar populairder wordende AI-assistenten als ChatGPT en Gemini draaiende te houden.

Als gevolg daarvan wordt RAM steeds schaarser en dus duurder, en laten spelcomputers nu ook net RAM nodig hebben. In deze periode een nieuwe spelcomputer uitbrengen zou dan ook betekenen dat de prijs van de console mogelijk erg hoog komt te liggen, wat de verkoop niet bepaalt stimuleert. Een dergelijke ‘valse’ start van de levenscyclus van een spelcomputer is iets dat veel bedrijven willen vermijden.

Ook de importheffingen die de Amerikaanse president Donald Trump op producten die buiten de Verenigde Staten worden gemaakt doorvoert, zorgen voor veel onzekerheid. Eerder moesten de prijzen van diverse spelcomputers, waaronder de PlayStation 5, al stijgen om dit op te vangen. Trump is – unieke politieke ontwikkelingen buiten beschouwing gelaten – de komende jaren nog aan de macht, dus ook dat maakt het uitbrengen van een nieuwe console bepaald geen veilige onderneming. De komende jaren een console lanceren is kortom dus een gigantisch risico, dat Sony volgensgeruchten zo klein mogelijk wil houden.

Trage consolegeneratie

Sony hoopt wellicht dat de economie eind dit decennium kalmeert. Dat zou echter wel betekenen dat we nog meerdere jaren op de komst van de PlayStation 6 moeten wachten. Wat mij betreft is dat niet iets om over te treuren, maar juist goed nieuws. Het geeft ontwikkelaars namelijk de kans om echt alles uit de PlayStation 5 te halen. Een kans die ze hopelijk met beide handen aangrijpen.

Hoewel de PS5 in november van 2020 uitkwam – ruim vijf jaar geleden – heb ik nog altijd het gevoel dat deze consolegeneratie nog maar net is begonnen. De generatie kwam sowieso vrij traag op gang, omdat deze middenin de coronapandemie viel. Dat was ook voor spelontwikkelaars een ingewikkelde tijd waarin halsoverkop naar thuiswerkmogelijkheden gekeken moest worden, waardoor veel games die in ontwikkeling waren vertraging op liepen.

Sony’s eigen game-line-up is de afgelopen vijf jaar ook wat karig geweest. Dat heeft deels te maken met een focus op liveservicegames, waarbij diverse projecten die bij Sony’s meest prominente studio’s in ontwikkeling waren uiteindelijk werden geannuleerd. Denk bijvoorbeeld aan de The Last of Us-multiplayergame die na jaren productie in de prullenbak werd gegooid.

Daarbij is de ‘cross-generation’-periode van deze generatie uitzonderlijk lang. Nog altijd komen diverse games niet alleen op PlayStation 5, maar ook op PlayStation 4 uit. Nu is dat iets wat in de toekomst alleen maar vaker voor zal komen – de grenzen tussen consolegeneraties vervagen en daarmee is het ook makkelijker om de prestaties van games terug of juist op te schalen.

Toch zorgt het er ook voor dat er onder gamers een gevoel groeit dat nog lang niet het uiterste uit de PS5 is gehaald. Er is méér met dat apparaat mogelijk, vooral met de bestaande PS5 Pro in het achterhoofd. Een verlengde levenscyclus voor de console geeft ontwikkelaars de kans om een aantal schitterende spellen af te leveren in de laatste jaren van de spelcomputer – de ontwikkeltijd van games wordt immers ook steeds langer. Met toppers als Grand Theft Auto 6, The Witcher 4 en Intergalactic: The Heretic Prophet nog in het verschiet, is er meer dan genoeg potentie om het de komende jaren uit te zingen met de PS5.

Niet zonder risico’s

Natuurlijk brengt het uitstellen van een consolelancering ook risico’s met zich mee, zowel voor Sony als voor de consument. Het is namelijk helemaal niet zeker dat de wereldeconomie er eind dit decennium beter voor staat. Daarnaast zet het Sony voor een moeilijke keuze: gooit het jaren aan research voor de PS6 weg om de console eind dit decennium met moderne specificaties uit te kunnen brengen, of behoudt het simpelweg de huidige specs zodat deze op release mogelijk al deels zijn verouderd?

De eventuele keuze om de PlayStation 6 uit te stellen zal dan ook niet over één nacht ijs gaan. Het is aan de goedbetaalde mensen in topposities binnen het bedrijf om die knoop door te hakken. Maar puur vanuit mijn eigen, egoïstische liefde voor games gezien, heb ik er totaal geen moeite mee om nog een jaar of drie, vier op de PlayStation 5 te spelen. Laat maar eens zien wat die console nog kan, en blaas ons in 2029 of 2030 weg met een nieuwe consolegeneratie die écht een flinke technologische stap zet!

▼ Volgende artikel
Code geel en oranje wegens ijzel: zo check je of jouw route al gestrooid is
© Rijkswaterstaat
Huis

Code geel en oranje wegens ijzel: zo check je of jouw route al gestrooid is

Het is weer #codegeel en #codeoranje wegens gladheid door ijzel. Moet je toch de weg nog op? Via een online kaart van Rijkswaterstaat zie je live waar strooiwagens rijden en op welke wegen net is gestrooid.

Ga je naar Rijkswaterstaatstrooit.nl, dan krijg je een interactieve kaart van Nederland te zien. Op die kaart bewegen kleine icoontjes die de actieve strooiwagens voorstellen. De gegevens worden voortdurend bijgewerkt, waardoor je vrijwel live ziet waar op dat moment wordt gestrooid.

Naast de voertuigen vallen de gekleurde lijnen op de wegen op. Een paarse lijn betekent dat er in de afgelopen zes uur zout is gestrooid. Zo kun je zelf een inschatting maken of jouw route redelijk begaanbaar zal zijn of dat je éxtra moet opletten.

©Rijkswaterstaat

Zo lees je de strooikaart

De kaart laat zien wat er nu en in de afgelopen zes uur op de weg is gebeurd, inclusief strooiacties, wegdektemperaturen en radarbeelden. Kijk je vooruit, dan toont de kaart een verwachting tot twee uur met de voorspelde verwachte radarbeelden en wegdektemperaturen. Goed om te weten: je kunt niet vooruitkijken om te zien waar de strooiwagens gaan rijden.

Wegtemperatuur

De kaart laat meer zien dan alleen strooiwagens. Op veel plekken vind je ook de actuele wegdektemperatuur. Die metingen komen van 330 meetpunten verspreid over het hele land. Dat is relevant, omdat het asfalt vaak al onder nul kan zijn terwijl de buitentemperatuur dat nog niet is. Gaat het sneeuwen of regenen op wegdek dat al beneden nul is, dan neemt de kans op gladheid toe. Is de temperatuur nu nog boven het vriespunt? Kijk dan zeker even vlak voordat je vertrekt. Vanaf een uur of drie 's middags daalt de temperatuur namelijk meestal. En een wegdek dat nu net boven nul is, kan dan ineens zomaar weer kouder zijn. Als het dan gaat regenen, moet je echt uitkijken.

©Rijkswaterstaat

Dinsdag 3 februari, 14:30 uur: in het noordoosten van Groningen duikt de temperatuur van het wegdek al onder het vriespunt.

Neerslag

Links op de kaart zie je ook nog een icoontje van een regenwolk met een zonnetje erachter. Klik je daar op, dan krijg je actuele beelden te zien van de neerslagradar van het KNMI. Je ziet niet alleen waar de neerslag valt, maar ook of er veel of weinig valt. Dit neerslagbeeld wordt elke vijf minuten opnieuw samengesteld.

De weg op? Doe het veilig!

Door voor vertrek de strooikaart te checken, vergroot je de veiligheid onderweg. Of, anders gezegd, je verkleint het risico. Wat je zelf nog kunt doen? Controleer de bandenspanning. Bij kou daalt de luchtdruk, niet alleen buiten maar ook in je banden, wat invloed heeft op de grip. Kijk daarnaast of je voldoende ruitensproeiervloeistof hebt en of die bestand is tegen vorst; daar bestaan verschillende gradaties in. Leg voor de zekerheid ook een zaklamp en een warme deken in de auto. Een powerbank is eveneens handig. Mocht je vast komen te staan, dan blijf je in ieder geval warm en heb je genoeg stroom om je smartphone een paar uur te gebruiken.