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 eenelse
-blok opgeven; dat wordt uitgevoerd als de voorwaarde van deif
-opdracht onwaar is.
- Je kunt Booleaanse voorwaarden
A
enB
combineren totA and B
,A or B
, ennot 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:
Je gebruikt else
als volgt:
if «voorwaarde»: «waar-gedeelte» # een inspringend blok else: «onwaar-gedeelte» # nog een inspringende blokPython 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.
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 isZoals 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
Booleaanse operatoren: and
, or
, not
Je kunt "and
", "or
", en "not
" combineren.
- De expressie
A and B
is waar indien zowelA
alsB
waar zijn, en is niet waar wanneer één van beiden niet waar is. (Bijvoorbeeld, je wordt nat wanneer het regentand
je hebt je paraplu vergeten.) - De expressie
A or B
is waar wanneer ofwelA
waar is ofB
waar is, en is niet waar wanneer beiden niet waar zijn. (Bijvoorbeeld, de school is dicht wanneer het vakantie isor
wanneer het weekend is.) - De expressie
not A
is waar wanneerA
niet waar is, en is niet waar wanneerA
waar is. (Bijvoorbeeld, je hebt trek wanneer jenot
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.
Een voorbeeld waarbij and
wordt gebruikt. Hier is een programma dat getallen in letters vertaalt, waarbij gelet wordt op niet-correcte invoer.
A or B
?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 deducenot ((not A) and (not B)) = not (not (A or B))and observe that
not(not X))
always equals X
, sonot ((not A) and (not B)) = not (not (A or B)) = A or BThis 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.
A or not B and Cwanneer (A, B, C) = (False, True, True)? Hint
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