06: If

In alle programma's tot nu toe zijn alle opdrachten uitgevoerd, zonder dat er een regel werd overgeslagen. Zoals in het volgende voorbeeld.
Klik op de knoppen Back (terug) en Forward (vooruit) om door het programma te gaan. Of gebruik de pijltjestoetsen.
Opmerking: "line that has just executed" betekent "regel die als laatste is uitgevoerd" en " next line to execute" betekent " de regel die als eerstvolgende zal worden uitgevoerd".

Het nieuwe in deze les is de if-opdracht, die het mogelijk maakt om, afhankelijk van of aan een voorwaarde is voldaan, bepaalde opdrachten wel of niet uit te voeren. Laten we als voorbeeld ons programma aanpassen om een boodschap af te drukken wanneer de leeftijd van een persoon voldoende is. We zullen twee regels toevoegen: if leeftijd > 65: (hetgeen betekent "als de leeftijd is hoger dan 65" en print('Geniet van uw pensioen'). Ga nu nog eens stap voor stap door het programma.

Merk op dat de nieuwe print-opdracht werd overgeslagen omdat leeftijd slechts 32 was. Wat gebeurt er met exact hetzelfde programma wanneer geboorteJaar veranderd wordt in 1928:

Heb je het verschil gezien? In de laatste versie (met leeftijd 85) werden er twee regels afgedrukt en geen enkele regel overgeslagen. Dit is precies wat de if-opdracht beoogt: een voorwaarde nagaan (is leeftijd groter dan 65?) en bepaalde opdrachten uitvoeren (afdrukken van Geniet van uw pensioen!) enkel wanneer de voorwaarde waar is.
We noemen de opdrachten die enkel uitgevoerd worden als de voorwaarde waar is, het lichaam (Eng.: body) van de if-opdracht. Het lichaam moet inspringen, dat wil zeggen dat er extra spaties zijn aan het begin van de regel (zoals in het voorbeeld hierboven). Het lichaam kan meer dan één opdracht bevatten: die moeten dan allemaal evenveel spaties inspringen. Hier volgt een voorbeeld.

  • Probeer bovenstaand programma in de console of de visualizer uit te voeren met geboortejaar 1982.
  • if x < y: betekent "als x is kleiner dan y"
  • if x >= y: betekent "als x is groter dan of gelijk aan y"
  • if x <= y: betekent "als x is kleiner dan of gelijk aan y"

Programmeeroefening: Twee varianten
Schrijf een programma dat een geheel getal van de invoer inleest: pannenkoeken = int(input()). Wanneer pannenkoeken meer is dan 3, print dan Yum!. En als pannenkoeken niet meer is dan 3, print dan Still hungry!. Hint
Tik de invoer voor je programma hieronder in.

De algemene structuur van een if-opdracht

  • De eerste regel
    if «voorwaarde»:
    heeft drie delen: het woordje if, de «voorwaarde» die ofwel Waar of Onwaar (True of False) moet zijn (meer hierover hieronder), en een dubbele punt :
  • Dan het lichaam, wat een voorbeeld is van een blok, waarmee we een reeks opdrachten bedoelen die één of meerdere opdrachten lang kan zijn. Python leidt af waar het blok begint en eindigt door inspectie van de inspringing, of anders gezegd je moet een zelfde aantal spaties plaatsen voor iedere regel in het blok.

Lichamen

Lichamen zullen later op veel meer plaatsen worden gebruikt: in for-lussen, en wanneer je bijvoorbeeld je eigen functies schrijft. (Een typische manier in vele andere programmeertalen om een lichaam aan te geven is met accoladen { }.) Alle regels in het lichaam moeten op precies op dezelfde manier inspringen: ze moeten starten met exact hetzelfde aantal spaties. Zodra Python ziet dat de volgende regel meer spaties heeft, neemt het aan dat er een nieuw lichaam wordt gestart, en wanneer er minder spaties zijn, eindigt het lichaam.

De volgende oefening bestaat eigenlijk uit 4 oefeningen. Je moet de regels van een programma in een andere volgorde zetten om telkens een ander resultaat te krijgen. Klik op de horizontale balk-knoppen om elk van de onderdelen te openen; je kunt dat in elke gewenste volgorde doen. Zoals gebruikelijk kun je in elk onderdeel de regels verslepen.

Deel 1: Onverwacht inspringen (Eng.: unexpected indent)

Volgorde-oefening: Onverwacht inspringen (Eng.: unexpected indent)
Je moet ervoor zorgen dat de volgende fout optreedt:

IndentationError: unexpected indent
  • if 1000 < 10:
  • print("message 1")
  • print("message 2")
  • if 2 > 1:
  • print("message 3")

Deel 2: Onverwacht niet inspringen (Eng.: unexpected unindent)

Volgorde-oefening: Onverwacht niet inspringen (Eng.: unexpected unindent)
Je moet ervoor zorgen dat de volgende fout optreedt:

IndentationError: unindent does not match any outer indentation level
  • if 1000 < 10:
  • print("message 2")
  • if 2 > 1:
  • print("message 3")
  • print("message 1")

Deel 3: Inspringen verwacht maar niet aangetroffen (Eng.: indent expected but not found)

Volgorde-oefening: Inspringen verwacht (Eng.: expected indent)
Je moet ervoor zorgen dat de volgende fout optreedt:

IndentationError: expected an indented block
  • if 1000 < 10:
  • print("message 1")
  • print("message 2")
  • if 2 > 1:
  • print("message 3")

Deel 4: Juiste wijze van inspringen

Volgorde-oefening: Alles in orde
Zorg dat er geen foutmelding optreedt
  • if 1000 < 10:
  • print("message 1")
  • print("message 2")
  • if 2 > 1:
  • print("message 3")
 

True, False, en Booleaanse waarden

Tot nu toe zagen we, in het «voorwaarde»-deel van een if-opdracht, eenvoudige numerieke ongelijkheden zoals x > y en x <= y, die al of niet waar zijn. Meer in het algemeen wordt iedere expressie die of waar of niet waar is Booleaans genoemd (naar George Boole). In Python wordt het booleaanse type gebruikt om Booleaanse waarden voor te stellen; er bestaan slechts twee Booleaanse waarden, True en False (waar en onwaar).

Voorbeeld
Booleaanse expressies

Merk op dat als je in Python de Booleaanse waarden True en False direct in het programma gebruikt, ze met een hoofdletter moeten beginnen, anders krijg je een foutmelding.

Vergelijkingen

We zijn al eerder de operatoren <, >, <= en >=  tegengekomen, waarin twee getallen worden vergeleken en waarbij een Booleaanse waarde wordt teruggegeven. Er zijn nog twee manieren om getallen te vergelijken:

  • x == y is de is-gelijk-operator; ze zal True teruggeven als en slechts als x en y gelijk zijn.
  • x != y is de is-ongelijk-operator; ze zal True teruggeven als en slechts als x en y niet gelijk zijn.
  • == en != werken ook op tekenreeksen en andere types van waarden.

(Hier worden twee gelijktekens gebruikt == omdat het enkelvoudige gelijkteken al betekenis heeft in x = «expressie» waarmee bedoeld wordt "ken aan x de waarde van «expressie» toe". Het verwarren van = en == komt vaak voor: source of bugs.)

Hier volgt om te beginnen een voorbeeld.

Programmeeroefening: What's Your Sign?
Schrijf een programma dat een getal inleest en daarna als uitvoer één van de volgende woorden tot uitvoer heeft: Positief, Negatief, of Nul. Dit al naar gelang het ingelezen getal positief, negatief of nul is.
Tik de invoer voor je programma hieronder in.

We hebben zojuist het concept blok geïntroduceerd (meerdere regels na elkaar die hetzelfde inspringen). Er kan een blok in een ander blok voorkomen:

if wachtwoord=='SesamOpenU':
  print('De gebruiker is ingelogd.')
  if uur>18:
    print('Goedenavond!')
  print('Type een opdracht in:')
Hier bestaat uit het buitenste blok uit 4 regels en het binnenblok uit maar 1 regel: 
if wachtwoord=='SesamOpenU':  
print('De gebruiker is ingelogd.')
if uur>18:
print('Goedenavond!')
print('Type een opdracht in:')

Meerkeuze-opgave: Geneste ifs
Welke van de volgende uitvoer is niet mogelijk?
Correct! Wanneer er ook maar één boodschap te zien is, dan betekent dat dat het buitenste (blauwe) blok is uitgevoerd, of met andere woorden dat het wachtwoord correct was. In dat geval, zelfs als uur>18 onwaar is (waardoor het binnenblok wordt overgeslagen), zal de regel print('Type een opdracht in:') van het buitenblok toch worden uitgevoerd.
.

Later, in les 9, zullen we zien dat in programma's waarin meerdere Booleaanse waarden moeten worden gecheckt, ze kunnen worden vereenvoudigd door middel van else en elif (else if) en tevens het gebruik van de operatoren "and", "or" en "not". Nu kun je naar de volgende les gaan.