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, japasson 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.any()–True, jos vähintään yksi alkio on tosi.all()–Truevain, 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.