2.12. Lussen

Een lus voert hetzelfde blok code herhaaldelijk uit. Python heeft twee vormen: while, die doorgaat zolang een voorwaarde waar blijft, en for, die de items van een reeks doorloopt.

Stroomschema's naast elkaar. while: test de voorwaarde, voer de body uit als waar, herhaal. for: neem het volgende item uit de iterable, voer de body uit, herhaal tot uitgeput.

while blijft een voorwaarde testen; for doorloopt een reeks tot deze uitgeput is.

2.12.1. while-lussen

Een while-lus test zijn voorwaarde vóór elke iteratie en voert de body uit tot de test onwaar wordt:

count = 0
while count < 5:
    print(count)
    count += 1

Uitvoer:

0
1
2
3
4

Als de voorwaarde aan het begin waar is en nooit onwaar wordt, draait de lus voor altijd. while True: is het standaardidioom voor een hoofdlus, expliciet verlaten met break:

while True:
    step()
    if done():
        break

2.12.2. for-lussen

Een for-lus doorloopt de items van een iterable – een lijst, tuple, string, bytes, dict of iets anders dat iteratie ondersteunt:

for fruit in ["apple", "banana", "cherry"]:
    print(fruit)

Uitvoer:

apple
banana
cherry

Dezelfde vorm werkt op een string, waar elk item een string van één teken is:

for letter in "OpenMV":
    print(letter)

Uitvoer:

O
p
e
n
M
V

Een dict rechtstreeks itereren levert zijn sleutels op, in invoegvolgorde:

for key in {"a": 1, "b": 2}:
    print(key)

Uitvoer:

a
b

Elke doorgang bindt de lusvariabele (fruit, letter, key) aan het volgende item. Nadat de lus eindigt, behoudt de variabele de waarde van de laatste iteratie.

2.12.3. range

Voor lussen over een numeriek bereik gebruik je range():

  • range(stop) – 0, 1, …, stop - 1.

  • range(start, stop) – start, start + 1, …, stop - 1.

  • range(start, stop, step) – met een aangepaste stap (negatieve waarden tellen omlaag).

for i in range(5):           # 0, 1, 2, 3, 4
    print(i)

for i in range(2, 8, 2):     # 2, 4, 6
    print(i)

for i in range(10, 0, -1):   # 10, 9, ..., 1
    print(i)

range() produceert waarden lui – het bouwt geen lijst in het geheugen op. Om een echte list te krijgen, wikkel je het in: list(range(10)).

2.12.4. enumerate

Wanneer de lus zowel de index als het item nodig heeft, levert enumerate() paren (index, item) op:

for i, name in enumerate(["a", "b", "c"]):
    print(i, name)
# 0 a
# 1 b
# 2 c

Begin de index bij iets anders dan nul door een tweede argument mee te geven: enumerate(items, start=1).

2.12.5. zip

Om twee (of meer) iterables in gelijke pas te doorlopen, gebruik je zip(). Het levert één tuple per positie op en stopt bij de kortste invoer:

names  = ["alice", "bob", "carol"]
scores = [88, 92, 70]

for name, score in zip(names, scores):
    print(name, score)

Uitvoer:

alice 88
bob 92
carol 70

2.12.6. Inline-toewijzing met :=

De walrus-operator := is een toewijzing die ook een expressie is. Het bindt een naam en evalueert tegelijkertijd tot dezelfde waarde. In een while-lus vouwt dit het veelvoorkomende patroon “lezen, controleren, body” samen tot één regel:

# without walrus
value = next_value()
while value is not None:
    process(value)
    value = next_value()

# with walrus
while (value := next_value()) is not None:
    process(value)

De twee vormen doen hetzelfde. Gebruik := wanneer de duplicatie van de toewijzing de leesbaarheid werkelijk schaadt; gebruik het niet alleen om slim te zijn. De haakjes zijn in de meeste posities vereist om de expressie ondubbelzinnig te houden.