Kirjoittaja: Antti Laaksonen (2009).
⚠ Huomio! Tämä opas on vanhentunut. Oppaan sisältöön ei voi enää luottaa. Opas on säilytetty vain sen historiallisen arvon vuoksi. ⚠
Tietokoneohjelma ottaa vastaan, käsittelee ja välittää eteenpäin tietoa. Esimerkiksi käyttäjä voi antaa ohjelmalle tietoa näppäimistöltä tai ohjelma voi lukea tietoa tiedostosta tai Internetistä. Vastaavasti ohjelma voi esittää tietoa tietokoneen näytöllä tai tallentaa tietoa tiedostoon.
Tietokoneohjelman kiinnostava osa on tiedon käsittely eli miten ohjelman saamat tiedot vaikuttavat sen tuottamiin tietoihin. Esimerkiksi jos ohjelma laskee käyttäjän antamien lukujen keskiarvon, ohjelman tulokseen vaikuttavat tietysti lukujen määrä ja niiden suuruudet.
Kaikki tämän opassarjan ohjelmat ovat tekstipohjaisia. Niissä ohjelma voi tulostaa näytölle tekstiä ja lukea käyttäjältä tekstiä. Tekstipohjaisten ohjelmien etuna on yksinkertaisuus: ne sopivat hyvin ohjelmoinnin harjoitteluun.
Kaikki tietokoneen käsittelemät tiedot ovat pohjimmiltaan lukuarvoja. Kuvan sijainti näytöllä ja pelaajan pistemäärä ovat luontevasti lukuja, mutta myös tekstiä ja kuvia voi esittää lukuina: tekstissä jokaista merkkiä vastaa tietty luku, ja kuvassa jokaisen kuvapisteen väriä vastaa tietty luku.
Ohjelmoijan olisi kuitenkin hankalaa käsitellä kaikkea tietoa lukuina, minkä vuoksi ohjelmointikielissä on valmiita tietotyyppejä erilaisille tiedoille. Sopivan tietotyypin avulla ohjelmoija voi esimerkiksi käsitellä tekstiä peräkkäin olevina merkkeinä välittämättä merkkien esitystavasta tietokoneen sisällä.
Python-kielen tärkeimmät tietotyypit ovat merkkijono, kokonaisluku, liukuluku ja totuusarvo. Merkkijono tarkoittaa tekstiä, kokonaisluku ja liukuluku ovat lukuarvoja ja totuusarvo ilmaisee, pitääkö jokin asia paikkansa. Tässä oppaassa käsitellään merkkijonoja ja lukuarvoja, ja totuusarvoihin palataan seuraavissa oppaissa.
Merkkijonoja ovat esimerkiksi "abc"
, "Uolevi"
ja "kas vain!"
. Merkkijonoa ympäröivät lainausmerkit ("
) tai heittomerkit ('
). Merkkijonoja voi yhdistää +
-merkillä: "esi" + "merkki"
tarkoittaa samaa kuin "esimerkki"
.
Seuraava ohjelma tulostaa joukon merkkijonoja:
# -*- coding: latin-1 -*- print "Ohjelma alkaa..." print "eka", "toka", "kolmas" print "esi" + "merkki" print "t" + "e" + "s" + "t" + "i" print "Ohjelma päättyy..."
Ohjelman tulostus on seuraava:
Ohjelma alkaa... eka toka kolmas esimerkki testi Ohjelma päättyy...
Kenoviivalla (\
) on erikoismerkitys merkkijonossa: Jos merkkijonon sisällä on merkki, joka myös ympäröi merkkijonoa, sen eteen täytyy kirjoittaa kenoviiva. Lisäksi merkintä \n
tarkoittaa rivinvaihtoa ja merkintä \\
tarkoittaa kenoviivaa.
Seuraava ohjelma esittelee kenoviivan käyttöä:
# -*- coding: latin-1 -*- print "\"abc\" on merkkijono" print "eka\ntoka\nkolmas" print "c:\\python\\testi.py"
Ohjelman tulostus on seuraava:
"abc" on merkkijono eka toka kolmas c:\python\testi.py
Kokonaisluvun ja liukuluvun ero on siinä, että liukuluvussa on desimaaliosa. Kokonaislukuja ovat esimerkiksi 12
, -275
ja 32700
, ja liukulukuja ovat esimerkiksi 1.25
, 124.0
ja -9239.11
. Suurin osa ohjelmissa esiintyvistä luvuista on kokonaislukuja.
Lukuarvoilla voi laskea seuraavien laskutoimitusten ja sulkujen avulla:
merkintä | selitys | esimerkki | tulos | |
---|---|---|---|---|
a + b | yhteenlasku | 3 + 4 | 7 | |
a - b | vähennyslasku | 7 - 20 | -13 | |
a * b | kertolasku | 11 * 8 | 88 | |
a / b | jakolasku | 17 / 4 17.0 / 4.0 | 4 | (kokonaisluvuilla) (liukuluvuilla) |
a % b | jakojäännös | 17 % 4 | 1 | |
a ** b | potenssilasku | 2 ** 5 | 32 |
Seuraava ohjelma suorittaa joukon laskutoimituksia:
# -*- coding: latin-1 -*- print 1 + 2 + 3 + 4 + 5 print 0.01 + 12.783 * (89 - 13) print "Vuodessa on:" print 365, "päivää" print 365 * 24, "tuntia" print 365 * 24 * 60, "minuuttia" print 365 * 24 * 60 * 60, "sekuntia" print "Jos 6 lasta saavat 45 karkkia," print "kukin lapsi saa", 45 / 6, "karkkia" print "ja", 45 % 6, "karkkia jää yli."
Ohjelman tulostus on seuraava:
15 971.518 Vuodessa on: 365 päivää 8760 tuntia 525600 minuuttia 31536000 sekuntia Jos 6 lasta saavat 45 karkkia, kukin lapsi saa 7 karkkia ja 3 karkkia jää yli.
Muuttuja on tietokoneen muistissa oleva kohta, johon ohjelma voi tallentaa tietoa myöhempää käyttöä varten. Muuttujan nimi on tunnus, jolla muuttujaan viitataan, ja muuttujan arvo tarkoittaa muuttujan sisältöä. Muuttujassa voi olla merkkijono, lukuarvo tai jonkin muun tyyppistä tietoa.
Muuttujalle annetaan aluksi arvo =
-merkinnällä. Tämän jälkeen muuttujan arvoa voi käyttää myöhemmin ohjelmassa tai muuttujalle voi antaa uuden arvon. Muuttujan nimi on ohjelmoijan päätettävissä, ja hyvä nimi kertoo, mitä muuttuja sisältää. Muuttujan nimessä voi olla kirjaimia, numeroita ja alaviivoja, mutta se ei saa alkaa numerolla.
Seuraava ohjelma antaa muuttujille nimi
, vuosi
ja ika
arvot "Henrikki"
, 1672
ja 25
. Tämän jälkeen ohjelma käyttää muuttujien arvoja tulostuskomennoissa.
# -*- coding: latin-1 -*- nimi = "Henrikki" vuosi = 1672 ika = 25 print nimi, "on urhea ritari," print "syntynyt vuonna", vuosi, "kaukana täältä." print nimi, "on tämän pelin sankari." print "Nyt", nimi, "on", ika, "vuotta vanha," print "eletään vuotta", vuosi + ika, "siis."
Ohjelman tulostus on seuraava:
Henrikki on urhea ritari, syntynyt vuonna 1672 kaukana täältä. Henrikki on tämän pelin sankari. Nyt Henrikki on 25 vuotta vanha, eletään vuotta 1697 siis.
Muuttujan arvon voi kysyä käyttäjältä funktiolla raw_input
. Seuraava ohjelma toistaa käyttäjän nimen ja kolmesti hänen viestinsä.
# -*- coding: latin-1 -*- nimi = raw_input("Nimi: ") viesti = raw_input("Viesti: ") print nimi, "sanoo:" print viesti print viesti print viesti
Ohjelman tulostus voi olla seuraava:
Nimi: Antti Viesti: Python on hauskaa! Antti sanoo: Python on hauskaa! Python on hauskaa! Python on hauskaa!
Seuraava ohjelma toistaa käyttäjän nimen ensin kerran, sitten kahdesti ja lopuksi neljästi. Esimerkiksi jos käyttäjän nimi on Antti, muuttujan nimi
arvo on ensin "Antti"
, sitten "AnttiAntti"
ja lopuksi "AnttiAnttiAnttiAntti"
.
# -*- coding: latin-1 -*- nimi = raw_input("Nimi: ") print nimi nimi = nimi + nimi print nimi nimi = nimi + nimi print nimi
Ohjelman tulostus voi olla seuraava:
Nimi: Antti Antti AnttiAntti AnttiAnttiAnttiAntti
Funktion tehtävänä on palauttaa arvo sille annettujen tietojen perusteella. Seuraavassa ohjelmassa funktio len
laskee merkkijonon merkkien määrän:
# -*- coding: latin-1 -*- print "Merkkien määrä:", len("python")
Ohjelman tulostus on seuraava:
Merkkien määrä: 6
Tässä tapauksessa funktio len
ottaa vastaan merkkijonon ja palauttaa sen merkkien määrän.
Joskus funktion palautusarvoon vaikuttavat muutkin asiat kuin sille annetut tiedot. Esimerkiksi funktio raw_input
palauttaa käyttäjän kirjoittaman tekstin merkkijonona.
Tässä on muutamia hyödyllisiä Python-kielen funktioita:
funktio | toiminta |
---|---|
len | laskee merkkijonon merkkien määrän |
int | muuttaa arvon kokonaisluvuksi |
float | muuttaa arvon liukuluvuksi |
str | muuttaa arvon merkkijonoksi |
round | pyöristää luvun halutulle tarkkuudelle |
abs | laskee luvun itseisarvon |
Funktiot int
, float
ja str
ovat tarpeellisia, koska luvuille ja merkkijonoille voi tehdä erilaisia asioita. Esimerkiksi +
-merkintä laskee lukuja yhteen tai liittää merkkijonoja toisiinsa. Funktiolle len
voi antaa vain merkkijonon, kun taas funktiolle abs
voi antaa vain luvun.
Seuraava ohjelma laskee kertolaskun ja ilmoittaa, kuinka monta numeroa tuloksessa on.
# -*- coding: latin-1 -*- eka = int(raw_input("Anna 1. luku: ")) toka = int(raw_input("Anna 2. luku: ")) tulo = eka * toka print "Lukujen tulo:", tulo print "Numeroita:", len(str(tulo))
Ohjelman tulostus voi olla seuraava:
Anna 1. luku: 1832 Anna 2. luku: 5755 Lukujen tulo: 10543160 Numeroita: 8
Funktion raw_input
palauttamat merkkijonot täytyy muuttaa kokonaisluvuiksi, jotta kertolasku voidaan suorittaa. Lopuksi laskun tulos taas täytyy muuttaa merkkijonoksi, jotta sen numeroiden määrän laskeminen onnistuu.
Seuraava ohjelma laskee tuotteen alennetun hinnan:
# -*- coding: latin-1 -*- hinta = float(raw_input("Alkuperäishinta: ")) alennus = float(raw_input("Alennusprosentti: ")) hinta = hinta - hinta * (alennus / 100) print "Alennushinta:", round(hinta, 2)
Ohjelman tulostus voi olla seuraava:
Alkuperäishinta: 78 Alennusprosentti: 12 Alennushinta: 68.64
Ohjelma käsittelee lukuja liukulukuina, koska hinnat ja alennusprosentti eivät ole välttämättä kokonaislukuja. Funktio round
pyöristää alennushinnan kahden desimaalin tarkkuudelle.
Esimerkki: Alennushinta antaa minulle tällaisen virheen, kun syöttää desimaaliluvun muodossa 49,90: "ValueError: invalid literal for float(): 49,90". Kyllähän se float tietenkin desimaalilukuja ottaa vastaan, mutta pitää laittaa piste desimaaliosan erottajaksi pilkun sijaan eli 49.90 eikä 49,90.
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.