09: Else, And, Or, Not

In deze les leer je om complexe opgaven, waarin een voorwaarde getest wordt, elegant uit te voeren. Daarbij komen twee nieuwe aspecten van Python aan de orde.

  • Bij een if-opdracht kan je optioneel een else-blok opgeven; dat wordt uitgevoerd als de voorwaarde van de if-opdracht onwaar is.
  • Je kunt Booleaanse voorwaarden A en B combineren tot A and B, A or B, en not A.

else-blokken

Het komt vrij vaak voor dat je bij het schrijven van een programma een voorwaarde wilt testen, en afhankelijk van of de voorwaarde waar of niet waar is de ene dan wel de andere actie wilt uitvoeren. We zagen daar eerder een voorbeeld van, toen we wilden bepalen welke van de twee getallen x en y het grootst was, waarbij we twee if-opdrachten gebruikten. Laten we het programma herschrijven en een if-opdracht met een else-blok gebruiken:

Voorbeeld
Berekening van het maximum en illustratie van else
Tik de invoer voor je programma hieronder in.

Je gebruikt else als volgt:

if «voorwaarde»:
   «waar-gedeelte»        # een inspringend blok
else:
   «onwaar-gedeelte»       # nog een inspringende blok
Python evalueert de voorwaarde. Als ze waar is wordt het waar-gedeelte uitgevoerd, en als ze niet waar is wordt het onwaar-gedeelte uitgevoerd.

De filosofie van else

Het is niet zo dat we iets extra's kunnen door het gebruik van else, maar het programma is wel gemakkelijker te lezen, fouten zijn makkelijker te vinden, en het programma is gemakkelijker te onderhouden. Hier volgen twee programmafragmenten die hetzelfde doen:

Versie A
if lengte < 256:
   print('Te klein voor deze rit')
else:
   print('Welkom aan boord!')
Versie B
if lengte < 256:
   print('Te klein voor deze rit')
if lengte >= 256:
   print('Welkom aan boord!')

Beide versies doen hetzelfde, en versie B gebruikt niet eens een else-blok. Maar de meeste programmeurs zijn het erover eens dat versie A beter is. Bijvoorbeeld: als bij versie B de voorwaarde veranderd moet worden (bijv., wanneer er met 200 in plaats van 256 vergeleken dient te worden) dan is er maar één verandering nodig bij de code van versie A in plaats van twee veranderingen bij de code van versie B. Ook kan versie A onmiddellijk begrepen worden, terwijl je in B dient te checken of misschien geen van beide voorwaarden waar zijn, of beide voorwaarden allebei waar zijn.

Programmeeroefening: Absolute waarde
De absolute waarde van een getal is als volgt gedefinieerd. Voor een getal x dat positief of 0 is, is de absolute waarde van x gelijk aan x. Wanneer x een negatief getal is, dan is de absolute waarde van x gelijk aan -x, of in andere woorden hetzelfde als x maar zonder het minteken. Zo is de absolute waarde van 5 gelijk aan 5, en is de absolute waarde van -10 gelijk aan --10 oftewel 10. Schrijf een programma dat een geheel getal als invoer inleest en dat de abolute waarde ervan afdrukt en gebruik daarbij if en else.
Tik de invoer voor je programma hieronder in.

Python heeft een ingebouwde functie abs(x) die de absolute waarde van x levert. De grader hierboven verhindert het gebruik ervan hier, maar elders kun je abs(x) gewoon gebruiken.

elif-blokken

In Python bestaat ook elif, waarmee het gemakkelijker gemaakt wordt om meerdere voorwaarden na elkaar te checken. Het normale gebruik van elif is het volgende:

if «voorwaarde1»:
   «gedeelte1»        # wordt uitgevoerd wanneer voorwaarde1 waar is
elif «voorwaarde2»:
   «gedeelte2»        # wordt uitgevoerd wanneer voorwaarde1 niet waar is, en voorwaarde2 waar is
Zoals je wel begrepen zult hebben is elif de afkorting van else if, omdat het hetzelfde is als het opnemen van een if-opdracht binnen een else-blok. elif leidt echter tot kortere code en minder inspringing. En dat maakt dat je programma makkelijker te lezen is, en dat je er makkelijker fouten uit kunt halen en ook dat het makkelijker te schrijven is. Sterker nog: je kunt een willekeurig aantal elif-blokken na elkaar in de if-opdracht opnemen en al of niet een else-blok op het eind toevoegen:

if «voorwaarde1»:
   «gedeelte1»      # wordt uitgevoerd wanneer voorwaarde1 waar is 
elif «voorwaarde2»:
   «gedeelte2»      # wordt uitgevoerd wanneer voorwaarde1 niet waar is en voorwaarde2 waar is
elif «voorwaarde3»:
   «gedeelte3»      # wordt uitgevoerd wanneer voorwaarde1 en voorwaarde 2 beiden niet waar zijn en voorwaarde3 waar is
else:               # de laatste twee regels kunnen voorkomen maar dat hoeft niet
   «else-gedeelte»  # wordt uitgevoerd wanneer ALLE voorwaarden onwaar zijn
Programmeeroefening: First, Second, Third
De Engelstalige woorden 1st, 2nd, 3rd, 4th, 5th, 6th, 7th, 8th, 9th worden rangtelwoorden genoemd. Schrijf een programma dat een geheel getal x tussen 1 en 9 als invoer inleest. Het programma dient het bij x behorende (Engelse) rangtelwoord af te drukken.
Hint: je hoeft geen 9 aparte gevallen te onderscheiden; 4 is genoeg.
Tik de invoer voor je programma hieronder in.

Booleaanse operatoren: and, or, not

Je kunt "and", "or", en "not" combineren.

  • De expressie A and B is waar indien zowel A als B waar zijn, en is niet waar wanneer één van beiden niet waar is. (Bijvoorbeeld, je wordt nat wanneer het regent and je hebt je paraplu vergeten.)
  • De expressie A or B is waar wanneer ofwel A waar is of B waar is, en is niet waar wanneer beiden niet waar zijn. (Bijvoorbeeld, de school is dicht wanneer het vakantie is or wanneer het weekend is.)
  • De expressie not A is waar wanneer A niet waar is, en is niet waar wanneer A waar is. (Bijvoorbeeld, je hebt trek wanneer je not een lunch hebt gehad.)

Hier volgt een programma dat alle mogelijkheden laat zien. Precies zoals de 'tafels van vermenigvuldiging' die je je herinnert van de basisschool. Dit wordt een waarheidstabel genoemd.

Voorbeeld
Waarheidstabel

Een voorbeeld waarbij and wordt gebruikt. Hier is een programma dat getallen in letters vertaalt, waarbij gelet wordt op niet-correcte invoer.

Voorbeeld
Een voorbeeld met and: Vertalen van getallen in letters, met 1=A, 2=B, etc.
Tik de invoer voor je programma hieronder in.

Programmeeroefening: 26 Letters
Schrijf een programma dat het tegenovergestelde doet van het voorbeeld hierboven: het krijgt als invoer een letter en geeft als uitvoer het corresponderende getal (tussen 1 en 26). Je programma mag alleen maar hoofdletters accepteren. Als foutmelding moet je programma niet toegestaan afdrukken wanneer de invoer geen hoofdletter is. HintAlternatieve stringvergelijkingsmethode
Tik de invoer voor je programma hieronder in.

Meerkeuze-opgave: De wet van De Morgan
Welke van de volgende expressies is equivalent aan A or B?
Correct! Here is one way to arrive at this answer. First, not (A or B) is only true when both A and B are false. Also, note that (not A) and (not B) is only true if both not A and not B are true, i.e. if both A and B are false. So we have the following equality:
(not A) and (not B) = not (A or B)
Put a not around both sides, so we deduce
not ((not A) and (not B)) = not (not (A or B))
and observe that not(not X)) always equals X, so
not ((not A) and (not B)) = not (not (A or B)) = A or B
This way of rewriting a boolean expression is one of De Morgan's laws.

Volgorde van de operaties

Booleaanse operatoren hebben een "volgorde" net zoals rekenkundige operatoren. De volgorde is

NAO: not (hoogste voorkeur), and, or (laagste voorkeur)

zo geldt,

not x or y and z betekent (not x) or (y and z)

We sluiten deze les af met een korte vraag over deze feiten.

Meerkeuze-opgave: Volgorde van de operaties
Wat is de waarde van

A or not B and C
wanneer (A, B, C) = (False, True, True)? Hint
Correct! The order of operations makes this equivalent to
A or ((not B) and C)
substituting the values, we have
False or ((not True) and True)
and now simplifying one step at a time gives
False or ((not True) and True)
= False or (False and True)
= False or False
= False
Wanneer je dit hebt doorgewerkt, ben je klaar voor de volgende les.