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.

Side-by-side flowcharts. while: test the condition, run the body if true, repeat. for: take the next item from the iterable, run the body, repeat until exhausted.

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.