Valintakäsky if

Tähän asti esitetyt ohjelmat ovat aina suorittaneet samat käskyt samassa järjestyksessä. Usein kuitenkin haluamme, että ohjelma toimii eri tilanteissa eri tavoilla, esimerkiksi niin, että ohjelman toiminta riippuu käyttäjän antamista syötteistä.

Oletetaan, että erääseen tilaisuuteen myydään lippuja, jotka maksavat aikuisilta 10 euroa ja lapsilta 3 euroa. Alle 18-vuotiaat pääsevät lasten lipulla. Haluamme kirjoittaa ohjelman, joka kysyy käyttäjältä tämän iän ja tulostaa sitten lipun hinnan. Hintaa varten voimme määritellä muuttujan hinta, mutta sille asetettava arvo riippuu käyttäjän antamasta iästä. Jos ikä on pienempi kuin 18, pitää suorittaa käsky hinta = 3 ja muussa tapauksessa käsky hinta = 10.

Tällaista tilannetta varten Python-kielessä on if-else-rakenne. Rakenteen yleinen muoto on

if ehto:
  käsky1
else:
  käsky2

Tämä suoritetaan seuraavasti: Ensin tutkitaan, onko ehto tosi vai ei. Jos ehto on tosi, suoritetaan käsky1. Jos ehto on epätosi, suoritetaan käsky käsky2. Toinen käskyistä käsky1 ja käsky2 jää siis aina suorittamatta. Tässä ehto on jokin lauseke, jonka totuusarvo voidaan tutkia, esimerkiksi ika < 18.

Lipun hinnan tulostava ohjelma voidaan siis kirjoittaa if-käskyn avulla seuraavasti:

def main():
    rivi = input("Kerro ikasi: ")
    ika = int(rivi)
    if ika < 18:
        hinta = 3
    else:
        hinta = 10
    print("Lipun hinta on", hinta, "euroa")

main()

Esimerkki ohjelman suorituksesta:

Kerro ikasi: 17
Lipun hinta on 3 euroa

Toinen esimerkki:

Kerro ikasi: 22
Lipun hinta on 10 euroa

Tutkitaan ohjelman toimintaa vielä animaation avulla:

If-käskyn ei ole pakko sisältää else-osaa. Jos else-osa puuttuu, if-rakenteeseen kuuluva käsky suoritetaan vain, jos ehto on tosi. Jos ehto on epätosi, siirrytään suoraan ohjelman seuraavaan käskyyn.

Käytetty ehto voi olla mikä tahansa lauseke, jonka arvo on True (tosi) tai False (epätosi). Tällaisia lausekkeita voi muodostaa esimerkiksi vertailuoperaattoreiden avulla. Python-kieli tarjoaa seuraavat vertailuoperaattorit:

> suurempi kuin
< pienempi kuin
== yhtäsuuri kuin
!= erisuuri kuin
>= suurempi tai yhtäsuuri kuin
<= pienempi tai yhtäsuuri kuin

Huomaa, että yhtäsuuri kuin -operaattori kirjoitetaan kahden yhtäsuuruusmerkin avulla. Yksi yhtäsuuruusmerkki tarkoittaa sijoitusta, jolla ei ole mitään tekemistä vertailun kanssa.

Lauseketta

ika == 15

suoritettaessa siis tutkitaan, onko muuttujan ika arvo yhtäsuuri kuin 15. Jos on, niin lausekkeen arvo on True, jos taas ei ole, niin lausekkeen arvo on False.

Sen sijaan käskyä

ika = 15

suoritettaessa sijoitetaan muuttujan ika arvoksi 15.

Lisäksi kannattaa huomata, että kahden desimaaliluvun yhtäsuuruutta ei yleensä kannata tutkia, koska pyöristysvirheet voivat aiheuttaa yllätyksiä.

Edellä olevassa esimerkissä oli täsmälleen yksi käsky, joka piti suorittaa, jos if-käskyn ehto oli tosi. Usein kuitenkin halutaan, että tässä tilanteessa suoritetaan useampi käsky.

Esimerkki: henkilön painoindeksi lasketaan siten, että paino (kiloissa) jaetaan pituuden (metreissä) neliöllä. Painoindeksin avulla voidaan päätellä, onko henkilö yli- vai normaalipainoinen. Haluamme kirjoittaa ohjelman, joka pyytää käyttäjältä pituuden sekä painon ja tulostaa sitten henkilön painoindeksin.

Periaatteessa ohjelma on hyvin yksinkertainen: pyydetään ja luetaan käyttäjän paino ja pituus, lasketaan painoindeksi ja tulostetaan se. Jos kuitenkin käyttäjä antaa vahingossa pituudekseen 0, jakolaskussa syntyy virhetilanne — nollalla jako — ja ohjelma kaatuu antaen käyttäjälle kummallisen virheilmoituksen. Haluamme kuitenkin ohjelman kertovan käyttäjälle tässä tilanteessa selvästi, miksi painoindeksiä ei voi laskea. Ohjelman rakenne on seuraava:

pyydä ja lue käyttäjän paino ja pituus;
if pituus != 0:
  laske painoindeksi
  tulosta painoindeksi
else:
  ilmoita, että painoindeksiä ei voi laskea

Haluamme siis suorittaa kaksi eri käskyä, jos if-käskyn ehto on tosi. Tämä saadaan aikaiseksi käyttämällä sisennyksiä juuri siten kuin yllä olevasta esimerkistä näkyy. Kaikki ne käskyt, jotka on sisennetty sisemmälle tasolle kuin if-käskyn ehdon sisältävä rivi, katsotaan kuuluvaksi samaan if-käskyyn aina niitä seuraavaan sisentämättömään riviin saakka. Koska pituus ei voi olla myöskään negatiivinen, on ohjelmassa muutettu ehto pituus != 0 muotoon pituus > 0. Näin se tulostaa virheilmoituksen aina silloin, kun pituus ei ole nollaa suurempi.

def main():
    rivi = input("Anna painosi kiloina: ")
    paino = float(rivi)
    rivi = input("Anna pituutesi metreina: ")
    pituus = float(rivi)
    if pituus > 0.0:
        painoindeksi = paino / (pituus * pituus)
        print("Painoindeksisi on", painoindeksi)
    else:
        print("Virheellinen pituus - painoindeksia ei voi laskea")

main()

Esimerkki ohjelman suorituksesta:

Anna painosi kiloina: 74.0
Anna pituutesi metreina: 1.81
Painoindeksisi on 22.5878330942

Toinen esimerkki:

Anna painosi kiloina: 57.5
Anna pituutesi metreina: 0.0
Virheellinen pituus - painoindeksia ei voi laskea