H2. Variabelen

We kennen het concept van variabelen eigenlijk vrij goed uit het dagelijkse leven, zonder er misschien bij stil te staan dat we met ‘variabelen’ aan het werk zijn. Ken je nog de oude (draai)telefoons? Telkens wanneer je iemand wou bellen, moest je diens nummer ingeven. Wat zijn we tegenwoordig gemakkelijk met de contactenlijst in onze smartphones. Wanneer je iemand een sms wil sturen of wil bellen, volstaat het de (door jou zelf gekozen) naam in te geven. Bij het sturen of bellen weet jouw smartphone meteen welk nummer te gebruiken, zonder dat je die zelf hoeft te onthouden. In deze analogie hebben we een contactnaam enerzijds (we noemen dit de variabele naam) en het telefoonnummer anderzijds (dit noemen we de variabele waarde). Om de waarde op te roepen, gebruiken we eigenlijk de achterliggende naam. Wat een gemak, toch wanneer we er ons bij het benoemen van de contactpersonen niet te gemakkelijk vanaf maken door ze als ‘a’, ‘b’ of ‘c’ op te slaan, wel als ‘Aaron’, ‘Bert’ of ‘Cedric’. Al snel zul je ook het gemak van variabelen ondervinden.

Waarde van variabelen

Een variabele is een plaats in het geheugen van de computer die een naam heeft gekregen, en waarin je een waarde van een bepaald datatype kunt opslaan.

Om een variabele te creëren in Python (dus om een variabele naam te kiezen) moet je een waarde toekennen aan gekozen naam middels het gelijkheidsteken (=). Aan de linkerkant van het gelijkheidsteken zet je de variabele naam, en aan de rechterkant de waarde die je wilt opslaan in de variabele. Zo bijvoorbeeld:

x = 5
print( x )

In deze code gebeuren twee dingen. Ten eerste wordt er een variabele gecreëerd met de naam x door er een waarde in op te slaan, in dit geval de waarde 5. In het Engels heet dit een ‘assignment’, en het gelijkheidsteken wordt ook wel de ‘assignment operator’ genoemd. Ten tweede wordt de inhoud van de variabele x op het scherm getoond middels print(). Merk op dat print( x ) niet de letter x toont, maar de waarde die in de variabele x is opgeslagen. Je kunt je de variabele x voorstellen als een doos waarop je met een dikke, zwarte viltstift een x hebt geschreven, zodat je hem later gemakkelijk terug kunt vinden. Je kunt iets in de doos stoppen, en je kunt in de doos kijken om te zien wat er in zit (er kan wel slechts één ding tegelijkertijd in de doos zitten). Je kunt naar de inhoud van de doos refereren door de naam te gebruiken die je op de doos hebt geschreven. De term ‘variabele’ duidt op de variabele naam, dus de letter x op de doos. De term ‘waarde’ duidt op de waarde die is opgeslagen in de variabele, dus de inhoud van de doos. Aan de rechterkant van het gelijkheidsteken kun je alles plaatsen wat een waarde oplevert. Het hoeft niet een enkel getal te zijn. Het mag ook een berekening zijn, of een string, of een aanroep van een functie die een waarde oplevert (zie later).

Zulke assignments lees je dus eigenlijk van rechts naar links. De eerste lijn van het voorbeeld hierboven lezen we als “De integer 5 slaan we op in de variabele x”. Programmeercode lezen we ook steeds van boven naar onder. De tweede lijn van het voorbeeld wordt dan: “Vervolgens printen we de waarde horend bij de variabele x”.

Het feit dat we code steeds van boven naar onder lezen, leidt soms tot verrassingen. De eerste keer in je programma dat je een waarde toekent aan een specifieke variabele naam, wordt de bijbehorende variabele gecreëerd. Als je later een andere waarde aan dezelfde variabele toekent, wordt de eerste waarde overschreven. In de metafoor van de doos: je maakt de doos leeg en stopt er iets nieuws in. Een variabele bevat altijd de laatst-verkregen waarde. Bekijken we even volgend voorbeeld:

x = 5
print( x )
x = "Iets helemaal anders."
print( x )

We hebben in totaal twee print commando’s, dus Python zal twee dingen printen. Eerst wordt de integer 5 opgeslagen in de variabele x, dewelke wordt geprint. Een eerste output van het programma wordt zo 5. Pas daarna wordt de string “Iets helemaal anders.” opgeslagen in de variabele x. Omdat deze doos al 5 bevatte, wordt deze hierdoor geleegd en opnieuw gevuld. Als we in de laatste lijn de waarde horend bij de variabele x printen, krijgen we “Iets helemaal anders.” als output.

Naamgeving van variabelen

Tot op dit punt heb ik slechts de variabele x gebruikt. Je bent echter vrij om variabele namen te kiezen die je wilt, als je je daarbij maar aan een aantal eenvoudige regels houdt:

False, True, finally , is , return , None , continue , for, while, try, with, as, from, import, def, and, or, not, global, class, lambda, if, elif, else, yield, assert, del, nonlocal, pass, break, except, in, raise

Deze lijst hoef je niet uit het hoofd te leren. In de meeste programmeeromgevingen krijgen gereserveerde woorden automatisch een speciaal kleur wanneer je ze typt. Op die manier word je dus gewaarschuwd.

Je mag zowel hoofd- als kleine letters gebruiken in variabele namen, maar je moet wel beseffen dat Python ‘case sensitive’ is, dus gevoelig voor de verschillen tussen hoofd- en kleine letters. Bijvoorbeeld, de variabele naam wereld is voor Python niet hetzelfde als de variabele naam Wereld.

Tot zover de formele regels. Daarnaast zijn er nog heel wat ongeschreven conventies waaraan ervaren programmeurs zich altijd houden wanneer ze variabele namen kiezen. De belangrijkste zijn de volgende:

Het gebruik van variabelen biedt een groot voordeel van flexibiliteit en veralgemeenbaarheid. Bijvoorbeeld, om voor een rekening van €24,95 exclusief BTW het eindbedrag te berekenen, kun je de volgende code gebruiken:

print( 24.95 * (1 + (21 / 100)) )

Echter, veel beter is het om te schrijven:

#Constantes
btw = 21             # procent
rekening = 24.95     # bedrag in euro exclusief BTW

#Berekening van het eindtotaal
eind_totaal = ( rekening * (1 + (btw / 100))
print( eind_totaal )

Niet alleen maken de commentaren het programma duidelijker, we hebben ook de variabelen btw en rekening toegevoegd. Dat laat ons toe om in het vervolg snel het totaalbedrag inclusief BTW te laten berekenen voor een ander bedrag op de rekening. Of voor een ander BTW percentage. Dit noemen we veralgemeenbaarheid.

Datatype van variabelen

In veel programmeertalen wordt het datatype van een variabele gespecificeerd op het moment dat de variabele gecreëerd wordt.

Deze methode van variabele declaratie wordt “hard typing” genoemd.

Python werkt anders en geeft geen vast type aan een variabele. Toch heeft elke variabele wel een datatype, namelijk het type van de waarde die erin is opgeslagen. Dit betekent dat als een variabele een nieuwe waarde krijgt, het type ook kan veranderen. Dit wordt “soft typing” genoemd. Het datatype van een variabele kun je te weten komen met behulp van de functie type(), zoals in onderstaande voorbeelden.

a = 3
print( type( a ) )
a = 3.0
print( type( a ) )
a = "3.0"
print( type( a ) )