2.12. Silmukat

Silmukka suorittaa samaa koodilohkoa toistuvasti. Pythonissa on kaksi muotoa: while, joka jatkaa niin kauan kuin ehto pysyy totena, ja for, joka käy läpi sekvenssin alkiot.

Rinnakkaiset vuokaaviot. while: testaa ehto, suorita runko jos tosi, toista. for: ota seuraava alkio iteroitavasta, suorita runko, toista kunnes loppuu.

while testaa ehtoa jatkuvasti; for käy sekvenssin läpi, kunnes se loppuu.

2.12.1. while-silmukat

while -silmukka testaa ehtonsa ennen jokaista kierrosta ja suorittaa rungon, kunnes testi muuttuu epätodeksi:

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

Tuloste:

0
1
2
3
4

Jos ehto on tosi alussa eikä koskaan muutu epätodeksi, silmukka suoritetaan ikuisesti. while True: on pääsilmukan vakioilmaisu, josta poistutaan eksplisiittisesti break -lauseella:

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

2.12.2. for-silmukat

for -silmukka käy läpi iteroitavan alkiot – listan, monikon, merkkijonon, tavujen, sanakirjan tai minkä tahansa muun, joka tukee iterointia:

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

Tuloste:

apple
banana
cherry

Sama muoto toimii merkkijonolla, jossa jokainen alkio on yhden merkin merkkijono:

for letter in "OpenMV":
    print(letter)

Tuloste:

O
p
e
n
M
V

Sanakirjan iterointi suoraan tuottaa sen avaimet lisäysjärjestyksessä:

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

Tuloste:

a
b

Jokainen kierros sitoo silmukkamuuttujan (fruit, letter, key) seuraavaan alkioon. Silmukan päätyttyä muuttuja säilyttää viimeisen kierroksen arvon.

2.12.3. range

Numeerisen alueen läpikäyviin silmukoihin käytä range() -funktiota:

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

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

  • range(start, stop, step) – mukautetulla askeleella (negatiiviset arvot laskevat alaspäin).

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() tuottaa arvot laiskasti – se ei rakenna listaa muistiin. Saadaksesi varsinaisen list -olion, kääri se: list(range(10)).

2.12.4. enumerate

Kun silmukka tarvitsee sekä indeksin että alkion, enumerate() tuottaa (index, item) -pareja:

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

Aloita indeksi muusta kuin nollasta antamalla toinen argumentti: enumerate(items, start=1).

2.12.5. zip

Käydäksesi läpi kahta (tai useampaa) iteroitavaa rinnakkain, käytä zip() -funktiota. Se tuottaa yhden monikon kutakin sijaintia kohden ja pysähtyy lyhimpään syötteeseen:

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

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

Tuloste:

alice 88
bob 92
carol 70

2.12.6. Sijoitus lausekkeena := -operaattorilla

Mursu-operaattori := on sijoitus, joka on myös lauseke. Se sitoo nimen ja palauttaa saman arvon samanaikaisesti. while -silmukassa tämä tiivistää yleisen ”lue, tarkista, runko” -kaavan yhdelle riville:

# 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)

Molemmat muodot tekevät saman asian. Tartu := -operaattoriin, kun sijoituksen toistaminen aidosti haittaa luettavuutta; älä tartu siihen vain ollaksesi nokkela. Sulut vaaditaan useimmissa kohdissa, jotta lauseke pysyy yksiselitteisenä.