Hoofdstuk 5 - IF-Statements

01 - Het IF-Statement
  • Met een IF-instructie kun je de actuele status van het programma bekijken en daarop reageren
  • De kern van elke IF-instructie is een conditie waaraan wordt voldaan of niet (True / False)
dinner = ['biefstuk', 'roomboter', 'zout', 'pepper']
for item in dinner:
    if item == 'biefstuk':
        print(item.upper())
    else:
        print(item.title())
BIEFSTUK
Roomboter
Zout
Pepper
  • == gebruik je om twee dingen te vergelijken
  • De enkele = maakt een toewijzing
# Kijkt of de variabele 'item' de waarde 'biefstuk' heeft. (True / False) 
item == 'biefstuk'

# Stelt de variabele 'item' in op de enkele string 'biefstuk'
item = 'biefstuk'
  • Net als bij een for-loop eindigt de regel met een dubbele punt
  • Een vergelijking met == is hoofdlettergevoelig
Als hoofdlettergevoeligheid uitmaakt
  • De .title( )-functie maakt tijdelijk de eerste letter, per woord, een hoofdletter
  • Maar de variabele blijft ongewijzigd zoals je kunt zien in het resultaat
dinner = ['biefstuk', 'roomboter', 'zout', 'pepper']
for item in dinner:
    if item.title() == 'Roomboter':
        print("tip:", item, "is geen optie, maar de standaard")    
tip: roomboter is geen optie, maar de standaard

Bij het gebruik van komma’s in print() voegt Python automatisch spaties toe. Bij string-concatenatie (+) niet



02 - Controleren op ongelijkheid
  • Als == staat voor IS GELIJK AAN, dan staat != voor IS ONGELIJK AAN
pizza_ingredients = "tomatensaus"
if pizza_ingredients != "witte chocola":
    print("Deze lus ik niet...")
Deze lus ik niet...
  • Het kan natuurlijk ook met integers
age = 16
if age != 18:
    print("Sorry, je moet precies 18 zijn")
Sorry, je moet precies 18 zijn

Nog een operator
age = 16
if age <= 17:
    print("Bestelling geweigerd")
else:
    print("Uw bestelling wordt verwerkt")
Bestelling geweigerd
03 - Meerdere voorwaarden controleren ( and / or )
  • Met de keywords and & or kunnen meerdere condities worden opgegeven bij een if-statement
  • Met and moeten beide condities (zowel links als rechts van het woord and) een True opleveren
  • Met or hoeft maar 1 van de 2 condities een True op te leveren
  • Python voert and-vergelijkingen altijd eerder uit dan or-vergelijkingen
age = 60
if age >= 18 and age <= 64:
    print("Uw bestelling wordt verwerkt")
else:
    print("Uw bestelling kan helaas niet worden verwerkt")
Uw bestelling wordt verwerkt

intolerance = True
allergy = False

if intolerance == True or allergy == True:
    print("Misschien is een chocolade pudding beter voor u.")
Misschien is een chocolade pudding beter voor u.

  • Soms kan het handig zijn om haakjes om je condities heen te zetten
  • Wat binnen haakjes staat wordt eerst opgelost
meal = "kaas"
money = 0

if meal == "kaas" or meal == "eieren" and money >= 2:
    print("Uw maaltijd wordt bezorgd. (De boter is gratis.)")
else:
    print("Sorry de maaltijd kan niet worden bezorgd")
Uw maaltijd wordt bezorgd. (De boter is gratis.)

Het resultaat is misschien onverwacht.
De logische and operator wordt eerst geëvalueerd en daarna pas de or.
De condities links en rechts van de and worden eerst afgehandeld en daaruit zal één antwoord komen (True / False).
Om dat ene antwoord te verkrijgen moeten in het geval van de and beide condities waar zijn.
Er staat eigenlijk:

meal == "kaas" or (meal == "eieren" and money >= 2)

De oplossing voor het gewenste resultaat kan verkregen worden door ( ) haakjes op de juiste plek te zetten


meal = "kaas"
money = 0

if (meal == "kaas" or meal == "eieren") and money >= 2:
    print("Uw maaltijd wordt bezorgd. (De boter is gratis.)")
else:
    print("Sorry de maaltijd kan niet worden bezorgd")
Sorry de maaltijd kan niet worden bezorgd
04 - Een lijst controleren op een waarde ( IN / NOT IN )
  • Een booleaanse waarde is een andere naam voor een True/False-test
  • Een boolean is ofwel True of False
requested_toppings = ['uien', 'salami', 'olijven']
print('uien' in requested_toppings)
True

available_toppings = ['witte chocola', 'rood bosfruit']
requested_extra_toppings = ['ananas']

if requested_extra_toppings[0] not in available_toppings:
    print('Helaas, de pizza is net uitverkocht')
else:
    print('Een prima keuze')
Helaas, de pizza is net uitverkocht

05 - De if-elif-else keten
  • Een eenvoudig if-statement heeft één test (conditie) en één actie
  • Door een 'else' toe te voegen kan een actie worden uitgevoerd wanneer de test niet slaagt
  • De if-else structuur werkt goed in situaties waarin je wilt dat Python altijd één van de twee mogelijke acties uitvoert
  • Wil je meer dan twee verschillende dingen testen en daarbij verschillende acties uitvoeren dan kan een if-elif-else uitkomst bieden
weight = 600

if weight < 400:
    price = 7
elif weight < 800:
    price = 13
else:
    price = 18

print('Uw ribeye kost € ' + str(price) + ',-' )
Uw ribeye kost € 13,-
  • In de if-elif-else keten (zie hierboven) wordt maar één blok code uitgevoerd
  • In een reeks eenvoudige if-statements kunnen meerdere blokken code worden uitgevoerd
available_toppings = ['salami', 'olijven', 'ansjovis', 'jalapeno']
requested_extra_toppings = ['salami', 'uien', 'olijven']

if requested_extra_toppings[0] in available_toppings:
    print(requested_extra_toppings[0], 'toegevoegd')

if requested_extra_toppings[1] in available_toppings:
    print(requested_extra_toppings[1], 'toegevoegd')

if requested_extra_toppings[2] in available_toppings:
    print(requested_extra_toppings[2], 'toegevoegd')
salami toegevoegd
olijven toegevoegd

Een For-loop met een if-statement
  • Als je merkt dat je met herhaling bezig bent, probeer een loop
available_toppings = ['salami', 'olijven', 'ansjovis', 'jalapeno']
requested_extra_toppings = ['salami', 'uien', 'olijven']

for extra_topping in requested_extra_toppings:
    if extra_topping in available_toppings:
        print(extra_topping + " toegevoegd")
salami toegevoegd
olijven toegevoegd

Controleer ook of een lijst leeg is
available_toppings = ['salami', 'olijven', 'ansjovis', 'jalapeno']
requested_extra_toppings = []

if requested_extra_toppings:
    for extra_topping in requested_extra_toppings:
        if extra_topping in available_toppings:
            print(extra_topping + " toegevoegd")
        else:
            print(extra_topping + " niet beschikbaar")
else:
    print("Weet je zeker dat je geen extra toppings wilt?")
Weet je zeker dat je geen extra toppings wilt?

# Deze notatie is niet nodig om te controleren of een lijst leeg is
if len(requested_extra_toppings) == 0:
# Python heeft een andere regel daarvoor
if requested_extra_toppings:

Een lege lijst wordt gezien als False. Een gevulde lijst wordt gezien als True.


Oefening
Quiz

Vraag 1. Wat doet de dubbele is-teken == in dit stukje code?

item = 'biefstuk'

if item == 'biefstuk':
    print("LEKKER!")



Klopt. == is de vergelijking: is links gelijk aan rechts? (True of False).
Nee. === gebruik je om een variabele een waarde te geven.

Vraag 2. Wat print deze code?

item = 'roomboter'

if item == 'Roomboter':
    print("match 1")
elif item.title() == 'Roomboter':
    print("match 2")
else:
    print("geen match")



Goed gezien. item is 'roomboter', dus alleen via item.title() krijg je 'Roomboter'.
Let op. Vergelijkingen met == zijn hoofdlettergevoelig. 'roomboter' is niet gelijk aan 'Roomboter'.

Vraag 3. Wat doet de operator != in dit voorbeeld?

age = 16

if age != 18:
    print("Sorry, je moet precies 18 zijn")



Juist. != betekent “is ongelijk aan”.
Nee. != is geen groter-/kleiner-dan, maar betekent letterlijk “is niet gelijk aan”.

Vraag 4. Wanneer wordt de volgende boodschap geprint?

age = 60

if age >= 18 and age <= 64:
    print("Uw bestelling wordt verwerkt")



Klopt. Door and moeten beide voorwaarden waar zijn: groter of gelijk aan 18 én kleiner of gelijk aan 64.
Niet helemaal. Met and moeten beide delen van de voorwaarde True zijn.

Vraag 5. Wat wordt er geprint?

meal = "kaas"
money = 0

if meal == "kaas" or meal == "eieren" and money >= 2:
    print("Uw maaltijd wordt bezorgd.")
else:
    print("Sorry, de maaltijd kan niet worden bezorgd.")



Juist. and wordt eerst geëvalueerd, daarna pas or. De linkerzijde meal == "kaas" is al True.
Let op. In Python heeft and een hogere prioriteit dan or. De voorwaarde werkt dus als meal == "kaas" or (meal == "eieren" and money >= 2).

Vraag 6. Wat verandert deze versie van de code?

meal = "kaas"
money = 0

if (meal == "kaas" or meal == "eieren") and money >= 2:
    print("Uw maaltijd wordt bezorgd.")
else:
    print("Sorry, de maaltijd kan niet worden bezorgd.")



Precies. Met haakjes bepaal je expliciet welke condities eerst samen worden geëvalueerd.
Nee. Haakjes zijn wel degelijk belangrijk: ze bepalen de volgorde waarin and en or worden uitgevoerd.

Vraag 7. Wat print deze code?

requested_toppings = ['uien', 'salami', 'olijven']

if 'uien' in requested_toppings:
    print("uien toegevoegd")



Klopt. De string 'uien' staat in de lijst, dus de voorwaarde is True en de tekst wordt geprint.
Let op. Met in kun je prima testen of een waarde in een lijst voorkomt.

Vraag 8. Welke prijs wordt gekozen in deze if-elif-else keten?

weight = 600

if weight < 400:
    price = 7
elif weight < 800:
    price = 13
else:
    price = 18



Juist. 600 is niet kleiner dan 400, maar wel kleiner dan 800, dus de elif-tak wordt uitgevoerd.
Niet goed. In een if-elif-else keten wordt de eerste voorwaarde die True is uitgevoerd, de rest wordt overgeslagen.

Vraag 9. Wat wordt er geprint?

available_toppings = ['salami', 'olijven']
requested_extra_toppings = []

if requested_extra_toppings:
    print("We voegen extra toppings toe")
else:
    print("Weet je zeker dat je geen extra toppings wilt?")



Helemaal goed. Een lege lijst wordt gezien als False, dus de else-tak wordt uitgevoerd.
Nee. In een if wordt een lege lijst als False behandeld; daarom kom je in de else.

Vraag 10. Welke van de onderstaande uitspraken over booleans en if-statements zijn waar?




Goed gedaan. Booleans zijn altijd True of False en een lege lijst telt als False in een if-test.
Niet helemaal. In dit hoofdstuk heb je gezien dat booleans alleen True of False zijn en dat een lege lijst als False wordt beschouwd.