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