Hoofdstuk 7 - Input & While loops

01 - De input( )-functie
  • De input( )-functie wacht op de gebruiker die tekst moet invoeren
  • De ingevoerde waarde wordt opgeslagen in een variabele
  • De input( )-functie heeft één argument: de prompt (de instructietekst die je aan de gebruiker wilt laten zien)
  • Veel editors voeren geen Python-code uit; maak gebruik van een terminal om je programma uit te voeren
message = input('Geef een getal onder de 432: ')
print(message)
Geef een getal onder de 432: 256
256

  • De prompt kan ook in een variabele worden gezet
  • Let op de extra spaties die nodig zijn om de prompt en de invoer te scheiden van elkaar
prompt = "In de omgekeerde wereld is niks zoals het is,"
prompt += "\nals ik voor zeg is het achter, als ik raak zeg is het.. "
message = input(prompt)
print("Echt " + message)
In de omgekeerde wereld is niks zoals het is,
als ik voor zeg is het achter, als ik raak zeg is het.. mis
Echt mis

  • De input( )-functie interpreteert alle invoer standaard als een string
  • Wanneer je de invoer gebruikt om mee te rekenen krijg je een foutmelding
  • Gebruik de int( )-functie om de invoer om te zetten naar een integer
prompt = "Reken uit je hoofd 16 * 63? "
answer = input(prompt)
if int(answer) == 1008:
    print("Wel goed, maar ongeloofwaardig")
else:
    print("Helaas, de meesten hebben hem fout")
Reken uit je hoofd 16 * 63? 12
Helaas, de meesten hebben hem fout

De modulo operator
  • De modulo operator wordt gebruikt met het % procent teken
  • Modulo deelt het eerste getal door het tweede getal, maar geeft alleen de restwaarde terug
  • Wanneer het eerste getal deelbaar is door het tweede getal retourneert het een 0
# 15 / 3 = 5 --- restwaarde is 0
var1 = 15
var2 = 3
answer = var1 % var2
print(answer)   
0

  • Even getallen zijn altijd deelbaar door 2
number = input('Geef een getal op: ')
number = int(number)
if number % 2 == 0:
    print('Het getal ' + str(number) + " is een even getal")
else:
    print('Het getal ' + str(number) + " is een oneven getal")
Geef een getal op: 24
Het getal 24 is een even getal

02 - De while-loop
  • De for-loop pakt een verzameling items en voert een blok code voor elk item in de verzameling één keer uit
  • De while-loop draait daarentegen zolang er (while) aan een bepaalde voorwaarde wordt voldaan
current_number = 0
while current_number <= 5:
    print(current_number)
    current_number += 1
0
1
2
3
4
5

  • Met een while-loop kun je een applicatie oneindig lang laten doorlopen
  • Door een stop-actie in te voegen kan de gebruiker zelf bepalen wanneer het moet stoppen
  • De message variabele met een lege string is nodig om de eerste keer door de while-loop te gaan
prompt = "Niemand hier die vindt een boete, fine.: "
prompt += "\nType 'stop' om te stoppen\n"
message = ''
while message != 'stop':
    message = input(prompt)
    print(message)
klopt
stop

  • Om de stop-actie niet ook te printen kan een if-conditie worden toegevoegd
prompt = "Door de fiets te nemen is mijn weg, road."
prompt += "\nType 'stop' om te stoppen\n"
message = ''
while message != 'stop':
    message = input(prompt)
    if message != 'stop':
        print(message)
klopt

  • In een grotere applicatie zijn er mogelijk meerdere condities waarmee de applicatie gestopt kan worden
  • Als meerdere variabelen gecontroleerd moeten worden tijdens een applicatie kan een 'vlag' gebruikt worden
  • Een vlag is één variabele die door de loop gecontroleerd wordt maar de vlag kan door meerdere processen beïnvloed worden
prompt = "Was het nou zo dat mijn loon als goud, gold "
prompt += "\nType 'stop' om te stoppen\n"
active = True
while active:
    message = input(prompt)
    if message == 'stop':
        active = False
    else:
        print(message)
tja, dan was het anders
03 - Break & Continue
  • Om een while-loop meteen te stoppen gebruik je een break
  • Een while meteen gevolgd door een True wordt voor altijd uitgevoerd
  • Een while True wordt alleen gestopt met een break
  • Je kunt de break in elke loop gebruiken (ook een for-loop)
prompt = "Hi, my name is Optimus Prime. \nWe are Autonomous Robotic Organisms from the planet Cybertron."
prompt += "\nType 'stop' om te stoppen\n"
while True:
    message = input(prompt)
    if message == 'stop':
        break
    else:
        print(message)
        print("I know that this is not the end, but merely a new beginning. \nAnother transformation.")
hi
I know that this is not the end, but merely a new beginning. 
Another transformation.

  • In plaats van het afbreken van een loop kun je ook terugkeren naar het begin van een loop
  • Met een continue kun je, op basis van een conditie, terugkeren naar het begin
current_number = 0
while current_number < 10:
    current_number += 1
    if current_number % 2 == 0:
        continue
    print(current_number)
1
3
5
7
9

04 - Oneindige loops
  • Elke while-loop heeft een manier nodig om te stoppen
  • Als je per ongeluk in een oneindige loop komt gebruik dan CTRL + C of refresh / sluit het scherm
while True:
    print('Hello World')

10 print 'Hello World'
20 goto 10
run
10 print 'Hello World'
20 goto 10
run
10 print 'Hello World'
20 goto 10
run
10 print 'Hello World'
20 goto 10

  • Controleer altijd of je while-loops ook stopt wanneer dat de bedoeling is
05 - While-loops met lists en dictionaries
  • Voor het bijhouden van veel gegevens kun je lists of dictionaries gebruiken in je while-loop
  • Een for-loop is effectief voor het doorlopen van een list, maar je mag de list niet in een for-loop aanpassen
    • Python krijgt dan problemen met het bijhouden van de items in de list
  • Om een list aan te passen terwijl je ermee werkt gebruik je een while-loop
  • Door while-loops te gebruiken bij lists en dictionaries kun je veel invoer verzamelen, opslaan en ordenen

Items van de ene lijst naar de andere verplaatsen
  • De while draait zolang de list hz niet leeg is
hz = [999, 256, 999, 288, 324, 241.33, 384, 432, 486, 512]
played = []

while hz:
    tone = hz.pop()
    print('De toon: ' + str(tone) + 'Hz wordt gespeeld')
    played.append(tone)

print('\nDe volgende tonen heeft u gehoord')
print(played)
De toon: 512Hz wordt gespeeld
De toon: 486Hz wordt gespeeld
De toon: 432Hz wordt gespeeld
De toon: 384Hz wordt gespeeld
De toon: 241.33Hz wordt gespeeld
De toon: 324Hz wordt gespeeld
De toon: 288Hz wordt gespeeld
De toon: 999Hz wordt gespeeld
De toon: 256Hz wordt gespeeld
De toon: 999Hz wordt gespeeld

De volgende tonen heeft u gehoord
[512, 486, 432, 384, 241.33, 324, 288, 999, 256, 999]

Alle items met een bepaalde waarde uit een lijst verwijderen
  • In H3 is de .remove( )-functie gebruikt om een specifieke waarde uit een lijst te verwijderen
  • De .remove( )-functie werkt zoals verwacht als de waarde 1 x in de lijst voorkomt
  • Als je waarden wilt verwijderen die meerdere keren voorkomen gebruik dan ook een while-loop
hz = [999, 256, 999, 288, 324, 241.33, 384, 432, 486, 512]
print(hz)

while 999 in hz:
    hz.remove(999)

print(hz)
[999, 256, 999, 288, 324, 241.33, 384, 432, 486, 512]
[256, 288, 324, 241.33, 384, 432, 486, 512]

Een dictionary vullen met invoer van gebruiker
# Ter herinnering: de (oude) natuurtoonladder
# Do, Re, Mi, Fa, Sol, La, Si, Do 
hz = [256, 288, 324, 241.33, 384, 432, 486, 512]
print('8 frequenties uit de toonladder: ')
print(hz)
print('\n')

# Maken van een lege dictionary
sound = {}

# Zet een vlag aan
active = True

# Input vragen en een dictionary vullen
while active:
    question1 = input('Type een toonklank: ')
    question2 = input('Geef de bijbehorende frequentie: ')
    sound[question1] = question2

    repeat = input('Wil je nog een klank toevoegen? (j/n)')
    if repeat == 'n':
        active = False

# De gevulde dictionary printen
print('\n--- Resultaat ---')
for tone, freq in sound.items():
    print('Bij ' + tone + ' hoort de harmoniserende ' + str(freq) + 'Hz frequentie.')   
8 frequenties uit de toonladder: 
[256, 288, 324, 241.33, 384, 432, 486, 512]
--- Resultaat ---
Bij Do hoort de harmoniserende 256Hz frequentie.
Bij Re hoort de harmoniserende 288Hz frequentie.

Oefening
Quiz

Vraag 1. Wat geeft de functie input() standaard terug in Python?




Klopt. input() geeft altijd een str terug, ongeacht wat je typt.
Niet helemaal. De invoer van input() is altijd tekst (een string), zelfs als je een getal typt.

Vraag 2. Welke van de onderstaande codefragmenten zetten de invoer van input() correct om naar een geheel getal?

# A
age = input("Hoe oud ben je? ")
years = age + 10

# B
age = int(input("Hoe oud ben je? "))
years = age + 10

# C
age = input("Hoe oud ben je? ")
years = int(age) + 10

# D
age = input("Hoe oud ben je? ")
years = float(age + 10)



Goed! In B en C wordt de tekst eerst met int() naar een geheel getal omgezet.
Let op. Je moet de string expliciet omzetten naar int (zoals in B en C). In A en D wordt geprobeerd met een string te rekenen, dat gaat mis.

Vraag 3. Wat print deze code?

current_number = 0
while current_number < 3:
    print(current_number)
    current_number += 1



Juist. De code print 0, 1 en 2. Bij 3 stopt de while omdat current_number < 3 dan niet meer waar is.
Niet goed. Kijk naar de voorwaarde < 3 en naar de += 1 binnen de while-loop.

Vraag 4. In onderstaand voorbeeld gebruiken we een “vlag” om de loop te besturen. Welke variabele is die vlag?

prompt = "Typ 'stop' om te stoppen: "
active = True

while active:
    message = input(prompt)
    if message == 'stop':
        active = False
    else:
        print(message)



Klopt. De variabele active wordt gebruikt als vlag: zolang die True is, loopt de while verder.
Let op. De vlag is de variabele waar de while-voorwaarde direct naar kijkt: while active:.

Vraag 5. Wat doet break in een while True-loop?




Precies. break breekt de loop direct af, ook bij while True.
Niet helemaal. break stopt de loop in één keer, hij slaat niet alleen een iteratie over.

Vraag 6. Wat print deze code?

current_number = 0
while current_number < 6:
    current_number += 1
    if current_number % 2 == 0:
        continue
    print(current_number)



Goed! continue slaat de even getallen over, dus alleen 1, 3 en 5 worden geprint.
Niet juist. Let op: bij even getallen wordt met continue de rest van de loop overgeslagen, dus de print() wordt dan niet uitgevoerd.

Vraag 7. Je hebt per ongeluk deze code in een terminal gestart:

while True:
    print("Hello World")

Wat is de gebruikelijke manier om dit in een terminal te stoppen?




Klopt. In een terminal gebruik je meestal CTRL + C om een script dat “vastloopt” af te breken.
Let op. In een oneindige while True-loop komt geen einde; je moet hem met bijvoorbeeld CTRL + C stoppen.

Vraag 8. In de code uit het hoofdstuk gebruiken we:

hz = [999, 256, 999, 288]
played = []

while hz:
    tone = hz.pop()
    played.append(tone)

Wat betekent de voorwaarde while hz: precies?




Goed! Een niet-lege lijst wordt als “waar” gezien, een lege lijst als “onwaar”. Daarom draait de loop totdat hz leeg is.
Niet helemaal. De voorwaarde checkt of de lijst leeg is of niet – niet hoeveel elementen er exact in staan.

Vraag 9. Welke code hoort bij de uitleg:
“Print of een getal even of oneven is”?




Klopt. Met % 2 (modulo 2) krijg je de restwaarde. Bij even getallen is die 0.
Let op. De modulo-operator % 2 is de klassieke manier om even/oneven te testen.

Vraag 10. In de oefening over favoriete liedjes gebruiken we:

songs = []
active = True

while active:
    title = input("Wat is je favoriete liedje?: ")

    if not title:
        print("Geen titel ingevoerd, probeer opnieuw.")
        continue

    songs.append(title)

    again = input("Wil je nog een liedje invoeren (j/n): ")
    if again.lower() == 'n':
        active = False

print("\\nDe opgeslagen liedjes zijn:")
for song in songs:
    print("-", song)

Wat gebeurt er als de gebruiker direct op Enter drukt bij het invoeren van een titel (dus niks typt)?




Juist. Door if not title: en continue wordt een lege invoer geweigerd en mag de gebruiker het opnieuw proberen.
Niet helemaal. Bij lege invoer wordt niets aan de lijst toegevoegd; de code print een waarschuwing en gaat verder met de volgende iteratie.