Muuttujat, sijoituskäsky ja tiedon lukeminen käyttäjältä
Yleensä tietokoneohjelmissa halutaan, että ohjelma voi lukea jotain tietoa käyttäjältä ja käyttää tätä tietoa hyväkseen. Ajatellaan esimerkiksi ohjelmaa, joka pyytää käyttäjältä lämpötilan fahrenheit-asteina ja tulostaa saman lämpötilan celsius-asteina. Ohjelmassa täytyy tällöin olla jokin tapa tallentaa käyttäjän antama fahrenheit-arvo ja käsitellä sitä.
Tällaiseen arvojen tallentamiseen voidaan käyttää muuttujia.
Jokaisella muuttujalla on nimi ja muuttujalle voi antaa arvon. Muuttujan
nimen avulla pääsee käsiksi tähän muuttujan arvoon myöhemmin ohjelmassa.
Muuttujalle voi antaa arvon sijoituskäskyn avulla. Sijoituskäskyssä on
vasemmalla sen muuttujan nimi, jolle arvo halutaan antaa, sitten
sijoitusoperaattori =
, ja oikealla muuttujalle annettava arvo.
Esimerkiksi käsky
fahrenheit = 78.5
sijoittaa muuttujan fahrenheit
arvoksi 78.5. Sijoitettavan arvon ei
tarvitse olla suoraan jokin vakioarvo, vaan sijoitusoperaattorin
oikealla puolella voi olla jokin lauseke, jonka arvo lasketaan ensin.
Tämän jälkeen laskettu arvo annetaan arvoksi vasemmalla puolella
olevalle muuttujalle, esimerkiksi käsky
celsius = (fahrenheit - 32) * 5.0 / 9.0
vähentää muuttujan fahrenheit
arvosta 32, kertoo näin saadun
tuloksen 5.0:lla ja jakaa sen 9.0:lla ja sijoittaa näin saadun tuloksen
muuttujan celsius
arvoksi.
Katso vielä alla olevasta animaatiosta, mitä ohjelmaa suoritettaessa tietokoneen sisällä tapahtuu. Voit käynnistää animaation ja ajaa siinä ohjelmaa askel kerrallaan painamalla vihreää nuolipainiketta.
(Tässä oppimateriaalissa olevat animaatiot eivät ole täsmällisiä kuvauksia tietokoneen toiminnasta, vaan niissä niin tietokoneen rakennetta kuin sen toimintaa on yksinkertaistettu.)
Ennen kuin lähdetään tutkimaan fahrenheit-celsius-muunnoksen tekevää ohjelmaa ja lämpötilatiedon lukemista käyttäjältä tarkemmin, tarkastellaan vielä yksinkertaisempaa ohjelmaa. Se pyytää käyttäjää antamaan nimensä, lukee käyttäjän antaman nimen ja tulostaa sitten käyttäjälle osoitetun tervehdyksen.
Käyttäjän syötettä voidaan lukea käskyn input
-avulla. Esimerkiksi
käsky
nimi = input("Kerro nimesi: ")
tulostaa ensin kuvaruudulle tekstin “Kerro nimesi: ”, lukee sitten
käyttäjän antaman tekstin ja sijoittaa sen muuttujan nimi
arvoksi.
Käskyssä on siis input
in jälkeen tulevien sulkujen sisällä se
teksti, joka käyttäjälle halutaan ensin tulostaa. Luettu arvo annetaan
jonkin muuttujan arvoksi sijoituskäskyn avulla.
Seuraavaksi koko ohjelma, joka lukee käyttäjän tekstin ja tulostaa tervetulotoivotuksen:
nimi = input("Kerro nimesi: ")
print("Hei,", nimi)
print("Tervetuloa Python-kurssille!")
nimi
arvoksi.Hei,
ja sen jälkeen
samalle riville muuttujan nimi
arvo. Sana Hei on lainausmerkkien
sisällä, koska se halutaan tulostaa sellaisenaan. Sana nimi
sen
sijaan ei ole lainausmerkkien sisällä, koska ohjelman ei haluta tulostavan
tekstiä nimi, vaan muuttujan nimi
arvo.Tervetuloa Python-kurssille!
sellaisenaan.Jos samassa tulostuskäskyssä halutaan tulostaa enemmän kuin yksi asia (esimerkkitapauksessa ylemmässä tulostuskäskyssä sekä teksti että muuttujan nimi arvo), erotetaan tulostettavat asiat toisistaan pilkulla. Tulostettavien asioiden välille lisätään tulostuksessa yksi välilyönti.
(Niiden, jotka ovat aikaisemmin ohjelmoineet jollain toisella kielellä kannattaa huomata, että Python-ohjelmissa muuttujia ei määritellä toisin kuin esimerkiksi Java- tai C-ohjelmissa.)
Kun ohjelma ajetaan, näyttää sen tulostus seuraavalta:
Kerro nimesi: Maija
Hei, Maija
Tervetuloa Python-kurssille!
Fahrenheit-Celsius-muunnoksen laskeva ohjelma on vähän monimutkaisempi
kuin tervetulotoivotusohjelma.
Tämä johtuu siitä, että input
-käsky välittää käyttäjältä lukemansa
syötteen aina merkkijonona eli tekstinä, joka koostuu peräkkäisistä
merkeistä (näitä merkkejä voi olla yksi, useampi tai jopa nolla).
Lämpötilamuunnoksessa tarvitaan kuitenkin yhteen-, kerto- ja
jakolaskuja. Python-tulkki ei voi suorittaa näitä laskutoimituksia
merkkijonoille, vaan laskutoimituksen operandin on oltava luku.
Oletetaan, että käyttäjän antama merkkijono on tallennettu muuttujaan
rivi. Merkkijonoa vastaava luku voidaan tällöin antaa muuttujan
fahrenheit arvoksi käskyllä
fahrenheit = float(rivi)
Tässä käsky float
luo sille sulkujen sisällä annettua merkkijonoa
tai sulkujen sisällä annetun muuttujan arvona olevaa merkkijonoa
vastaavan desimaaliluvun. Tämä onnistuu vain, jos merkkijono
todella esittää jotain desimaalilukua. Seuraavaksi koko ohjelma:
rivi = input("Anna lampotila fahrenheit-asteina: ")
fahrenheit = float(rivi)
celsius = (fahrenheit - 32) * 5.0 / 9.0
print(fahrenheit, "F on", celsius, "C")
Ohjelman suoritus voi näyttää seuraavalta:
Anna lampotila fahrenheit-asteina: 79.5
79.5 F on 26.3888888889 C
Kuten esimerkkiajosta nähdään, celsius-lämpötila esitetään turhan tarkasti. Kierroksen 3 materiaalissa kerrotaan, miten tulosta voi muotoilla siistimmäksi.
Alla on vielä animaatio ohjelman suorituksesta. Aluksi siinä käyttäjän
antaman luvun ympärillä on lainausmerkit. Tämä kertoo siitä, että
tietokone ei käsittele vielä sitä lukuna, vaan tavallisena tekstinä.
Jos esimerkiksi käyttäjä antaa luvun 79.5, Python-tulkki ymmärtää
sen tekstiksi,
jossa on ensin merkki ’7’, sitten merkki ’9’, tämän jälkeen merkki
’.’ ja lopuksi merkki ’5’. Kun float
-käsky on suoritettu,
lainausmerkit poistuvat ja muuttujaan ”fahrenheit” tallennetaan
tietokoneenkin mielestä desimaaliluku.
Jos käyttäjän antamaa merkkijono ei vastaa mitään lukua, ohjelma kaatuu eli se lopettaa toimintansa ja tulostaa jonkinlaisen virheilmoituksen. Alla esimerkki ohjelman tällaisesta suorituksesta:
Anna lampotila fahrenheit-asteina: ei mikaan luku
Traceback (most recent call last):
File "/m/home/lampotilat1.py", line 2, in <module>
fahrenheit = float(rivi)
ValueError: could not convert string to float: 'ei mikaan luku'
Virheilmoitus ei näytä kovin helppolukuiselta, mutta se kertoo, missä ohjelman kohdassa virhe on sattunut, millainen virhe oli kysymyksessä ja mikä virheen aiheutti.
Edellisessä esimerkissä ei ole käytetty ohjelman tulostuksissa skandinaavisia aakkosia ä, ö ja å, vaan ne on korvattu a:lla ja o:lla. Tämä ei ole mitenkään pakollista, vaan Python-ohjelmissa pystytään käsittelemään myös näitä kirjaimia. Käytännössä tällä kurssilla on kuitenkin havaittu, että ä- ja ö-kirjainten käyttäminen aiheuttaa opiskelijoille usein harmia kurssilla käytettävän automaattisen tarkastusjärjestelmän käytössä, kun opiskelijat tekevät harjoitustehtäviä omilla kotikoneillaan, mutta eivät osaa asettaa käytettäviä merkkien koodaustapoja (sitä, miten kirjaimet esitetään tietokoneen muistissa) oikein. Koska näistä asioista huolehtiminen ei ole tällä kurssilla keskeinen asia, on opiskelijoiden harjoitustehtävien tekemisen helpottamiseksi tällä kurssilla luovuttu skandinaavisten aakkosten käyttämisestä ohjelman tulostuksista.