Logica: if, elif, else
Contents
2.5. Logica: if, elif, else#
We hebben eerder gezien dat we met Python twee waarden kunnen vergelijken. Het resultaat kunnen we opslaan in een variabele van het type bool (True/False). Gelukkig blijft het daar niet bij: we kunnen op basis van zo’n bool stukjes code wél, of juist níet laten uitvoeren.
2.5.1. Conditionele uitvoering commando’s#
Veel programma’s worden geschreven om iets te automatiseren. Er moet dan op basis van de beschikbare informatie iets wél, of juist níet uitgevoerd worden.
Python kan afwijken van het van boven naar beneden uitvoeren van regels in een script. Dat gebeurt alleen als we een stukje code schrijven met een bepaalde structuur: we beginnen een regel dan met een sleutelwoord (keyword).
Voorbeelden van keywords zijn for, while, if, def, class - je hoeft ze nog niet allemaal te kennen. Het belangrijkste is wat daarna komt: door de volgende regel(s) te beginnen met een inspringing geven we aan dat er met die regels iets speciaals aan de hand is.
Stukjes code die onder bepaalde voorwaarden uitgevoerd worden staan altijd ingesprongen. Op het moment dat de inspringing weer stopt, begint Python weer alle volgende commando’s in hun volgorde uit te voeren.
De inspringing kan bestaan uit twee spaties, vier spaties, of een <tab>-karakter. Je zult altijd consequent moeten zijn - gebruik in een script maar één soort inspringing. We adviseren je om altijd 4 spaties aan te houden, dat is het meest duidelijk voor iedereen. En belangrijk: de regel voordat je inspringt moet je met een :-teken afsluiten. Python weet dan dat de volgende regel ingesprongen moet zijn.
2.5.2. if#
Zoals we eerder gezien hebben moeten we een sleutelwoord gebruiken, en inspringen (met 4 spaties) om aan te geven dat de code die we gaan schrijven niet gewoon van boven naaar beneden uitgevoerd moet worden. Het sleutelwoord is in dit geval if. Het volgende voorbeeld illustreert het conditioneel uitvoeren van regels code. Let bij het tweede stukje op het gebruik van not - dit zorgt ervoor dat de waarde een bool-variabele omkeert van True naar False en andersom.
body_temperature = 40
threshold_temperature = 39
# Dit levert een bool-variabele op
patient_has_fever = (body_temperature > threshold_temperature)
if patient_has_fever: # << let op de dubbele-punt.
# Let op het inspringen met 4 spaties!
print("The patient has fever.")
if (not patient_has_fever):
# Let op het inspringen met 4 spaties!
print("The patient is fine.")
The patient has fever.
In plaats van een tussenvariabele van het type bool aan te maken, kunnen we ook direct de ‘groter dan’-operatie achter if zetten.
2.5.3. else#
Bekijk nu het volgende voorbeeld.
body_temperature = 39
threshold_temperature = 39
if (body_temperature > threshold_temperature):
# Let op het inspringen met 4 spaties!
print("The patient has fever.")
if (body_temperature < threshold_temperature):
# Let op het inspringen met 4 spaties!
print("The patient is fine.")
print("Hierboven zou een uitspraak over de patient gedaan moeten zijn. Waarom staat die er niet?")
Hierboven zou een uitspraak over de patient gedaan moeten zijn. Waarom staat die er niet?
In het beovenstaande voorbeeld bekeek de code eerst of de temperatuur groter was dan de grenswaarde van 39 graden (wat niet waar is) en daarna of de temperatuur lager was dan deze grenswaarde (wat ook niet waar is). Daarom kregen we hier geen resultaat en kon er dus niks gezegd worden over de gezondheid van de patient. In plaats daarvan kunnen we bij het tweede if-statement <= (kleiner of gelijk aan) gebruiken. Dan weten we zeker dat er in alle gevallen een uitspraak over de gezondheid van de patient gedaan word, ook wanneer de temperatuur precies op de grenswaarde ligt.
Zo iets kan snel over het hoofd gezien worden en kan in complexe programma’s voor onverwachte problemen zorgen, bijvoorbeeld als we in een blokje een variabele aanmaken die later gebruikt wordt:
body_temperature = 39
threshold_temperature = 39
# Let op het inspringen met 4 spaties,
# en de dubbele punten!
if (body_temperature > threshold_temperature):
conclusie = "The patient has fever."
if (body_temperature < threshold_temperature):
conclusie = "The patient is fine."
print(conclusie)
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-3-ca32954cce39> in <cell line: 13>()
11 conclusie = "The patient is fine."
12
---> 13 print(conclusie)
NameError: name 'conclusie' is not defined
Het is veiliger en netter om een volgende constructie met het sleutelwoord else te gebruiken. Daarmee worden alle gevallen die niet voldoen aan het voorgaande if-statement afgevangen. Dan hoeven we ook niet zelf goed op te letten. Op deze manier wordt er altijd een uitspraak gedaan.
body_temperature = 40
threshold_temperature = 39
# Let weer op het inspringen met 4 spaties,
# en de dubbele punten!
if (body_temperature > threshold_temperature):
conclusie = "The patient has fever."
else:
conclusie = "The patient is fine."
print(conclusie)
The patient has fever.
2.5.4. elif#
Er zijn ook gevallen waarin we niet zo’n binair gedrag van ons programma verwachten. Een programma dat een iets meer verfijnd onderscheid maakt kunnen we schrijven met behulp van het elif-sleutelwoord.
body_temperature = 38.7
if (body_temperature > 39):
print("The patient has fever.")
elif (body_temperature > 38.5):
print("The patient has a light fever.")
elif (body_temperature > 37.5):
print("The patient is fine.")
else:
print("The patient is too cold!")
The patient has a light fever.
Note
Vergeet niet om ook als je elif-stukjes gebruikt, te definiëren wat Python moet doen als aan géén voorwaarde voldaan wordt (else).
2.5.5. Sleutelwoord in#
Een veel voorkomende situatie is het gebruik van een if-blokje om code alleen uit te voeren als een list, dict of str een bepaalde inhoud bevat. We kunnen gebruikmaken van de syntax <zoekterm> in <variabele> om er achter te komen of een zoekterm in de variabele zit. Deze syntax geeft dan een True of False terug, die we direct in een if- conditie kunnen gebruiken. Een paar voorbeelden:
mijn_str = 'Ik studeer Werktuigbouwkunde aan de TU Delft.'
print('Delft' in mijn_str)
print('bouwkunde' in mijn_str)
print('Bouwkunde' in mijn_str)
print('Leiden' in mijn_str)
True
True
False
False
mijn_str = 'Ik studeer Werktuigbouwkunde aan de TU Delft.'
if 'TU Delft' in mijn_str:
print('Je wilt vast ingenieur worden.')
elif 'Leiden' in mijn_str:
print('Je viert vast 3 oktober!')
Je wilt vast ingenieur worden.
mijn_lijst = ['a', 'b', 'c']
print('a' in mijn_lijst)
print('b' in mijn_lijst)
print('c' in mijn_lijst)
print('d' in mijn_lijst)
True
True
True
False
mijn_dict = {'a': 1, 'b': 2, 'c': 3}
print('a' in mijn_dict)
print('b' in mijn_dict)
print('c' in mijn_dict)
print('d' in mijn_dict)
if 'a' in mijn_dict:
print('De letter `a` zit in mijn_dict, en heeft waarde', mijn_dict['a'], '.')
if 'd' in mijn_dict:
print('De letter `d` zit in mijn_dict, en heeft waarde', mijn_dict['d'], '.')
else:
print('De letter `d` zit niet in mijn_dict.\nIk kan de waarde dus ook niet printen, want dat zou een foutmelding (KeyError) opleveren!')
True
True
True
False
De letter `a` zit in mijn_dict, en heeft waarde 1 .
De letter `d` zit niet in mijn_dict.
Ik kan de waarde dus ook niet printen, want dat zou een foutmelding (KeyError) opleveren!
2.5.6. Speciaal (kort) gebruik#
We kunnen if en else ook nog op een speciale manier gebruiken. Het voordeel hiervan is dat we een simpele beslissing met één regel code kunnen bereiken in plaats van vier. Je kunt hetzelfde altijd ook doen met een standaard if-else structuur op meerdere regels, dus je hoeft dit niet per sé te weten. Deze twee onderstaande stukjes code geven hetzelfde antwoord.
body_temperature = 38
threshold_temperature = 40
# << als True || als False >>
decision = "fever." if body_temperature > threshold_temperature else "no fever."
print("The patient has", decision)
The patient has no fever.
body_temperature = 38
threshold_temperature = 40
if body_temperature > threshold_temperature:
decision = "fever."
else:
decision = "no fever."
print("The patient has", decision)
The patient has no fever.