Hoe kunnen ze repetitief werk laten verrichten door een computer. Met repetitief werk bedoelen we een taak of takenlijst die herhaald moet worden. We tonen dat, ook Python, over 2 soorten lussen beschikt om takenlijsten - die (meermaals) herhaald moeten worden - uit te voeren. We analyseren de herhaling adhv het spel “Latje trap”, en introduceren vervolgens de for- en de while-lus.
Doel van spel:
Van buiten het strafschop gebied proberen beide spelers de bal tegen de lat te trappen. Elke keer de lat geraakt wordt verdiend de speler een punt. Er bestaan 2 spelvormen:
Het aantal trappen staat vast (voorbeeld 9 ballen elk)
Het spel blijft doorlopen tot 1 van de spelers 5 voltreffers heeft
Bij spelmethode 1 is het duidelijk bij aanvang hoeveel keer de takenlijst herhaald moet worden, bij de tweede spelvorm is dit niet geweten.
Dit voorbeeld maakt duidelijk dat bij elke takenlijst die herhaald wordt, moet nagedacht worden hoe de herhaling eindigt. Deze twee vragen komen naar boven:
Het is duidelijk bij de start hoeveel herhalingen er nodig zijn (het is afgesproken hoeveel keer [9x], of er een beschikbare collectie is [9 verschillende ballen])
Er is een voorwaarde die bepaalt of er herhaalt wordt of niet. Deze voorwaarde wordt telkens gecontroleerd vooraleer de takenlijst opnieuw wordt uitgevoerd.
De wijze waarop de herhaling ten einde komt, bepaalt welke soort lus we onze programmacode gebruiken.
In Python zijn er twee methodes voor herhalingen. for-lus en een while-lus.
Bij de for-lus staat het aantal op voorhand vast;
Bij de while-lus maak je gebruik van een voorwaarde.
Deze laatste kan je voor beide situaties gebruiken, maar indien je een herhaling met een voorwaarde wilt is dit de enige optie.
Voorbeeld
print(1)
print(2)
print(3)
print(4)
print(5)
print(6)
Dit voorbeeld print getallen 1 t/m 6 onder elkaar. Wanneer ik dit wilt uitbreiden tot 500 getallen, heb ik 500 lijnen code nodig, dit is veel te veel code voor deze eenvoudige printopdracht. Door middel van herhaling kunnen we deze code reduceren voor 500 lijnen.
We kunnen dit oplossen door het toepassen van een while-lus. Deze is vrij eenvoudig, deze heeft bijna dezelfde structuur als een if-structuur.
while <<booleaanse expressie>> :
<< taak 1 >>
<< taak 2 >>
<< taak 3 >>
<< taak 4 >>
Zolang de booleaanse expressie als True wordt geëvalueerd, zal de takenlijst herhaald blijven worden. Wanneer de booleaanse expressie false evalueert, dan slaagt Python de code over en gaat hij verder met regels code na de takenlijst.
Voorbeeld van 6 getallen met while-lus:
getal = 1
while getal <= 6:
print(getal)
getal = getal + 1
Dit voorbeeld zullen we zien dat ook met de andere vorm van herhaling kan. Maar we willen opbouwen naar het volgende voorbeeld:
De gebruiker kan een onbekend aantal getallen opgeven om op te tellen. We spreken met de gebruiker af dat de getallen die hij in geeft allemaal positief zijn. Dus wanneer hij een negatief getal in geeft dan stopt de herhaling.
getal = 0
som = 0
while getal >= 0:
som += getal
getal = int(input("Geef een geheel getal op:"))
print(som)
Het is belangrijk om eerste de som van 0 te berekenen. Als we input als eerste taak schrijven dan gaat hij het negatieve getal willen optellen bij de som. Om dit te vermijden moet de input als laatste regel staan.
Tip:
som += getal heeft dezelfde betekenis als som = som + getal
Dit laatste voorbeeld van while verschilt tegenover het eerste in het feit dat bij de laatste niet op voorhand gekend is hoeveel herhaling er nodig zal zijn. Bij de eerste was dit wel gekend en dit kan ook met for. Dit voorbeeld wordt verderop in de tekst gegeven.
Voor we aan FOR-lus kunnen beginnen moeten we eerste meer weten over het gereserveede woord in (lidmaatschapscontrole).
Voorbeeld:
Wordt de notre dame afgebeeld op een euro-munt. Dat moet we gaan nakijken op alle munten.
Al deze munten noemen ze een groep van elementen. Maar we druven ook spreken van een verzameling of collectie. We gebruiken deze woorden gewoon door elkaar, ook al zijn we wiskundig gezien niet hetzelfde.
Voorbeeld:
Het woord Abracadabra is een collectie van letters. Meer specifiek 1 x "A", 2 x "b", 2 x "r", 4 x "a", 1 x "c", 1 x "d"
We spreken hiervan een collecatie en niet van een verzameling daar verschillende letters meerdere keren voorkomen terwijl bij een verzameling alles maar 1x kan bestaan.
Bovendien is het bij Abracadabra de volgorde van de letters belangrijk, anders hebben we niet steeds hetzelfde woord. Wanneer de volgorde belangrijk is spreken we van een geordende collectie. We kunnen dus stellen dat elke string een geordende collectie is.
Kakstoel en koelkast hebben beide dezelfde collectie van letters maar door de ordening van deze letters maakt het grote verschil.
Voorbeeld:
"d" in "Abracadabra"
Daar er slechts twee mogelijk antwoorden zijn spreken we van een bewering dat resulteert in een booleaanse expressie. Dit voorbeeld geeft de waarde True.
Python kan trouwens heel handig 1 voor 1 elemeten geven/evalueren binnen een geordende collectie. Deze extra troef is heel handig voor het gebruik van een for-lus.
Als we alle letters van "yoghurt" apart willen afdrukken. We weten op voorhand hoeveel letters er moeten afgedrukt worden. Daar het aantal herhalingen bij start gekend is kunnen we dit verwerken met een FOR-lus.
for <<variable>> in <<collectie>> :
<<taak 1>>
<<taak 2>>
<<taak 3>>
<<taak 4>>
In vergelijk met if en while is het uitvoeren van de takenlijst niet afhankelijk met een bewering die eerst moet gecontroleerd worden.
De variabele die tussen for en in staat krijgt automatisch een waarde toegekend uit de collectie die vermeld staat naast in. Deze variabele krijgt steeds de waarde van het volgende element in de collectie na het uitvoeren van de taken. Wanneer er geen element uit de collectie meer kan toegekend worden aan de variabele stopt Python met uitvoeren van de takenlijst en gaat hij verder met de instructies na de takenlijst.
Voorbeeld:
for letter in "yoghurt":
print(letter)
Resultaat
y
o
g
h
u
r
t
Als we een takenlijst een vast aantal keer willen herhalen, is for ook de beste toevluchtsoord. We zouden een string kunnen maken met de juiste lengte om zo het aantal gewenste herhalingen te kunnen uitvoeren.
Voorbeeld:
collectie = 700 * "x"
for trap in collectie:
print("speler 1 trap richting doellat")
collectie bevat na de eerste regel 700 keer x. Waardoor bij de for-lus de print-opdracht 700 keer uitgevoerd zal worden. Dit is echter geen elegante oplossing. Op een vast aantal keer te herhalen gebruiken we best de functie range().
Hoe range() werkt tonen we met enkele voorbeelden.
Voorbeeld:
for trap in range(7):
print("speler 1 trap richting doellat")
Als we deze code uitvoeren zien we exact 7 regels geprint staan. Deze 7 vinden we ook als argument/parameter terug in de functie range().
De varabiele trap zal 7 verschillende waarde hebben, deze waarde worden aangeleverd door de functie range(). Om range() beter te begrijpen zullen we het voorbeeld aanpassen zodat we ook de waarde van de variabele tonen.
Voorbeeld range() met 1 parameter:
for waarde in range(7):
print(waarde)
Dit geeft het volgende resultaat:
0
1
2
3
4
5
6
Uit dit voorbeeld leiden we af dat range() een collectie maakt van 7 opéénvolgende integers, bestaande uit integer waarde vertrekkende vanaf 0 tot en met 6. De waarde die tussen de haken staat wordt nooit bereikt. Want anders hebben we een getal te veel in de collectie.
Voorbeeld range() met 2 parameters:
for waarde in range(3, 7):
print(waarde)
Dit geeft het volgende resultaat:
3
4
5
6
De eerste parameter geeft de startwaarde van de collectie aan, de tweede waar nog steeds het einde exclusief dit getal. Let op dat het eerste getal kleiner moet zijn dan het tweede om range() te doen werken met 2 argumenten/parameters. Het aantal herhaling komt overeen met het verschil van de beiden getallen. 7 - 3 = 4 herhalingen.
Voorbeeld range() met 3 parameters:
for waarde in range(5, 18, 3):
print(waarde)
Dit geeft het volgende resultaat:
5
8
11
14
17
De eerste paramter geeft weer de startwaarde aan en de tweede parameter weer de laatste waarde die niet bereikt mag worden. De derde waarde is het verschil tussen twee opéénvolgende waarde, deze noemen we ook wel de stapgrootte. Met deze range()-functie kunnen we afwijken van de standaard stapgrootte van 1.
We kunnen als stapgrootte ook een negatieve waarde geven zodat we een collectie kunnen maken van groot naar klein.
Voorbeeld range() met 3 parameters en negatieve stapgrootte:
for waarde in range(9,4,-2):
print(waarde)
Dit geeft het volgende resultaat:
9
7
5
Inleiding herhaling
Het gereserveerde woord "in"
While-lus (voorwaardelijke herhaling)
For-lus (begrensde herhaling) via string
For-lus (begrensde herhaling) met behulp van range()