Kirjoittaja: Antti Laaksonen (2015).
Tähänastisissa esimerkeissä ohjelman komentojen suoritusjärjestys on ollut aina sama: ohjelma on aloittanut ensimmäisen rivin komennosta ja suorittanut järjestyksessä kaikki komennot viimeiselle riville saakka. Tällöin käyttäjän antamat tiedot ovat vaikuttaneet vain siihen, mitä merkkijonoja on yhdistetty ja millä luvuilla on suoritettu laskutoimituksia.
Ehtorakenteiden avulla ohjelman toiminta voi vaihdella sen mukaan, mitä tietoja sille kulloinkin annetaan. Esimerkiksi jos ohjelma tarkistaa käyttäjän salasanan, sen pitää tietysti toimia eri tavalla tilanteissa, joissa salasana on oikein ja salasana on väärin.
Ehtorakenteisiin liittyvät läheisesti totuusarvot, jotka ilmaisevat, onko tietty ehto sillä hetkellä voimassa. Esimerkiksi salasanan tarkistuksessa totuusarvo voisi kuvata ehtoa "käyttäjän antama salasana on oikea salasana". Tämän ehdon vallitessa eli totuusarvon ollessa tosi käyttäjän voisi antaa nähdä salaista tietoa ja muussa tapauksessa pelkän virheviestin.
Totuusarvo on joko tosi (True
) tai epätosi (False
): jokin asia pitää paikkansa tai ei pidä paikkaansa. Esimerkiksi "pistemäärä on yli 1000" ja "pelaajan nimi ei ole Einari" vastaavat totuusarvoja, jotka voivat olla ohjelman yhdellä suorituskerralla tosia ja toisella suorituskerralla epätosia. Jos pelaajalla on 1500 pistettä ja hänen nimensä on Einari, ensimmäinen totuusarvo on tosi mutta toinen totuusarvo on epätosi.
Totuusarvoja tuottavat vertailut, joissa tarkistetaan, ovatko kaksi lukuarvoa tai merkkijonoa samat tai mikä on niiden suuruusjärjestys tai aakkosjärjestys:
vertailu | milloin tosi? |
---|---|
X == Y | X on sama kuin Y |
X != Y | X ei ole sama kuin Y |
X < Y | X on pienempi kuin Y |
X <= Y | X on pienempi tai sama kuin Y |
X > Y | X on suurempi kuin Y |
X >= Y | X on suurempi tai sama kuin Y |
Jos vertailussa ovat lukuarvot, "pienempi" ja "suurempi" tarkoittavat lukujen suuruusjärjestystä. Jos vertailussa ovat merkkijonot, "pienempi" ja "suurempi" tarkoittavat merkkijonojen aakkosjärjestystä, joka riippuu siitä, missä järjestyksessä merkit ovat käytetyssä merkistössä.
Seuraava ohjelma tulostaa joukon totuusarvoja:
nimi = "Henrikki" vuosi = 1672 print(vuosi == 1726) # False print(nimi != "Antti") # True print(vuosi < 1600) # False print(vuosi >= 1672) # True print(nimi > "Antti") # True
Vertailut nimi != "Antti"
, vuosi >= 1672
ja nimi > "Antti"
ovat tosia, koska nimi ei ole Antti, vuosi on ainakin 1672 ja nimi on aakkosissa Antin jälkeen. Vertailut vuosi == 1726
ja vuosi < 1600
ovat epätosia, koska vuosi ei ole 1726 ja vuosi ei ole myöskään alle 1600.
Useamman vertailun voi tehdä myös peräkkäin, jolloin tulos on tosi, jos kaikki yksittäiset vertailut toteutuvat.
a = 0 b = 2 print(0 < 1 < 2) # True print(a < b < 1) # False print(a < b == 2) # True
Vertailu 0 < 1 < 2
on tosi, koska 0 < 1
on tosi ja 1 < 2
on tosi. Vertailu a < b < 1
on epätosi, koska b < 1
on epätosi. Vertailu a < b == 2
on tosi, koska a < b
on tosi ja b == 2
on tosi.
Ehtorakenne muuttaa ohjelman suoritusta sen mukaan, onko jokin totuusarvo tosi vai epätosi eli pitääkö jokin ehto paikkansa vai ei. Seuraava ohjelma tervehtii käyttäjää vain, jos hänen nimensä on Henrikki:
nimi = input("Nimi: ") if nimi == "Henrikki": print("Hoi, sankari!") print("Minne matka?") print("Ei muuta...")
Tässä ovat ohjelman erilaiset tulostukset:
Nimi: Antti Ei muuta...
Nimi: Henrikki Hoi, sankari! Minne matka? Ei muuta...
Ehtorakenteen aloittaa if
-sana, jonka jälkeen tulee totuusarvomuotoinen ehto. Jos ehto on tosi, ohjelma suorittaa ehtorakenteen sisällä olevat rivit. Muuten ohjelma hyppää ehtorakenteen yli. Tässä ehto on tosi, jos nimi on Henrikki, ja muuten epätosi.
Python tunnistaa ehtorakenteen sisällä olevat rivit siitä, että ne on sisennetty eli niiden edessä on ylimääräistä tyhjää. Ohjelmoijan päätettävissä on, kuinka paljon tyhjää rivien edessä on, kunhan kaikkien ehtorakenteessa olevien rivien edessä on yhtä paljon tyhjää.
Seuraava ohjelma tervehtii Henrikkiä eri tavoin kuin muita. Ohjelma sanoo Henrikille "Hoi, sankari!" ja kaikille muille "Hellurei!".
nimi = input("Nimi: ") if nimi == "Henrikki": print("Hoi, sankari!") else: print("Hellurei!")
Saman ohjelman voisi toteuttaa myös näin:
nimi = input("Nimi: ") if nimi != "Henrikki": print("Hellurei!") else: print("Hoi, sankari!")
Tässä ovat ohjelman erilaiset tulostukset:
Nimi: Henrikki Hoi, sankari!
Nimi: Antti Hellurei!
Nyt ehtorakenteen lopussa on else
-osa, jonka ohjelma suorittaa, jos alussa oleva ehto ei ole tosi.
Seuraava ohjelma sisältää omat tervehdykset Henrikille, Antille ja Uoleville. Kaikkia muita ohjelma tervehtii samalla tavalla.
nimi = input("Nimi: ") if nimi == "Henrikki": print("Hoi, sankari!") elif nimi == "Antti": print("Morjens!") elif nimi == "Uolevi": print("Tsaukki!") else: print("Hellurei!")
Tässä ovat ohjelman erilaiset tulostukset:
Nimi: Henrikki Hoi, sankari!
Nimi: Antti Morjens!
Nimi: Uolevi Tsaukki!
Nimi: Justiina Hellurei!
Tämä on ehtorakenteen laajin muoto: Ohjelma suorittaa ensimmäisen if
- tai elif
-osan, jota vastaava ehto on tosi. Jos mikään ehto ei ole tosi, ohjelma suorittaa else
-osan. Ehtorakenteesta voi aina puuttua else
-osa, jolloin ohjelma ei tee mitään, jos mikään ehto ei ole tosi.
Totuusarvoja voi yhdistää toisiinsa seuraavin merkinnöin:
yhdistys | milloin tosi? |
---|---|
A and B | A on tosi ja B on tosi |
A or B | A on tosi tai B on tosi |
not A | A ei ole tosi |
Ehtorakenteessa yhdistyksen and
avulla voi tarkistaa, päteekö monta ehtoa yhtä aikaa, ja yhdistyksen or
avulla voi tarkistaa, päteekö ainakin yksi ehdoista.
Seuraava ohjelma tarkistaa, ovatko käyttäjän tunnus ja salasana oikein:
tunnus = input("Tunnus: ") salasana = input("Salasana: ") if tunnus == "antti" and salasana == "abc": print("Oikein!") else: print("Väärin!")
Ohjelma tulostaa "Oikein!", jos tunnus on "antti" ja salasana on "abc".
Seuraava ohjelma tarkistaa käyttäjän iän:
ika = int(input("Ikä: ")) if ika < 0 or ika > 120: print("Mahdotonta!")
Ohjelma tulostaa "Mahdotonta!", jos käyttäjä on alle 0 vuotta tai yli 120 vuotta.
Jos totuusarvo on monimutkainen, sulkujen avulla voi varmistaa, että Python tulkitsee sen oikein. Esimerkiksi on vaikeaa tietää, miten Python tulkitsee totuusarvon tunnus == "antti" and salasana == "abc" or suojaus == 0
. Sulkujen avulla pystyy erottamaan mahdolliset tulkinnat:
(tunnus == "antti" and salasana == "abc") or suojaus == 0
tunnus == "antti" and (salasana == "abc" or suojaus == 0)
Ensimmäisessä tapauksessa riittää, että tunnus ja salasana ovat oikein tai suojaus on 0. Toisessa tapauksessa ensinnäkin tunnuksen täytyy olla oikein ja lisäksi salasanan täytyy olla oikein tai suojauksen täytyy olla 0.
Seuraava ohjelma kysyy käyttäjältä kolme kysymystä. Jokaisesta oikeasta vastauksesta saa pisteen, ja ohjelma ilmoittaa lopuksi pistemäärän.
print("Tervetuloa tietokilpailuun!") pisteet = 0 vastaus = input("Kuinka monta sekuntia on tunnissa?\n") if vastaus == "3600": print("Oikein!") pisteet += 1 else: print("Väärin!") vastaus = input("Minä vuonna J. Sibelius kuoli?\n") if vastaus == "1957": print("Oikein!") pisteet += 1 else: print("Väärin!") vastaus = input("Mikä on Bulgarian pääkaupunki?\n") if vastaus == "Sofia": print("Oikein!") pisteet += 1 else: print("Väärin!") print("Pisteet:", pisteet)
Ohjelman tulostus voi olla seuraava:
Tervetuloa tietokilpailuun! Kuinka monta sekuntia on tunnissa? 3600 Oikein! Minä vuonna J. Sibelius kuoli? 1957 Oikein! Mikä on Bulgarian pääkaupunki? Plovdiv Väärin! Pisteet: 2
Ohjelmassa muuttuja pisteet
on laskurimuuttuja, jonka arvo on aluksi nolla ja jonka arvo kasvaa yhdellä aina, kun käyttäjä vastaa kysymykseen oikein. Lyhennys pisteet += 1
tarkoittaa samaa kuin pisteet = pisteet + 1
. Vastaavaa merkintää voi käyttää myös muiden laskutoimitusten kanssa.
Seuraava ohjelma arvaa käyttäjän ajatteleman viikonpäivän. Ohjelma kysyy korkeintaan kolme kyllä/ei-kysymystä.
print("Ajattele jotain viikonpäivää!") alku = "Onko viikonpäivän nimessä " loppu = "-kirjain (k/e)? " if input(alku + "n" + loppu) == "k": if input(alku + "u" + loppu) == "k": if input(alku + "s" + loppu) == "k": tulos = "sunnuntai" else: tulos = "lauantai" else: if input(alku + "r" + loppu) == "k": tulos = "perjantai" else: tulos = "maanantai" else: if input(alku + "k" + loppu) == "k": tulos = "keskiviikko" else: if input(alku + "r" + loppu) == "k": tulos = "torstai" else: tulos = "tiistai" print("Viikonpäivä on " + tulos + "!")
Ohjelman tulostus voi olla seuraava:
Ajattele jotain viikonpäivää! Onko viikonpäivän nimessä n-kirjain (k/e)? e Onko viikonpäivän nimessä k-kirjain (k/e)? e Onko viikonpäivän nimessä r-kirjain (k/e)? k Viikonpäivä on torstai!
Ohjelman toiminta perustuu seuraavaan päättelykaavioon:
Ohjelma sisältää paljon sisäkkäisiä ehtorakenteita, joissa liikutaan sen mukaan, mitä vastauksia käyttäjä antaa kysymyksiin. Ohjelman täytyy tulostaa monessa kohdassa melkein samanlainen kysymys, minkä vuoksi kysymyksen alkuosa ja loppuosa haetaan muuttujista. Kuten ohjelmasta näkyy, input
-funktion tulos voi olla suoraan osana ehtoa.
Python 3 -opas kirjoitti:
Vertailu a == b == 0 on tosi, koska a < b on tosi ja b == 2 on tosi.
Eikös sen pitäisi olla "Vertailu a < b == 2 ..."?
aqman kirjoitti:
Eikös sen pitäisi olla "Vertailu a < b == 2 ..."?
Näin on, kirjoitusvirhe on korjattu.
opas kirjoitti:
Vertailu a < b == 0 on tosi, koska a < b on tosi ja b == 2 on tosi.
Tämä vielä korjaamatta oppaasta, koodi ok, mutta kommentoinnissa vielä typo. :)
" Ohjelma tulostaa 'Mahdotonta!', jos käyttäjä on alle 0 vuotta tai yli 120 vuotta."
Maailman todistetusti vanhin nainen eli 122 vuotiaaksi. Koodissa täytyy siis olla virhe, eiku... ;)
X == Y X on sama kuin Y
on samanarvoinen
esim Javassa ei toimi
package ohjelma; public class Main { public static void main(String[] args) { String mj1 = "jotain"; String mj2 = "jotain"; if (mj1 == mj2) System.out.println("samat"); } }
koska == vertailee onko sama seuraava toimisi:
String mj2 = mj1;
rivin 5 tilalla niin ohjelma tulostaisi samat
mutta pythonissa voi käyttää ==
Totuusarvojen yhdistys, olisi parempi seuraavalla tavalla: ”A or B: A on tosi tai B on tosi tai molemmat ovat”.
toi vika oli aika sekava (Ajattele jotain viikonpäivää).
Huomio! Kommentoi tässä ainoastaan tämän oppaan hyviä ja huonoja puolia. Älä kirjoita muita kysymyksiä tähän. Jos koodisi ei toimi tai tarvitset muuten vain apua ohjelmoinnissa, lähetä viesti keskusteluun.