Sisäkkäisiä if-käskyjä
Myös if-käskyn sisällä voi olla toinen if-käsky. Tarkastellaan esimerkkiä, jossa painoindeksin laskun yhteydessä halutaan antaa varoitus, jos käyttäjä on alipainoinen (painoindeksi alle 19) tai ylipainoinen (painoindeksi vähintään 25). Ohjelma voidaan tällöin kirjoittaa seuraavasti:
def main():
rivi = input("Anna painosi kiloina: ")
paino = float(rivi)
rivi = input("Anna pituutesi metreina: ")
pituus = float(rivi)
if pituus > 0.0 and pituus < 3.0:
painoindeksi = paino / (pituus * pituus)
print("Painoindeksisi on", painoindeksi)
if painoindeksi < 19.0:
print("Olet alipainoinen")
if painoindeksi >= 25.0:
print("Olet ylipainoinen")
else:
print("Virheellinen pituus - painoindeksia ei voi laskea")
main()
Esimerkissä sisemmät if-käskyt suoritetaan vain silloin, jos ulomman if-käskyn ehto on tosi.
Esimerkki ohjelman suorituksesta:
Anna painosi kiloina: 48.6
Anna pituutesi metreina: 1.6
Painoindeksisi on 18.984375
Olet alipainoinen
Joskus if-käskyjä joudutaan ketjuttamaan monta peräkkäin. Täydennetään painoindeksin laskevaa ohjelmaa siten, että se tulostaa lopuksi, onko käyttäjä alipainoinen (painoindeksi alle 19), normaalipainoinen (painoindeksi vähintään 19, mutta alle 25), lievästi ylipainoinen (painoindeksi vähintään 25, mutta alle 30), merkittävästi ylipainoinen (painoindeksi vähintään 30, mutta alle 35), vaikeasti ylipainoinen (painoindeksi vähintään 35, mutta alle 40) vai sairaalloisesti ylipainoinen (painoindeksi vähintään 40).
Ohjelmassa on siis useita ehtoja, joista vain yksi kerrallaan voi olla tosi. Tällöin ohjelman voi toki kirjoittaa käyttämällä monta sisäkkäistä if-käskyä, mutta huomattavasti selvemmän ohjelman saa aikaiseksi käyttämällä if - elif - else -rakennetta. Rakenteen yleinen muoto on seuraava:
if ehto1:
käsky1
elif ehto2:
käsky2
elif ehto3:
käsky3
#lisää elif-kohtia ja niihin liittyviä käskyjä
else:
käskyN
Sana elif on lyhenne sanoista else if. Rakenteessa tutkitaan ensin, onko
ehto1
tosi. Jos se on, suoritetaan käsky1
eikä muita ehtoja
tutkita lainkaan. Jos taas ehto1
on epätosi, siirrytään tutkimaan
järjestyksessä seuraavien ehtojen totuusarvoja, kunnes löydetään
ensimmäinen tosi ehto ja suoritetaan sitä vastaava käsky. Jos mikään
käskyistä ei ole tosi, suoritetaan else-kohdassa oleva käsky. Else-kohta
voi myös puuttua, jolloin ei suoriteta mitään käskyä, jos mikään
ehdoista ei ole tosi.
Painoindeksin laskeva ohjelma on nyt seuraavanlainen:
def main():
rivi = input("Anna painosi kiloina: ")
paino = float(rivi)
rivi = input("Anna pituutesi metreina: ")
pituus = float(rivi)
if pituus > 0.0 and pituus < 3.0:
painoindeksi = paino / (pituus * pituus)
print("Painoindeksisi on", painoindeksi)
if painoindeksi < 19.0:
print("Olet alipainoinen")
elif painoindeksi < 25.0:
print("Painosi on normaali")
elif painoindeksi < 30.0:
print("Olet lievasti ylipainoinen")
elif painoindeksi < 35.0:
print("Olet merkittavasti ylipainoinen")
elif painoindeksi < 40.0:
print("Olet vaikeasti ylipainoinen")
else:
print("Olet sairaalloisesti ylipainoinen")
else:
print("Virheellinen pituus - painoindeksia ei voi laskea")
main()
Ehdoissa ei nyt tarvitse lainkaan tutkia, onko painoindeksi suurempi
kuin jokin alaraja, sillä edellisten if- ja elif-kohtien ehdot pitävät
huolen siitä, että jotain ehtoa tutkitaan vain silloin, jos painoindeksi
on edellisten kohtien rajaa suurempi. Esimerkisi ehdon
painoindeksi < 35.0
totuusarvoa tutkitaan vain siinä tapauksessa,
että kaikki edelliset ehdot ovat olleet epätosia, jolloin painoindeksin
on pakko olla vähintään 30.
Esimerkki ohjelman suorituksesta:
Anna painosi kiloina: 49.0
Anna pituutesi metreina: 1.6
Painoindeksisi on 19.140625
Painosi on normaali