Tietokoneiden näyttöjä, joissa näkyy kuvaa automaatiolaboratorion laitteistosta. Monitoreiden takana näkyy sama laitteisto kuin kuvissa.

timohei.net / Opintojaksot / Soveltava ohjelmointi / Python-ohjelmointi /
Toistorakenteet

Tehtävät

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

while-silmukan käskyjä suoritetaan niin kauan kuin ehtolauseke on tosi.

i = 1 while i < 6: print(i) i += 1
Tulostaa: 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:

break

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 += 1
Tulostaa: 1 2 3

Käytännössä silmukan keskeyttä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 -hetki
Tulostaa: Lämpötila nousi yli 20.0 asteen klo 11.32.11, jolloin lämpötila oli 20.1

continue

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.

else

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

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

break

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": break
Tulostaa: 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

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

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!

Sisäkkäiset for-rakenteet

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()-funktio

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

pass-avainsanalla määritetään for-silmukka mitääntekemättömäksi:

for x in [0, 1, 2]: pass
Ei tulosta mitään!

Avainsanat

Päivitetty 8.12.2022

<<  Edellinen
(9) Ehtolauseet, loogiset operaatiot
Sivu 10/17Seuraava >>
(11) Tiedostojen käsittely
© Timo Heikkinen | timo piste heikkinen at oamk piste fi