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