Herhaalde operaties
Contents
2.6. Herhaalde operaties#
Tot nu toe hebben we voorbeelden gebruikt waarbij operaties in een script éénmalig uitgevoerd werden. Een belangrijke eigenschap van computers en programmeertalen is dat ze ons in staat stellen operaties vaak en snel achter elkaar kunnen uit te voeren. Er zijn grof gezegd twee manieren om Python regels code herhaaldelijk te laten uitvoeren, aangegeven in de tabel hieronder.
Sleutelwoord |
Beschrijving |
Voorbeeld |
|---|---|---|
|
Voer de code uit voor elk element in een variabele met meerdere elementen. |
|
|
Voer de code uit totdat een bepaalde voorwaarde overtreden wordt. |
|
2.6.1. for#
In een for-lus zal er altijd een bepaalde verzameling (vaak een list) zijn, waarbij we voor elk element in die verzameling iets willen uitvoeren. De syntax om elk element uit een verzameling in de console te printen is als volgt:
verzameling = [1, 2, 3]
print("Start")
for element in verzameling: # < Ook hier een dubbele punt
# Let op het inspringen met 4 spaties!
# Binnen alle regels in dit blokje, hebben we de
# variabele 'element' beschikbaar.
print("We zijn nu bij element:", element)
# Zodra alle elementen in de verzameling aan de beurt geweest zijn,
# gaat Python weer door met de regels die niet ingesprongen zijn.
print("Klaar")
Start
We zijn nu bij element: 1
We zijn nu bij element: 2
We zijn nu bij element: 3
Klaar
In de eerste regel staat
forom aan te geven dat we gaan itereren.elementgeeft aan hoe we in de code eronder het huidige element waarover geitereerd gaat worden kunnen aanspreken.ingeeft aan dat we de verzameling waarover de iteratie moet lopen gaan doorgeven.Op de plek van
verzamelinggeef je de naam van de variabele waar Python in moet zoeken, of definieer je zelf direct de verzameling.De
:wordt gebruikt om aan te geven dat we klaar zijn met het definieren van de verzameling, en dat wat volgt in de onderstaande regels herhaaldelijk uitgevoerd gaat worden. De volgende regels beginnen met 4 spaties (in de meeste editors kun je de<TAB>-toets gebruiken). Zodra Python een regel tegenkomt zonder spaties zal het doorhebben dat de onderstaande regels niet meer bij de iteratie horen.
Zo kunnen we bijvoorbeeld een probleempje dat we eerder gezien hebben oplossen zonder elk individueel element van een lijst in de code te moeten opvragen.
# Aantal uren waarop de werknemer gewerkt heeft
uren_per_dag = [8, 6, 9, 7, 10]
# Uurloon van de werknemer
uurloon = 13.50
# Begin met een salaris van 0
totaal_salaris = 0.0
# Loop over alle dagen uit de lijst 'uren_per_dag'.
# Let op het inspringen, en de dubbele punt.
for uren_huidige_dag in uren_per_dag:
# Tel het salaris van de dag bij het totaal op
totaal_salaris = totaal_salaris + uurloon * uren_huidige_dag
# Print een tussenstand uit
print('Tussenstand: ', totaal_salaris)
# Print het eindresultaat
print('Totaal salaris:', totaal_salaris)
Tussenstand: 108.0
Tussenstand: 189.0
Tussenstand: 310.5
Tussenstand: 405.0
Tussenstand: 540.0
Totaal salaris: 540.0
enumerate#
Als we het resultaat op willen slaan in een andere verzameling kunnen we een onderstaande syntax gebruiken.
Let op het gebruik van enumerate(...). Dit zorgt ervoor dat we binnen de iteratie de beschikking hebben over twee variabelen, index en element, waarbij de index zal verlopen als 0, 1, 2, 3, en element als 1.1, 2.5, 3.8, 1.9.
uren_per_dag = [8, 6, 9, 7, 10]
uurloon = 13.50
salaris_per_dag = [0, 0, 0, 0, 0]
for index, uren_huidige_dag in enumerate(uren_per_dag):
salaris_per_dag[index] = uren_huidige_dag * uurloon
print('index: ', index)
print('uren_huidige_dag: ', uren_huidige_dag)
print('uren_per_dag: ', uren_per_dag)
print('salaris_per_dag: ', salaris_per_dag)
print()
print('Resultaat: ', salaris_per_dag)
print('Klaar')
index: 0
uren_huidige_dag: 8
uren_per_dag: [8, 6, 9, 7, 10]
salaris_per_dag: [108.0, 0, 0, 0, 0]
index: 1
uren_huidige_dag: 6
uren_per_dag: [8, 6, 9, 7, 10]
salaris_per_dag: [108.0, 81.0, 0, 0, 0]
index: 2
uren_huidige_dag: 9
uren_per_dag: [8, 6, 9, 7, 10]
salaris_per_dag: [108.0, 81.0, 121.5, 0, 0]
index: 3
uren_huidige_dag: 7
uren_per_dag: [8, 6, 9, 7, 10]
salaris_per_dag: [108.0, 81.0, 121.5, 94.5, 0]
index: 4
uren_huidige_dag: 10
uren_per_dag: [8, 6, 9, 7, 10]
salaris_per_dag: [108.0, 81.0, 121.5, 94.5, 135.0]
Resultaat: [108.0, 81.0, 121.5, 94.5, 135.0]
Klaar
range()#
Een for-lus zal vaak gebruikt worden in combinatie met de range()-functie. Dit is een ingebouwde verzameling, die op drie manieren gebruikt kan worden.
range(eind)is de verzameling getallen van0toteind(dus niet tot-en-meteind).range(begin, eind)is de verzameling getallen vanbegintoteind(dus niet tot-en-meteind).range(begin, eind, stapgrootte)is de verzameling getallen vanbegintoteind(dus niet tot-en-meteind), met tussenstappenstapgrootte.
Let op dat je de inputs begin, eind, stapgrootte altijd als gehele getallen moet opgeven.
Bekijk de output van de volgende stukjes code.
for getal in range(20):
print(getal)
print('Klaar')
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Klaar
for getal in range(3, 10):
print(getal)
print('Klaar')
3
4
5
6
7
8
9
Klaar
for getal in range(3, 10, 2):
print(getal)
print('Klaar')
3
5
7
9
Klaar
for getal in range(10, 3):
print(getal)
print('Klaar')
Klaar
zip()#
Een speciale (en soms erg handige!) functionaliteit is dat we lijsten, of andere verzamelingen, in Python aan elkaar kunnen ritsen. Dit is nuttig wanneer we twee lijsten hebben waarvan de waarden bij elkaar horen, bijvoorbeeld als we één lijst hebben met namen en één lijst met leeftijden.
namen = ["Albert", "Bertha", "Ciarah", "Dennis"]
leeftijden = [12, 20, 15, 30]
for naam, leeftijd in zip(namen, leeftijden):
print(naam, "is", leeftijd, "jaar oud.")
Albert is 12 jaar oud.
Bertha is 20 jaar oud.
Ciarah is 15 jaar oud.
Dennis is 30 jaar oud.
2.6.2. while#
We hebben eerder al het sleutelwoord for gezien. Daarmee konden we zorgen dat één stukje code meerdere keren achter elkaar uitgevoerd werd. Het aantal keer dat de commando’s binnen de lus worden uitgevoerd ligt dan vast.
Met het while-sleutelwoord kunnen we code herhaaldelijk uitvoeren, tótdat aan een bepaalde voorwaarde (niet meer) voldaan wordt.
resultaat = 0
print('Na een aantal keer zal de iteratie aflopen.\n')
while resultaat < 6: # Ook hier weer een dubbele punt
# Let weer op het inspringen met 4 spaties!
print('Huidige resultaat (vóór optellen):', resultaat)
resultaat = resultaat + 1
print('Huidige resultaat (na optellen): ', resultaat)
print('')
print("Klaar")
print("Resultaat aan het eind:", resultaat)
Na een aantal keer zal de iteratie aflopen.
Huidige resultaat (vóór optellen): 0
Huidige resultaat (na optellen): 1
Huidige resultaat (vóór optellen): 1
Huidige resultaat (na optellen): 2
Huidige resultaat (vóór optellen): 2
Huidige resultaat (na optellen): 3
Huidige resultaat (vóór optellen): 3
Huidige resultaat (na optellen): 4
Huidige resultaat (vóór optellen): 4
Huidige resultaat (na optellen): 5
Huidige resultaat (vóór optellen): 5
Huidige resultaat (na optellen): 6
Klaar
Resultaat aan het eind: 6
In sommige gevallen zal de while-loop in zijn geheel overgeslagen worden.
resultaat = 10
while resultaat < 6:
resultaat = resultaat + 1
print('Huidige resultaat:')
print(resultaat)
print("Klaar")
Klaar
Je kunt achter while ook direct een bool-variabele zetten - net als bij een if of elif sleutelwoord kijkt Python alleen of wat er achter het sleutelwoord staat uiteindelijk gelijk is aan True of False.
resultaat = 0
doorgaan = True
while doorgaan:
resultaat = resultaat + 1
doorgaan = (resultaat < 6)
print('Huidige resultaat:', resultaat)
print('Doorgaan? ', doorgaan, '\n')
print("Klaar")
Huidige resultaat: 1
Doorgaan? True
Huidige resultaat: 2
Doorgaan? True
Huidige resultaat: 3
Doorgaan? True
Huidige resultaat: 4
Doorgaan? True
Huidige resultaat: 5
Doorgaan? True
Huidige resultaat: 6
Doorgaan? False
Klaar
Let wel op dat als je een while-lus schrijft, je binnen de lus operaties moet doen die ervoor kunnen zorgen dat de voorwaarde na verloop van tijd ongeldig wordt. Als je dat niet doet, zal de lus eindeloos blijven doorlopen!
import time
resultaat = 5
print('Deze iteratie blijft maar doorgaan(!)')
while resultaat > 0:
resultaat = resultaat - 0
print('Huidige resultaat:', resultaat)
# Dit commando is toegevoegd om het automatisch genereren
# van de output op deze pagina niet uit de hand te laten lopen.
time.sleep(0.01)
print("Klaar")
Deze iteratie blijft maar doorgaan(!)
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
Huidige resultaat: 5
---------------------------------------------------------------------------
KeyboardInterrupt Traceback (most recent call last)
<ipython-input-13-472d035afb6d> in <cell line: 7>()
12 # Dit commando is toegevoegd om het automatisch genereren
13 # van de output op deze pagina niet uit de hand te laten lopen.
---> 14 time.sleep(0.01)
15
16 print("Klaar")
KeyboardInterrupt:
Note
Als je toch per ongeluk zo’n stukje code uitvoert, kun je met de toetsencombinatie Ctrl-C als het goed is de uitvoering van het programma afbreken. Soms moet je Ctrl-C een tijdje ingedrukt houden, omdat Python natuurlijk erg druk is met het uitvoeren van de commando’s.
In sommige gevallen wil je juist een programma schrijven dat oneindig lang blijft doorlopen, totdat de gebruiker handmatig het uitvoeren afbreekt. In zo’n geval kom je wel eens while True in een stukje Python-code tegen.