python
© iStock

Python is oorspronkelijk een Nederlandse uitvinding. De programmeertaal is in de jaren 80 en 90 van de vorige eeuw ontwikkeld door Guido van Rossum. Python is gratis (open source) en onderscheidt zich door zijn eenvoud. De naam is overigens niet afkomstig van de slang, maar van het Engelse comedygezelschap Monty Python. Tijd voor een introductie.

De populariteit van Python vertoont een beetje de kenmerken van een golfbeweging. In het begin, met name ten tijde van Python 2, was de taal zeer populair. Daarna zakte de belangstelling een beetje in. Maar de laatste jaren mag Python zich weer op toenemende populariteit verheugen. Dat heeft zonder twijfel te maken met het feit dat softwareontwikkeling steeds complexer wordt. Java en C#/.NET-toepassingen zijn krachtig, maar ook erg ingewikkeld. Zelfs voor een simpele app op Android of iOS moet je al tientallen gigabytes aan schijfruimte opofferen en uren durende installaties doorlopen van tools als Android Studio of XCode. Python is daar een aangename uitzondering op. De taal zelf is relatief eenvoudig. Er zijn niet al te veel typeringen en er is een beperkte instructieset. Dit is de kern van Python. Het bevat onderdelen als variabelen, lists, dicts, tuples en functies. Voor het programmaverloop worden voornamelijk if- en while-statements gebruikt, terwijl de data met rechttoe-rechtaan operatoren voor optellen, aftrekken, delen en vermenigvuldigen worden bewerkt. Dat is heel overzichtelijk en in een dag te leren.

Guido van Rossum is de maker van Python (bron afbeelding: CWI, via Praktisch Python – Vanduuren Media).

Versies van Python

Er zijn verschillende versies van Python in omloop. Dat kan ook bijna niet anders bij een programmeertaal die al ruim dertig jaar oud is. Een – zeer beknopte – tijdlijn van de geschiedenis van Python ziet er als volgt uit:

•             1989 – Eerste implementatie van Python, voor persoonlijk gebruik en op het CWI in Amsterdam.

•             1994 – Python 1.0

•             2000 – Python 2.0

•             2008 – Python 3.0

Binnen de hoofdversies zijn weer allerlei subversies verschenen, zoals Python 2.1, 2.2 enzovoort. Op het moment van schrijven was Python 3.11 de meest recente versie. Op de homepage van Python (python.org) vind je altijd de meest recente versies en kan je een exemplaar downloaden voor jouw besturingssysteem. Python is beschikbaar voor Windows, macOS en Linux.

Ga naar python.org om de nieuwste versie te downloaden, documentatie en nieuwsberichten te lezen, en meer.

Oefening: Raden Maar

Om een eerste inzicht te verschaffen in hoe Python werkt, maken we deze oefening. De computer neemt een getal ‘in gedachten’ en wij moeten het getal zien te raden binnen het toegekende aantal pogingen. Als het getal te hoog of te laag is volgt een hint. Als het getal geraden is, wordt de speler gefeliciteerd. Als aan het einde het getal niet geraden is, wordt getoond welk getal de computer had geselecteerd. De verliezer betaalt een rondje! Het is een eenvoudig project, maar je maakt toch kennis met een groot aantal Python-constructies, zoals het werken met variabelen, lussen, willekeurige getallen en het formatteren van strings.

In Raden Maar moet je een geheim, willekeurig getal tussen 0 en 1000 raden op basis van aanwijzingen.

•             Als het getal dat je gokt te klein is, verschijnt hiervan een melding.

•             Als het getal te groot is, wordt dit ook vermeld.

•             Je hebt tien pogingen om het juiste getal te raden.

•             Als je goed raadt, ontvang je een felicitatie en wordt het correcte getal bevestigd.

•             Als je na tien pogingen het getal nog niet hebt geraden, wordt dit ook getoond. 

De uitvoer

Je start het programma in een opdrachtregelomgeving (cmd.exe, PowerShell of Terminal) of start het programma vanuit je editor met de daarvoor bestemde sneltoets. Daarna kan het verloop er bijvoorbeeld als volgt uitzien:

Raden Maar heeft een nummer in gedachten genomen.

Afhankelijk van het getal dat de computer had geselecteerd, kan het vervolg er uitzien zoals in de afbeelding hieronder.

Het getal is in de laatste poging geraden.

Als het getal niet wordt geraden, wordt dit ook in beeld getoond.

Het is niet gelukt om binnen tien pogingen het getal te raden.

De code

We tonen in één keer de volledige code voor het spel.

# 0. Modules in dit project

import random, time

# 1. Variabelen in dit programma

MIN_NUM = 0

MAX_NUM = 1000

NUM_GUESSES = 10

# 2. Net doen alsof we nadenken

print(‘Nadenken:’)

for i in range(3):

    time.sleep(0.5)

    print(‘.’)

# 3. Neem een getal ‘in gedachten’.

SELECTED_NUM = random.randint(MIN_NUM, MAX_NUM)

# 4. Instructie voor de gebruiker.

print(“Ik heb een getal in gedachten tussen {0} en {1}. Wat denk je dat het is?”.format(MIN_NUM, MAX_NUM))

print(“Je hebt {0} pogingen”.format(NUM_GUESSES))

for i in range(NUM_GUESSES):

    # 5. Gebruik input() om een getal in te lezen.

    your_num = int(input(‘> ‘))

    if your_num < SELECTED_NUM:

        print(“Jouw getal is te klein. Probeer het nogmaals! {0} pogingen over.”.format(NUM_GUESSES – (i + 1)))

    elif your_num > SELECTED_NUM:

        print(“Jouw getal is te groot. Probeer het nogmaals! {0} pogingen over.”.format(NUM_GUESSES – (i + 1)))

    elif your_num == SELECTED_NUM:

        print(‘Correct! Ik had {0} in gedachten.’.format(SELECTED_NUM))

        break

    if i == NUM_GUESSES – 1:

        print(‘Je hebt het getal niet geraden! Ik had {0} in gedachten.’.format(SELECTED_NUM))

        break

# 6. Einde

print(“Bedankt voor het spelen.”)

Constanten en variabelen

Python kent geen echte constanten. Het is niet mogelijk variabelen te maken die gedurende de uitvoering van het programma geen andere waarde kunnen krijgen. Door hoofdletters te gebruiken (zoals in MIN_NUM) wordt aangegeven dat het de bedoeling is dat deze variabele niet opnieuw wordt toegewezen. Maar technisch gezien kan je MIN_NUM gewoon een andere waarde geven. Het gebruik van hoofdletters is een conventie, een afspraak. Geen technische vereiste.

Na het importeren van de modules worden variabelen voor het programma gedefinieerd.

MIN_NUM = 0

MAX_NUM = 1000

NUM_GUESSES = 10

We hebben hier hoofdletters gebruikt voor de variabelenamen om aan te geven dat de desbetreffende variabelen constanten zijn. Het is niet de bedoeling dat ze in de loop van het programma worden gewijzigd. Omdat de constanten uit twee woorden bestaan, zijn ze met het underscoreteken geschreven. In Python is het de afspraak dat de underscore wordt gebruikt. Dit heet ook wel snake_case (naar een slang die over de grond kronkelt). Commentaar wordt in Python aangegeven met een hekje of hashtag, het teken #.

Regels voor naamgeving van Python-variabelen

Variabelen en constanten bestaan in Python uit een combinatie van kleine letters (a-z) en hoofdletters (A-Z) of getallen (0-9) en een underscore (_). Een variabelenaam mag niet met een getal beginnen. Speciale tekens zoal %, # en & zijn niet toegestaan in variabelenamen.

salaris #geldig

mijn_salaris # geldig

900euro # ongeldig

900_euro # ongeldig

euro_900 # geldig

We gebruiken een korte lus van drie keer om net te doen alsof de computer nadenkt. Tussen elke lusdoorgang pauzeren we het programma 0,5 seconden, zodat het wat realistischer lijkt. Technisch is dit natuurlijk totaal niet verplicht. Dit is de code:

print(‘Nadenken:’)

for i in range(3):

    time.sleep(0.5)

    print(‘.’)

Let er hierbij op:

•             In de opdracht for i in range (3) heeft i achtereenvolgens de waarden 0, 1, 2, Het laatste getal in de range is niet inclusief.

•             In elke lusdoorgang wordt na een halve seconde een punt op het scherm afgedrukt. Nogmaals, technisch heeft dit geen waarde, het gaat puur om de gebruikerservaring van het programma.

•             De module time heeft talloze functies om bijvoorbeeld de klok uit te lezen, in te stellen, te formatteren en nog veel meer. Wij gebruiken hier alleen de eenvoudige functie sleep(). Lees eventueel meer over time op docs.python.org/3/library/time.html.

Willekeurig getal genereren

Met de module random wordt een willekeurig getal berekend. We kiezen hier een willekeurig getal tussen 0 en 1000 (of liever gezegd, tussen de waarden van MIN_NUM en MAX_NUM die eerder zijn gedefinieerd. In het geval van randint() is de eindwaarde inclusief. Het kan dus zijn dat de uitkomst precies 1000 is in plaats van maximaal 999 zoals bij range() het geval is.

SELECTED_NUM = random.randint(MIN_NUM, MAX_NUM)

De gekozen waarde wordt toegekend aan de constante SELECTED_NUM. Deze wordt verderop in de for-lus gebruikt.

Strings formatteren

Python kent tal van manieren om strings te formatteren. In dit boek zullen we voornamelijk de methode format() gebruiken. Binnen een string die op deze manier wordt geformatteerd wordt met placeholders {0}, {1} enzovoort aangegeven welke waarden op die posities moeten worden ingevuld. De waarden worden als argumenten meegegeven aan format().

Als je zeker weet dat je de argumenten in volgorde op de aangegeven posities wilt gebruiken, mag je de getallen in de placeholders ook weglaten.

“Ik heb een getal in gedachten tussen {0} en {1}.”.format(MIN_NUM, MAX_NUM)

Is dus hetzelfde als

“Ik heb een getal in gedachten tussen {} en {}.”.format(MIN_NUM, MAX_NUM)

Vanuit het oogpunt van duidelijkheid en ondubbelzinnige code zullen wij echter de eerste manier, dus inclusief getallen in de placeholders gebruiken. Python kent zoals gezegd vele manieren om strings vorm te geven. Je kan eenvoudige stringconcatenatie gebruiken zoals ‘string 1 ’ + ’string 2’. Daarnaast kent Python ook het %-teken om strings te formatteren en sinds Python 3 f-strings. Van beide wordt hierna een codevoorbeeld gegeven. Het is beslist niet zo dat format() de ‘beste’ manier is om strings te formatteren, maar deze gebruiken we toevallig graag omdat we dat gewend zijn.

#  Python % operator met strings (C-style)

name = ‘Sandra’

email = ‘sandra@kpn.com’

print(‘mijn naam is %s en mijn e-mail is %s’ % (name, email))

# Python 3 f-strings

name = ‘Peter’

email = ‘info@kassenaar.com’

print(f’mijn naam is {name} en mijn e-mail is {email}’)

Praktisch Python

Dit artikel is een hoofdstuk uit het boek Praktisch Python van Peter Kassenaar, een uitgave van Vanduuren Media.

In dit boek ga je concreet aan de slag met de meest gebruikte programmeertaal ter wereld. Er zijn geen aparte hoofdstukken waarin wordt uitgelegd wat variabelen of functies zijn, of hoe een while-lus werkt. In plaats daarvan worden deze Python-kenmerken gebruikt om direct applicaties te maken die je rechtstreeks kan inzetten of gebruiken als basis voor je eigen toepassingen. Zelfs als je nog geen gedegen Python-voorkennis hebt, kan je met dit boek aan de slag. Gaandeweg maak je kennis met de belangrijkste kenmerken en zie je hoe je de voorbeeldprojecten op je eigen computer uitvoert. Van alle voorbeelden kan je de code inclusief extra, verhelderende commentaren downloaden.

Praktisch Python is onder andere verkrijgbaar bij Standaard Boekhandel, voor 34,99 euro.