15. Als… dan…#

Je hebt inmiddels kennisgemaakt met while loops, die je in staat stellen een blok code te herhalen. In dit hoofdstuk behandelen we het if statement, waarmee Python kan kiezen om een blok code wel of niet uit te voeren.

Kopieer onderstaande code naar een nieuw bestand in Mu editor en sla het op als hello_if.py.

hello_if.py#
1# Functie say_hello() toont een begroeting
2def say_hello(name):
3    print("Hallo", name)
4
5# Hoofdprogramma
6say_hello("Tony")
7say_hello("Tina")

In hello_if.py wordt de functie say_hello() gedefinieerd, die een begroeting op het scherm toont. In regels 6 en 7 wordt deze functie aangeroepen met twee verschillende namen. De output van het programma is:

hello_if.py output#
Hallo Tony
Hallo Tina

Nu gaan we de functie say_hello() uitbreiden met een if statement:

hello_if.py#
1# Functie say_hello() toont een begroeting
2def say_hello(name):
3    if name == "Tony":
4        print("Hallo", name)
5
6# Hoofdprogramma
7say_hello("Tony")
8say_hello("Tina")

Met het dubbele is-gelijk-aan-teken == kun je Python laten checken of twee waarden aan elkaar gelijk zijn. Regel 3 van hello_if.py kun je dus lezen als: ‘Als de waarde van de variabele name gelijk is aan "Tony", doe dan het volgende.’ Merk op dat de inspringing van regel 4 aangeeft dat die regel binnen het if statement valt.

Wanneer je deze code runt, is de output:

hello_if.py output#
Hallo Tony

Het programma toont nu alleen een begroeting als de naam Tony wordt gebruikt en anders niet.

If en else#

Een if statement gebruik je om Python te vertellen: ‘Als er dit aan de hand is, doe dan het volgende.’ Met het keyword else kun je dat uitbreiden naar ‘Als er dit aan de hand is, doe dan het volgende, en zo niet, doe dan iets anders.’

Wijzig de functie say_hello() als volgt:

hello_if.py#
 1# Functie say_hello() toont een begroeting
 2def say_hello(name):
 3    if name == "Tony":
 4        print("Hallo", name)
 5        print("Leuk je weer te zien.")
 6    else:
 7        print("Hallo", name)
 8        print("Aangenaam kennis te maken.")
 9
10# Hoofdprogramma
11say_hello("Tony")
12say_hello("Tina")

Begrijp je wat hier gebeurt? De regels 4 en 5 worden uitgevoerd als aan de functie say_hello() het argument "Tony" wordt meegegeven. In alle andere gevallen worden de regels 7 en 8 uitgevoerd. Je kunt aan het hoofdprogramma nog extra regels toevoegen om het effect te zien:

hello_if.py#
10# Hoofdprogramma
11say_hello("Tabe")
12say_hello("Tess")
13say_hello("Tony")
14say_hello("Tina")

Run het programma en zie dat alleen bij de naam Tony de reactie ‘Leuk je weer te zien.’ wordt geprint.

Wanneer je deze code runt, is de output:

hello_if.py output#
Hallo Tabe
Aangenaam kennis te maken.
Hallo Tess
Aangenaam kennis te maken.
Hallo Tony
Leuk je weer te zien.
Hallo Tina
Aangenaam kennis te maken.
Opdracht 01

Je gaat een eenvoudig raadspelletje maken, waarbij de gebruiker een getal moet raden dat de computer ‘in gedachten heeft’. Maak daartoe in Mu editor een nieuw bestand raad_het_getal.py aan en kopieer onderstaande code erin.

raad_het_getal.py#
1import random
2
3# Variabele getal_in_gedachten bevat een willekeurige integer tussen 0 en 5.
4getal_in_gedachten = random.randint(1, 4)
5
6print('Ik heb een getal onder de vijf in gedachten. Kun je het raden?')
7getal = int(input('Typ een getal onder de vijf: '))

Op regel 1 wordt met import random de Python random module geïmporteerd, die je in staat stelt om op regel 4 met de functie randint() een willekeurig getal te genereren.

Voeg onder deze code een if statement toe waardoor

  • als de gebruiker het goed heeft geraden, de tekst Dat klopt, goed geraden! wordt geprint;

  • als de gebruiker het fout heeft, de tekst Helaas. Het goede getal was .. met op de puntjes het goede getal wordt geprint.

Hint

Het if statement heeft de volgende vorm:

if ...:
    print('Dat klopt, goed geraden!')
else:
    print('Helaas. Het goede getal was ' + str(getal_in_gedachten))

Welke voorwaarde moet op de puntjes staan?

Opdracht 02

Het raadspelletje van opdracht 01 wordt leuker als een speler meerdere keren kan raden. Om dat voor elkaar te krijgen, hebben we een while loop nodig. Pas je code als volgt aan:

raad_het_getal.py#
 1import random
 2
 3# Variabele getal_in_gedachten bevat een willekeurige integer tussen 0 en 5.
 4getal_in_gedachten = random.randint(1, 4)
 5# Variabele geraden is een boolean die aangeeft of het getal is geraden
 6geraden = False
 7
 8print('Ik heb een getal onder de vijf in gedachten. Kun je het raden?')
 9
10while not geraden:
11    getal = int(input('Typ een getal onder de vijf: '))
12    if ...

Op regel 10 zie je de start van de while loop while not geraden:. Zolang de waarde van de variabele geraden False is, blijft deze while loop zich herhalen.

Vul vanaf regel 12 het if statement aan waardoor

  • als de gebruiker het goed heeft geraden, de tekst Dat klopt, goed geraden! wordt geprint en de while loop stopt;

  • als de gebruiker het fout heeft, de tekst Helaas, dat is fout. wordt geprint.

Opdracht 03

Breid het raadspelletje van opdracht 02 uit zodat wordt getoond hoeveel beurten de gebruiker nodig had om het getal te raden. Voeg daartoe een variabele aantal_beurten aan de code toe en geef deze de waarde 1. Bij elke herhaling van de while loop moet aantal_beurten met 1 worden opgehoogd. Wanneer de gebruiker het getal heeft geraden, moet worden geprint hoeveel beurten daarvoor nodig waren.

Elif#

Je kunt een if statement nog verder uitbreiden met het keyword elif, dat staat voor ‘else if’. In de onderstaande code zie je hoe dat werkt. Hierin is tevens de aanroep print("Hallo", name) buiten het if statement geplaatst (op regel 3) omdat we die begroeting voor elke naam willen tonen.

hello_if.py#
 1# Functie say_hello() toont een begroeting
 2def say_hello(name):
 3    print("Hallo", name)
 4    if name == "Tony":
 5        print("Leuk je weer te zien.")
 6    elif name == "Tina":
 7        print("Hoe gaat het met je?")
 8    else:
 9        print("Aangenaam kennis te maken.")
10
11# Hoofdprogramma
12say_hello("Tabe")
13say_hello("Tess")
14say_hello("Tony")
15say_hello("Tina")

Op regel 4 checkt Python of de waarde van name gelijk is aan "Tony". Zo ja, dan wordt regel 5 uitgevoerd. Zo nee, dan checkt Python in regel 6 of name misschien de waarde "Tina" bevat. Zo ja, dan wordt regel 7 uitgevoerd. Zo nee, dan zorgt regel 8 ervoor dat de code in regel 9 wordt uitgevoerd.

hello_if.py output#
Hallo Tabe
Aangenaam kennis te maken.
Hallo Tess
Aangenaam kennis te maken.
Hallo Tony
Leuk je weer te zien.
Hallo Tina
Hoe gaat het met je?
Opdracht 04

Je gaat weer een raadspelletje maken, maar nu met een getal onder de 100. Maak daartoe in Mu editor een nieuw bestand raad_het_getal_2.py aan en kopieer onderstaande code erin.

raad_het_getal.py#
 1import random
 2
 3# De variabele getal_in_gedachten bevat een willekeurige integer tussen 0 en 100.
 4getal_in_gedachten = random.randint(1, 99)
 5# Variabele geraden is een boolean die aangeeft of het getal is geraden
 6geraden = False
 7
 8print('Ik heb een getal onder de honderd in gedachten. Kun je het raden?')
 9
10while not geraden:
11    getal = int(input('Typ een getal onder de honderd: '))
12    if ...

Vul vanaf regel 12 het if statement aan waardoor

  • als de gebruiker het goed heeft geraden, de tekst Dat klopt, goed geraden! wordt geprint en de while loop stopt;

  • als de gebruiker een te laag getal heeft geraden, de tekst Helaas, dat is te laag. wordt geprint.

  • als de gebruiker een te hoog getal heeft geraden, de tekst Helaas, dat is te hoog. wordt geprint.

Opdracht 05

Breid je code van opdracht 04 net als bij opdracht 03 weer uit met een aantal_beurten variabele zodat wordt getoond hoeveel beurten de gebruiker nodig had om het getal te raden.

And en or#

In een if statement kun je gebruik maken van and en or om voorwaarden te combineren. Stel dat we zowel Tony als Tina willen begroeten met de zin ‘Leuk je weer te zien.’, dan zouden we de functie say_hello() als volgt kunnen aanpassen (het hoofdprogramma blijft ongewijzigd):

hello_if.py#
1# Functie say_hello() toont een begroeting
2def say_hello(name):
3    print("Hallo", name)
4    if name == "Tony" or name == "Tina":
5        print("Leuk je weer te zien.")
6    else:
7        print("Aangenaam kennis te maken.")

In regel 4 staat if name == "Tony" or name == "Tina":. Het keyword or betekent of. Hier staat dus: ‘Als de waarde van name gelijk is aan "Tony" of als de waarde van name gelijk is aan "Tina", doe dan het volgende.’

Vraag 01

Het keyword and betekent en. Wat zou er gebeuren als je regel 4 wijzigt in if name == "Tony" and name == "Tina":? Probeer het maar eens uit. Kun je het resultaat verklaren?

Antwoord

De waarde van name kan niet tegelijkertijd zowel "Tony" als "Tina" zijn. Dus name == "Tony" and name == "Tina" is altijd onwaar. Daardoor springt de code naar regel 6 en wordt elke naam begroet met "Aangenaam kennis te maken.".

Opdracht 06

Je kent vast wel het spelletje Steen, Papier, Schaar. We gaan dit spel nu programmeren in Python. Maak een nieuw bestand rock_paper_scissors.py aan en kopieer onderstaande code erin.

rock_paper_scissors.py#
 1import random
 2
 3print('*********************************************')
 4print('* Welkom bij het spel Rock, Paper, Scissors *')
 5print('*********************************************')
 6print('Typ r, p, of s om rock, paper of scissors te kiezen')
 7human = input('Uw keuze: ')
 8
 9computer = random.choice(['r', 'p', 's'])
10
11print('De computer koos ' + computer + ' en u koos ' + human + '.')

In regels 3 t/m 7 wordt een welkomstboodschap geprint en krijgt de gebruiker de gelegenheid om r, p, of s te typen. In regel 9 gebruiken we de random.choice() functie om de computer een willekeurige keuze uit deze drie letters te laten maken.

Voeg aan de code een if statement toe waarmee je vaststelt welke speler het spel heeft gewonnen. Gebruik de volgende structuur:

if ... :
    # De speler wint
    print('U wint!')
elif ... :
    # De computer wint
    print('De computer wint...')
else:
    # Gelijkspel
    print('Gelijkspel.')

Bedenk zelf welke voorwaarden op de puntjes moeten staan. De speler wint bijvoorbeeld als zij/hij steen koos en de computer schaar, maar ook als zij/hij papier koos en de computer steen. Gebruik and en or om voorwaarden te combineren.

Opdracht 07

Deze opdracht volgt op opdracht 06. In regel 11 van rock_paper_scissors.py staat:

11print('De computer koos ' + computer + ' en u koos ' + human + '.')

De variabelen computer en human bevatten elk een letter r, p of s. De output van regel 11 zou dus bijvoorbeeld kunnen zijn:

De computer koos r en u koos p.

Dit ziet er niet zo mooi uit. Beter zou zijn:

De computer koos steen en u koos papier.

Vervang regel 11 door twee if statements. Het eerste statement zorgt ervoor dat met een zin de keuze van de computer wordt getoond en het tweede doet dat voor de keuze van de speler. De output zou er dan bijvoorbeeld zo uit kunnen zien:

De computer koos steen.
U koos papier.