Toistorakenteet
461 531 626
Sivulla on 16 korostettua ohjelmaesimerkkiä. Lue kunkin esimerkin edellä oleva teksti ja päättele, mitä ko. kohdan ohjelma tulostaa! Sivun lopusta löydät ensimmäisen ohjelmaesimerkin (while) avainsanan, jota klikkaamalla näet ratkaisun. Samalla klikkauksella sivun loppuun ilmestyy aina seuraavan ohjelmaesimerkin avainsana.
while-silmukan käskyjä suoritetaan niin kauan kuin ehtolauseke on
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
i = 1 while i < 6: print(i) if i == 3: break i += 1Tulostaa: 1 2 3
Käytännössä silmukan
# 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.
# 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 = 1while 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
hedelmat = ["omena", "banaani", "kirsikka"] for hedelma in hedelmat: print(hedelma) if hedelma == "banaani": breakTulostaa: omena banaani
Siirtämällä break ennen tulostamista, tulostus
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
hedelmat = ["omena", "banaani", "kirsikka"] for hedelma in hedelmat: if hedelma == "banaani": continue print(hedelma)Tulostaa: omena kirsikka
else-avainsanalla määritellään käskyt,
for hedelma in "banaani": print(hedelma) else: print("Silmukka loppui!")Tulostaa: b a n a a n i Silmukka loppui!
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
for x in range(6): print(x)Tulostaa: 0 1 2 3 4 5
Alku- ja loppuarvo voidaan
for x in range(2, 6): print(x)Tulostaa: 2 3 4 5
Myös
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
for x in [0, 1, 2]: passEi tulosta mitään!