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 inputin 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!")
Pyydetään ja luetaan käyttäjältä nimi.
Tallennetaan luettu nimi muuttujan nimi arvoksi.
Tulostetaan teksti 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.
Tulostetaan teksti 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.