Toistorakenteet
461 531 626
while-silmukan käskyjä suoritetaan niin kauan kuin ehtolauseke on tosi.
i = 1 while i < 6: print(i) i += 1Tulostaa: 1 2 3 4 5
Esimerkissä käytetään while-silmukan laskurina muuttujaa i, jota pitää muistaa kasvattaa silmukan sisällä. Muuten laskuri ei koskaan saavuta arvoa 6 ja ohjelma jää kiertämään silmukkaan.
while-silmukassa voidaan käyttää lisäksi avainsanoja break, continue ja else:
Joskus halutaan lopettaa while-silmukan kiertäminen, vaikka laskuri ei olisikaan päässyt loppuarvoonsa. Tämä onnistuu break-avainsanan avulla. Tässä yksinkertaisessa esimerkissä break toteutetaan, kun laskuri i saa arvon 3.
i = 1 while i < 6: print(i) if i == 3: break i += 1Tulostaa: 1 2 3
Käytännössä silmukan keskeytäminen aina, kun laskuri saa tietyn arvon, ei olisi järkevää, koska sama lopputulos saataisiin helpommin asettamalla laskurin i ylärajaksi 4. Yleensä break-ehtona on muu ehto kuin joku laskurin tietty arvo; esimerkiksi niin, että laskurimuuttujaa i käytettäisiin taulukkomuuttujan indeksinä ja kun taulukkomuuttujan haluttu arvo löytyy jollakin indeksin arvolla, keskeytetään silmukka breakillä ja halutun taulukkomuuttujan indeksi jää talteen muuttujaan i:
# lampotila-taulukkoon on luettu lämpötilamittauksia. # Mittausajankohdat on talletettu taulukkoon mittausaika niin, # että lampotila[n] on mitattu hetkellä mittausaika[n]. # Ohjelma etsii ensimmäisen lämpötilamittauksen, joka ylittää 20 astetta # ja tulostaa näytölle ko. mittausarvon ja -hetken. lampotila = [10.2, 10.5, 12.6, 11.3, 12.8, 15.6, 18.9, 20.1, 19.9, 78.3, 21.2, 20.8] mittausaika = ["8.00.13", "8.30.10", "9.00.05", "9.30.11", "10.01.02", "10.32.44", "11.00.05", "11.32.11", "12.00.15", "12.29.55", "13.00.25", "13.30.11"] lamporaja, i = 20.0, 0 while i < len(lampotila): # Käydään lapi kaikki mittaukset, if lampotila[i] >= lamporaja: # mutta jos löytyy yli rajan oleva lämpötila, break # hypätään silmukasta ja... i += 1 print("Lämpötila nousi yli "+str(lamporaja)+" asteen klo "+mittausaika[i]+", jolloin lämpötila" " oli "+str(lampotila[i])) # ...tulostetaan mittausarvo ja -hetkiTulostaa: Lämpötila nousi yli 20.0 asteen klo 11.32.11, jolloin lämpötila oli 20.1
Joskus on tarpeen jättää silmukan komennot suorittamatta. Tässä esimerkissä lasketaan edellisen esimerkin lämpötilamittauksista keskiarvo, mutta halutaan hylätä laskennasta selvästi virheelliset mittaukset. Virheellisyys ilmaistaan vertaamalla mittausta hyväksyttyyn korkeimpaan lämpötilaan:
# lampotila-taulukkoon on luettu lämpötilamittauksia. # Mittausajankohdat on talletettu taulukkoon mittausaika niin, # että lampotila[n] on mitattu hetkellä mittausaika[n]. # Ohjelma tulostaa lämpötilamittausten keskiarvon. # Keskiarvolaskennasta hylätään selvästi virheelliset arvot, # joiksi tulkitaan yli virheraja-muuttujan menevät mittaukset. lampotila = [10.2, 10.5, 12.6, 11.3, 12.8, 15.6, 18.9, 20.1, 19.9, 78.3, 21.2, 20.8] mittausaika = ["8.00.13", "8.30.10", "9.00.05", "9.30.11", "10.01.02", "10.32.44", "11.00.05", "11.32.11", "12.00.15", "12.29.55", "13.00.25", "13.30.11"] virheraja = 40.0 summa, hyvia_mittauksia, i = 0.0, 0, -1 # Laskuri i alustetaan arvoon -1 - miksi? while i < len(lampotila)-1: # Käydään lapi kaikki mittaukset i += 1 # Indeksiä pitää kasvattaa ennen continue-avainsanaa - miksi? if lampotila[i] > virheraja: # Jos löytyy yli virherajan oleva lämpötila, continue # jätetään se huomiotta summa += lampotila[i] # Lisätään summa-muuttujaan uusi mittaus hyvia_mittauksia += 1 # Pidetään kirjaa kelvollisten mittausten lukumäärästä keskiarvo = summa/hyvia_mittauksia # Lopuksi lasketaan keskiarvo # ja esitetään tulokset: print("Lämpötilamittausten keskiarvo oli "+str(keskiarvo)+ ".\nMittauksia oli kaikkiaan "+str(len(lampotila))+", joista kelvollisia "+ str(hyvia_mittauksia)+" ja hylättyjä "+str(len(lampotila)-hyvia_mittauksia)+".")Tulostaa: Lämpötilamittausten keskiarvo oli 15.809090909090907. Mittauksia oli kaikkiaan 12, joista kelvollisia 11 ja hylättyjä 1.
i = 1 while i < 6: print(i) i += 1 else: print("i ei ole enää pienempi kuin kuusi")Tulostaa: 1 2 3 4 5 i ei ole enää pienempi kuin kuusi
for-silmukan avulla voidaan käydä läpi listan, merkkijonon tai muun monijäsenisen olion jäsenet. Pythonin for-rakenne eroaa muiden kielien saman nimisestä rakenteesta, jotka muistuttavat usein while-silmukan kaltaista toimintaa.
Käsitellään listan jäsenet yksitellen:
hedelmat = ["omena", "banaani", "kirsikka"] for hedelma in hedelmat: print(hedelma)Tulostaa: omena banaani kirsikka
Käsitellään merkkijonon jäsenet (eli merkit) yksitellen:
for merkki in "banaani": print(merkki)Tulostaa: b a n a a n i
Aivan kuten while-silmukan yhteydessä, for-silmukan break lopettaa silmukan suorittamisen ennen kuin kaikki olion jäsenet on käyty läpi:
hedelmat = ["omena", "banaani", "kirsikka"] for hedelma in hedelmat: print(hedelma) if hedelma == "banaani": breakTulostaa: omena banaani
Siirtämällä break ennen tulostamista, tulostus muuttuu - miksi?
hedelmat = ["omena", "banaani", "kirsikka"] for hedelma in hedelmat: if hedelma == "banaani": break print(hedelma)Tulostaa: omena
continue toimii samoin kuin while-silmukassa eli jatkaa seuraavaan kierrokseen toteuttamatta silmukassa olevia käskyjä:
hedelmat = ["omena", "banaani", "kirsikka"] for hedelma in hedelmat: if hedelma == "banaani": continue print(hedelma)Tulostaa: omena kirsikka
else-avainsanalla määritellään käskyt, jotka toteutetaan for-silmukan loputtua:
for hedelma in "banaani": print(hedelma) else: print("Silmukka loppui!")Tulostaa: b a n a a n i Silmukka loppui!
Sisempi silmukka suoritetaan kokonaan läpi joka kerran kutakin ulomman kierrosta kohden:
adjektiivit = ["punainen", "iso", "maistuvainen"] hedelmat = ["omena", "banaani", "kirsikka"] for adjektiivi in adjektiivit: for hedelma in hedelmat: print(adjektiivi, hedelma)Tulostaa: punainen omena punainen banaani punainen kirsikka iso omena iso banaani iso kirsikka maistuvainen omena maistuvainen banaani maistuvainen kirsikka
range(n)-funktio palauttaa numerojonon, jossa on n jäsentä [0 .. n-1]:
for x in range(6): print(x)Tulostaa: 0 1 2 3 4 5
Alku- ja loppuarvo voidaan myös määritellä vapaasti:
for x in range(2, 6): print(x)Tulostaa: 2 3 4 5
Myös numerojonon jäsenten väli voidaan määritellä:
for x in range(2, 30, 3): print(x)Tulostaa: 2 5 8 11 14 17 20 23 26 29
pass-avainsanalla määritetään for-silmukka mitääntekemättömäksi:
for x in [0, 1, 2]: passEi tulosta mitään!