Kirjautuminen

Haku

Tehtävät

Kilpailu

Ohjelmoi tekoäly!
Aikaa on 6.1. saakka.

Opasarkisto: Python 2 -ohjelmointi: Osa 2 - Tiedon käsittely

  1. Osa 1 - Ensimmäinen ohjelma
  2. Osa 2 - Tiedon käsittely
  3. Osa 3 - Ehtorakenteet
  4. Osa 4 - Toistorakenteet
  5. Osa 5 - Listojen käsittely
  6. Osa 6 - Merkkijonot
  7. Osa 7 - Omat funktiot
  8. Osa 8 - Tiedostot ja virheet
  9. Osa 9 - Standardikirjasto
  10. Osa 10 - Tietorakenteet
  11. Osa 11 - Alkeita edemmäs
  12. Osa 12 - Yhteenveto
  13. Liite 1 - Asennus ja käyttö
  14. Liite 2 - Python ja ääkköset

Kirjoittaja: Antti Laaksonen. Vuosi: 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.

Tietotyypit

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.

Merkkijono

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

Lukuarvo

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äselitysesimerkkitulos
a + byhteenlasku3 + 47
a - bvähennyslasku7 - 20-13
a * bkertolasku11 * 888
a / bjakolasku17 / 4
17.0 / 4.0
4
4.25
(kokonaisluvuilla)
(liukuluvuilla)
a % bjakojäännös17 % 41
a ** bpotenssilasku2 ** 532

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

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.

Muuttujan tulostus

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.

Muuttuja käyttäjältä

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

Funktio

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:

funktiotoiminta
lenlaskee merkkijonon merkkien määrän
intmuuttaa arvon kokonaisluvuksi
floatmuuttaa arvon liukuluvuksi
strmuuttaa arvon merkkijonoksi
roundpyöristää luvun halutulle tarkkuudelle
abslaskee 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.

Esimerkki: Kertolasku

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.

Esimerkki: Alennushinta

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.


Kommentit

Tyhjiö [09.10.2011 00:50:46]

Lainaa #

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.

Kirjoita kommentti

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.

Muista lukea kirjoitusohjeet.
Tietoa sivustosta