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, wanneer aan een voorwaarde is voldaan, bepaalde opdrachten wel of niet worden uitgevoerd. Laten we als voorbeeld ons programma aanpassen om een boodschap te printen 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 het 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: om iets te checken (is leeftijd groter dan 65?) en zekere opdrachten uit te voeren (printen van Geniet van uw pensioen!, wanneer de check waar oplevert.
We noemen datgene wat gecheckt wordt de voorwaarde, en de opdrachten die afhankelijk of de check waar oplevert de body. De body moet inspringen, dat wil zeggen dat er extra spaties zijn aan het begin van de regel (zoals in het voorbeeld hierboven).De body kan meer dan een opdracht bevatten: die dan allemaal evenveel spaties moeten 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 input 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
Type de invoer voor je programma hieronder in.

De algemene structuur van een if statement

  • 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 beneden), en een dubbele punt :
  • Dan een Body , waarmee we een rij opdrachten bedoelen die één of meerdere opdrachten lang kan zijn.  Python bepaalt waar het blok begint en eindigt door middel van inspringen, of anders gezegd je moet een zelfde aantal spaties plaatsen voor iedere regel in het blok.

Body

Bodies zullen later op veel meer plaatsen worden gebruikt: in "for loops", en wanneer je bijvoorbeeld je eigen functies schrijft. (Een normale manier voor andere programmeertalen om een body aan te geven is met accoladen { }. Alle regels in de body 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 nieuwe body wordt gestart, en wanneer er minder spaties zijn, eindigt de body.

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 te doen gebruikelijk kun je in elk onderdeel de regels verslepen.

Deel 1: Onverwacht inspringen (unexpected indent)

Scramble Opgave: Onverwacht inspringen (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 (unexpected unindent)

Scramble Opgave: Onverwacht niet inspringen (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 (indent expected but not found)

Scramble Opgave: Inspringen verwacht 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

Scramble Opgave: 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 booleaans

Tot nu toe zagen we, in het «voorwaarde» deel van een if statement, 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 vast te leggen; er bestaan slechts twee Booleaanse waarden, True and False (waar en niet waar).

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.

Booleaanse vergelijkingen

We zijn al eerder de operatoren <, >, <= en >=  tegen gekomen, 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, het zal True afgeven waneer  x en y gelijk zijn
  • x != y is de is ongelijk operator, het zal True afgeven wanneer x en y niet gelijk zijn
  • == en != werken ook op strings en andere datatypen

(Hier worden twee gelijktekens gebruikt == omdat het enkelvoudige gelijk teken al betekenis heeft in x = «expressie» waarmee bedoeld wordt "ken aan x de waarde van «expressie» toe. Het gebruik van = met == 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 getal positief, negatief of nul is.
Type 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 password=='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 password=='openSesame':  
print('User logged on.')
if hour>17:
print('Good evening!')
print('Enter a command:')

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

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