Ook al gaat dit hoofdstuk over expressies, ik moet toch eerst iets anders uitleggen. Geen expressie, maar een functie, namelijk een functie die het mogelijk maakt resultaten te laten zien. De functie die dat doet is print(). De print functie gebruik je als volgt: je schrijft het woord print, gevolgd door een rond openingshaakje, gevolgd door hetgeen je wilt laten zien, gevolgd door een rond sluithaakje. Bijvoorbeeld (het print commando heb ik ook hiervoor al meerdere malen laten zien):
print( "Hello World!" )
Je kunt meerdere dingen tegelijkertijd laten zien met een print() functie, door alles wat je wilt laten zien tussen de haakjes te zetten, met komma’s ertussen. De print() functie laat dan al die items zien, met spaties ertussen. Bijvoorbeeld:
print( "Ik","leer","Python." )
Dat hierboven de openings- en sluitingshaakjes een geheel vormen met de print, komen we later op terug. Nu focussen we eerst op de aanhalingstekens rond de “Hello World!”. Want daar is een goede reden voor. “Hello World!” is namelijk een string. Een string is een tekst, die bestaat uit nul of meer tekens, omsloten door aanhalingstekens. Je mag dubbele of enkele aanhalingstekens gebruiken. Wat je kiest maakt niet uit, bijvoorbeeld: “appel” is equivalent met ‘appel’. (Echter, als je tekst een enkel aanhalingsteken bevat, moet je hem om problemen te voorkomen omsluiten met dubbele aanhalingstekens.)
Naast strings bestaan nog andere datatypes. Een integer bijvoorbeeld is een geheel getal, die positief of negatief (of nul) kan zijn. Gebruikmakend van onze print functie, kunnen we ook integers tonen. Daarvoor gebruiken we geen aanhalingstekens. Gebruiken we die wel, dan schrijven we niet het getal 1, maar de string (of het symbool) 1. Het uiteindelijke resultaat blijft evenwel gelijk.
print( 1 ) # dit print de integer 1 ( = het getal)
print( "1" ) # dit print de string 1 ( = het symbool)
Een derde datatype is een float, wat kort is voor “floating-point getal” (“gebroken getal”), is een getal met decimalen. Bijvoorbeeld, 3.14159265 is een float. Merk op dat je een punt in plaats van een komma moet gebruiken als decimaal-scheider. Veel landen (inclusief België) gebruiken een komma als decimaal-scheider, maar Python houdt zich aan de conventie van Engelstalige landen en gebruikt daarom de punt. Als je een integer hebt die je wilt gebruiken als float, kun je dat doen door er .0 achter te zetten. Bijvoorbeeld, 13 is een integer, maar 13.0 is een float. Ze geven nog steeds dezelfde waarde weer, en als je ze in code met elkaar vergelijkt (zie later), dan zal Python stellen dat ze hetzelfde zijn. De waarde is gelijk, maar hun datatype is verschillend.
Op deze drie datatypes zullen we dit hoofdstuk focussen. Toch blik ik al graag even vooruit, want er bestaan veel meer datatypes dan deze drie. Een vierde voorbeeld is de list, het engelse woord voor lijst. Het is een geordende verzameling van strings, integers, floats (en/of nog andere datatypes). Zo is [“appel”,3.14,-10] een lijst met drie elementen, het eerste is een string, het tweede een float en het derde een integer. Let op de vierkante haakjes die de lijst omsluiten. Vierkante haakjes duiden op lijsten, net als de aanhalingstekens duiden op strings en het punt (decimaalteken) duidt op floats. Hiermee benadrukken we opnieuw het belang van de syntax. Hoewel we in de lessen focussen op het gebruik van bijvoorbeeld lijsten, toch blijft het uitermate belangrijk om ook te weten hoe we lijsten op een juiste manier aanmaken.
Een expressie of berekening is een combinatie van één of meerdere waardes (zoals strings, integers, of floats) met behulp van operatoren, die dan een nieuwe waarde oplevert.
Eenvoudige berekeningen worden gemaakt door twee waardes te combineren met een operator ertussenin. De meeste van volgende operatoren ken je zeker:
print( 15+4 )
print( 15-4 )
print( 15*4 ) # Vermenigvuldiging met 4
print( 15/4 ) # Deling door 4
print( 15//4 ) # geheeltallige deling met 4
print( 15**4 ) # Vierde macht
print( 15%4 ) # Modulo 4
Of misschien niet allemaal? De geheeltallige deling (ook wel genoemd “floor division”) is simpelweg een deling die naar beneden afrondt naar een geheel getal. Als er floats in de berekening zitten, is het resultaat nog steeds een float, maar naar beneden afgerond. Als de berekening alleen integers omvat, is het resultaat een integer. De modulo operator (%) produceert de rest die overblijft na deling. Bijvoorbeeld: als ik 14 deel door 5, krijg ik 2.8. Dat betekent dat ik twee keer 5 kan aftrekken van 14, en dan nog steeds een positief getal overhoud, maar als ik het een derde keer aftrek wordt het resultaat negatief. Dus als ik 5 twee keer aftrek van 14, rest er een getal kleiner dan 5. Deze rest is wat de modulo berekening oplevert. In eenvoudige termen: als ik 14 koekjes heb die ik moet verdelen over 5 kinderen, kan ik ieder kind 2 koekjes geven. Ik heb dan nog 4 koekjes over, omdat ik dan meer kinderen dan koekjes heb. Dus als je 14 deelt door 5 met geheeltallige deling, geeft dat 2 (koekjes per kind), terwijl 14 modulo 5 als rest 4 (koekjes in mijn hand) geeft.
Een ander voorbeeld. Voor een busreis zijn 317 personen ingeschreven. Per bus passen 23 mensen. We beginnen de bus één voor één te vullen. Kun je voorspellen hoeveel volledige bussen we kunnen vullen? En hoeveel mensen er nog over zijn voor de laatste bus? Zonder de geheeltallige deling en modulo berekening kun je dit probleem waarschijnlijk wel oplossen, maar in Python kan het sneller:
print( 317//23 )
print( 317%23 )
Alle bovenstaande voorbeelden zijn berekeningen met integer of float getallen. ‘Natuurlijk kunnen we geen twee strings bij elkaar optellen’, hoor ik je zeggen. Akkoord, wat heeft “Appels”+”Peren” dan wel te betekenen? Wiskundig gezien houdt dit inderdaad geen steek. Maar toch kun je deze operatie in Python uitvoeren:
print( "Appels"+"Peren" )
Dit geeft als uitkomst “AppelsPeren”. Python herkent twee strings en zal deze - zijn ingebouwde syntax volgend - met de plus-operator aan elkaar kleven tot een lange nieuwe string.
Zo beginnen we het belang in te zien van datatypes. Afhankelijk van de datatypes krijgt een operator (bijvoorbeeld +) een licht andere betekenis. Houd daarom het datatype goed in het achterhoofd, want anders kom je voor verrassingen te staan. Bekijk maar eens volgende voorbeelden:
print( 1+2 )
print( "1"+"2" )
print( "1"+2 )
De som van de integer 1 en de integer 2 geeft een integer 3. Daarentegen, de som van de string “1” en de string “2” geeft een nieuwe string “12”. In het laatste voorbeeld proberen we bij de string 1 de integer 2 op te tellen. Dit is binnen de Python syntax ongekend. Daarom krijgen we een foutmelding terug: de operatie is niet toegestaan.
Je mag waardes en operatoren combineren om grotere berekening te maken, net zoals je kunt met geavanceerde rekenmachines. Je mag daarbij haakjes gebruiken om de evaluatievolgorde te bepalen. Zonder haakjes zal Python de operatoren evalueren in de volgorde die wiskundigen gebruiken. In het Engels wordt het ezelsbruggetje om de volgorde van bewerkingen te onthouden PEMDAS genoemd: haakjes (parentheses), exponenten, multiplicatie en divisie (deling), additie (optelling) en subtractie (aftrekking).
Een voorbeeldje:
print( 5*2 - 3+4/2 )
geeft 9.0 als uitkomst (controleer!). Merk op dat we als oplossing een float krijgen, hoewel we enkel met integers werken. De reden is dat er een deling in de berekening zit, en dat betekent voor Python dat de uitkomst automatisch een float is. Een tweede opmerking: hoeveel we ook spelen met spaties, de oplossing blijft onveranderd. We zagen eerder al dat Python spaties negeert, het is zuiver een kwestie van stijl. Als we de volgorde van bewerkingen willen veranderen, moéten we haakjes zetten. Bijvoorbeeld:
print( (5*(2-3) +4) /2 )