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.
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.