Hoofdstuk 7
Werk herhalen met lussen
Herhaal zonder te kopiëren
Aan het einde van het vorige hoofdstuk drukte je de organizer af met vier bijna gelijke regels:
print(f"1. {items[0]}")
print(f"2. {items[1]}")
print(f"3. {items[2]}")
print(f"4. {items[3]}")
Dat werkte en het uitschrijven was bewust. Maar je ziet ook al een probleem. Het programma kan maar vier items afdrukken. Voeg een vijfde toe en dat blijft onzichtbaar totdat je nog een print-regel schrijft. Verwijder een item en het programma stopt met een IndexError.
Het aantal items hoort bij de gegevens. Nu staat dat aantal vast in de code.
Hoe herhalend werk eruitziet
Bekijk de vier regels opnieuw en let op wat er werkelijk verandert. Het woord print blijft hetzelfde. De f-string blijft hetzelfde. Alleen het nummer en de index tussen de haken veranderen.
Als je bijna dezelfde regel meerdere keren schrijft, heeft Python een beter hulpmiddel. Dat heet een lus en daarmee schrijf je het herhaalde werk maar één keer.
Een eerste for-lus
Hier is hetzelfde idee als lus:
Vier uitvoerregels uit twee regels code.
Lees de eerste regel als de Engelse zin ‘for each item in items’: voor elk item in items. Dat komt dicht bij wat Python doet. Het neemt de lijst, geeft je de eerste waarde, voert het ingesprongen blok uit, geeft je de volgende waarde en gaat door totdat de lijst klaar is.
De onderdelen van de regel
for item in items:
| Onderdeel | Betekenis |
|---|---|
for | Het sleutelwoord waarmee de lus begint |
item | De lusvariabele, een naam die je zelf kiest |
in | Het sleutelwoord dat de naam van de verzameling scheidt |
items | De lijst die Python doorloopt |
: | De dubbele punt aan het einde, net als bij een if-instructie |
Alles wat onder die regel inspringt, is het lusblok. Python voert dat hele blok één keer per waarde uit.
De inspringregel ken je al van if. Ingesprongen regels horen bij de lus. Regels terug aan de linkerkant worden uitgevoerd nadat de lus klaar is:
Done verschijnt één keer, aan het einde. Die regel springt niet in en hoort dus niet bij het herhaalde werk.
Je kiest zelf de naam van de lusvariabele
item en color zijn geen speciale woorden. Het zijn gewone variabelenamen waaraan Python de waarden één voor één toewijst. Kies een naam die één onderdeel van de verzameling beschrijft:
Een meervoud voor de lijstnaam en een enkelvoud voor de lusvariabele lezen prettig en helpen om beide uit elkaar te houden.
Het aantal maakt voor de lus niet uit
Dit lost het probleem van de organizer op. Dezelfde twee regels werken voor drie waarden of dertig:
Nergens in de lus staat een aantal. Voeg items toe aan de lijst of verwijder ze en de lus volgt vanzelf.
Als de lijst leeg is, zijn er geen waarden om langs te gaan en wordt het blok nul keer uitgevoerd. Regels na de lus worden nog wel uitgevoerd. Probeer tasks in het voorbeeld hierboven te vervangen door [].
Hoe vaak wordt de ingesprongen regel uitgevoerd?
sizes = [8, 12, 16, 20]
for size in sizes:
print(size)
Welke regel of regels horen bij het lusblok?
animals = ["otter", "heron"]
for animal in animals:
print(animal)
print("Seen")
print("Walk finished")
Wat je erbij hebt geleerd
De lus is kort, maar geeft je programma’s veel nieuwe mogelijkheden. Tot nu toe deed een programma een vaste hoeveelheid werk die je met de hand uitschreef. Vanaf nu kan één klein codeblok een verzameling van elke grootte verwerken.
In de volgende les schrijf je zelf lussen en bekijk je hoe de lusvariabele bij elke ronde een andere waarde krijgt.
Opdracht
Voer elk voorbeeld uit en probeer een lijst te veranderen voordat je verdergaat. Zorg dat je kunt uitleggen:
welke onderdelen van de vier printregels van de organizer werkelijk werden herhaald;
wat de lusvariabele bevat tijdens elke ronde door het blok;
hoe Python bepaalt welke regels in de lus staan en welke erna komen;
waarom een item toevoegen aan de lijst geen wijziging van de lus vereist.