2.13. Silmukan hallinta

Kaksi avainsanaa muuttaa silmukan suoritusta:

  • break – poistuu silmukasta välittömästi.

  • continue – ohittaa nykyisen kierroksen loppuosan ja aloittaa seuraavan.

Molemmat vaikuttavat sisimpään silmukkaan, jonka sisällä ne esiintyvät.

2.13.1. break

Käytä break -avainsanaa pysäyttääksesi silmukan heti, kun ehto täyttyy. Klassinen ”etsi ja pysäytä” -kaava:

found = None
for item in items:
    if matches(item):
        found = item
        break

if found is not None:
    print("found:", found)

while True: -silmukassa break on tapa, jolla silmukka päättyy:

while True:
    line = next_line()
    if line == "quit":
        break
    process(line)

2.13.2. continue

Käytä continue -avainsanaa ohittaaksesi rungon loppuosan ja siirtyäksesi seuraavalle kierrokselle. Kätevä alkioiden suodattamiseen silmukan sisällä:

for n in numbers:
    if n < 0:
        continue            # skip negatives
    print(n)

Saman vaikutuksen voi kirjoittaa if -lohkona rungon loppuosan ympärille. continue on toisinaan selkeämpi, kun ohitusehto on helpompi ilmaista etukäteen kuin säilytysehto.

Silmukan sisällä continue toimii samassa roolissa kuin varhainen return funktiossa: ohita tapaukset, joita et käsittele, ja pidä pääasiallinen työ tasaisena uloimmalla sisennystasolla. Suodata-ja-käsittele-silmukka on tyypillinen muoto:

for item in items:
    if item is None:
        continue
    if not item.is_valid():
        continue
    process(item)

Sisennetty process(item) -rivi on varsinainen työ; jokainen yllä oleva vartija kertoo täsmälleen, mitkä alkiot ohitetaan.

2.13.3. else silmukassa

Sekä for että while hyväksyvät valinnaisen else -lohkon. Se suoritetaan, kun silmukka päättyy kohtaamatta break -lausetta. Yleisin käyttötapa on hakusilmukka, joka haluaa varatoiminnon, jos mitään ei löydetty:

for item in items:
    if matches(item):
        print("found:", item)
        break
else:
    print("no match")

Jos break laukeaa, else -lohko ohitetaan. Lue rakenne muodossa ”for X in Y: …; tai muuten, jos emme koskaan poistuneet, tee Z.”

2.13.4. Yleisiä silmukkakaavoja

Muutamia kaavoja esiintyy usein todellisissa skripteissä:

  • Kysely (polling) – odota, että jokin ehto muuttuu todeksi ennen jatkamista. Runko käyttää pass -lausetta, Pythonin tyhjää operaatiota; jokaisen sisennetyn lohkon on sisällettävä vähintään yksi lause, ja pass on tapa sanoa ”älä tee mitään täällä”:

    while not ready():
        pass
    proceed()
    
  • Tilakone – yksittäinen while True: -silmukka, joka valitsee tehtävän tilamuuttujan perusteella. Hyödyllinen, kun työ jakautuu siististi muutamaan nimettyyn vaiheeseen:

    state = "header"
    for line in lines:
        if state == "header":
            if line.startswith("---"):
                state = "body"
        elif state == "body":
            print(line)
    
  • Kerääminen – rakenna tulos sekvenssiä läpi käydessä:

    total = 0
    for x in samples:
        total += x
    mean = total / len(samples)
    

    Monella keräyssilmukalla on yhden rivin vastine sisäänrakennettua funktiota käyttäen. Tartu sisäänrakennettuun, kun jokin sopii:

    • sum() – laskee yhteen jokaisen alkion iteroitavassa.

    • max() / min() – suurin tai pienin alkio.

    • any()True, jos vähintään yksi alkio on tosi.

    • all()True vain, kun jokainen alkio on tosi.

    • sorted() – uusi lista, jonka alkiot ovat järjestyksessä.

    • len() – alkioiden määrä (kun iteroitava tuntee pituutensa).

    >>> samples = [3, 1, 4, 1, 5, 9, 2, 6]
    >>> sum(samples)
    31
    >>> sum(samples) / len(samples)        # mean
    3.875
    >>> max(samples)
    9
    >>> min(samples)
    1
    >>> sorted(samples)
    [1, 1, 2, 3, 4, 5, 6, 9]
    >>> any([False, False, True])
    True
    >>> all([True, True, False])
    False
    

    Sisäänrakennettu versio on lyhyempi, selkeämpi ja yleensä nopeampi kuin saman silmukan kirjoittaminen käsin.