OPI PYTHONIN PERUSTEET

Tämä interaktiivinen harjoituskokoelma opettaa sinulle Python-ohjelmointikielen alkeet. Opas seurailee PyCon 2014 -tapahtumassa Barbara Shauretten ja Katie Cunninghamin pitämän Python-koulutuksen rakennetta.

Jos haluat tämän suomenkielisen oppaan sijaan tutustua englanninkieliseen alkuperäismateriaaliin (kalvot, esimerkit ym.), ne ovat ladattavissa täältä: https://github.com/mechanicalgirl/young-coders-tutorial

Mitä ohjelmoinnilla tarkoitetaan:

  • Tietokone on laite joka paitsi säilöö, myös siirtää, järjestää, luo ja hallitsee tietoa (eli dataa).
  • Tietokoneohjelma puolestaan on joukko yksikäsitteisiä ohjeita, jotka kertovat tietokoneelle mitä datalle pitäisi tehdä. Ohjelmointikieli on se erityinen kieli, millä nämä ohjeet kirjoitetaan.
  • Alla on joitain esimerkkejä ohjeista, jotka on tarkoitettu meille ihmisille (origamilinnun taitteluohje, pikkuleipäresepti ja kirjan sidontaohje):

  • Heti alkuun on hyvä sisäistää, että tietokone on kovin tyhmä. Se ymmärrä yllä olevan esimerkin kaltaisia oheita, vaikka ne ovat ihmiselle päivänselviä. Tietokoneelle ohjeet pitää kirjoittaa todella yksityiskohtaisesti, huolellisesti ja tarkasti, sillä se toimii täsmälleen kuten ohjeistettu. Tämä ohjeiden kirjoittaminen jollain ohjelmointikielellä on ohjelmointia - eli juuri sitä, mitä tämä opas opettaa.
  • Algoritmilla tarkoitetaan ohjeita jonkin tietyn asian tekemiseksi tietokoneella - usein tehokkaalla ja nopealla tavalla. Algoritmit ovat kuin reseptejä, eli askel-askeleelta eteneviä ohjeita, joiden lopputulos on haluttu (esim. kanelipulla tai aakkosjärjestykseen saatettu lista nimiä).

Pian kokeilemme kirjoittaa ohjeita tietokoneelle, mutta ensin on hyvä tietää, että ohjelmointikieliä on olemassa valtavasti erilaisia - eri käyttötarkoituksiin. Tässä oppaassa opettelemme ohjelmointikieltä nimeltä Python, joka on aloittelijaystävällinen ja silti valtavan tehokas ja ilmaisuvoimainen kieli.

Python voi näyttäytyä ohjelmoijalle monessa muodossa:

  1. Yksinkertaisin tapa käyttää Pythonia on Python-komentotulkki, jonne kirjoitetaan komentoja, jotka tulkki sitten välittämästi suorittaa. Komentotulkin kanssa vuoropuheluna voi tehdä laskutoimituksia, opiskella Pythonin käyttöä tai kokeilla erilaisten ideoiden toimivuutta.
  2. Komentotulkista on myös kehittyneempi ja käyttäjäystävällisempi versio nimeltä IPython. Se tarjoaa monenlaisia apuvälineitä Pythonin kirjoittamiseen: tiedostojen hallintaa, dokumentaatiota, erilaisia oikoteitä, komentohistorian ja paljon muuta.
  3. IPython Notebookin, jota nyt parhaillaan käytät, lähestymistapa on erilainen: käytössäsi on nettiselaimessa (Chrome, Firefox ym.) toimiva vuorovaikutteinen muistikirjan sivu, jonne voi kirjoittaa paitsi tekstiä, myös Python-ohjelmointikielisiä käskyjä.
  4. Python-ohjelmointikielellä voidaan myös tehdä itsenäisesti toimivia ohjelmia. Tällöin kirjoitetaan .py-tiedosto, joka annetaan tietokoneen suoritettavaksi. .py-tiedostojen kirjoittamiseen on monenlaisia työkaluja aina muistiosta tehokkaisiin integroituihin kehitysympäristöihin (eng. IDE). Näin tehty ohjelma voidaan jopa paketoida suoritettavaksi .exe-tiedostoksi.

1. Laskutoimituksia

Aloitetaan Python-ohjelmointi yksinkertaisella matematiikalla. Pythonia voi nimittäin käyttää kätevänä laskimena.

Naksauta hiirellä alla oleva harmaa laatikko aktiivisiksi ja paina [⇧SHIFT] + [↵ENTER], jolloin Python suorittaa laskutoimituksen, kertoo tuloksen ja siirtyy seuraavaan laatikkoon.


In [ ]:
1+2

Hyvä! Tee sama uudelleen alla olevalle laatikolle.


In [ ]:
12-3

Kokeile nyt kirjoittaa itse alla olevaan harmaaseen laatikkoon seuraava laskutoimitus. Älä kuitenkaan kopioi >>>-merkkejä, sillä ne ovat vain ilmaisemassa, että kyseessä on Python-koodi:

>>> 9+5-15

In [ ]:
9+2

Paina sitten [CTRL] + [↵ENTER] ja Python laskee laskun, kertoo tuloksen ja pitää kyseisen laatikon aktiivisena siltä varalta, että haluat muokata sen sisältöä. Tämä siis erotuksena aiempaan [⇧SHIFT] + [↵ENTER] -komentoon, joka siirtyy heti eteenpäin. Toiminnolle löytyy myös [▶]-nappi yläreunan työkalupalkista.

Matemaattiset operaattorit

Pythonin matemaattiset perusoperaattorit ovat:

  • yhteenlasku: +
  • vähennyslasku: -
  • kertolasku: *
  • jakolasku: /

Kokeile vaikka näitä:

>>> 6*5
>>> 10*5*3
>>> 6/2
>>> 20/7

Tai voit kokeilla laskea ihan itse keksimilläsi luvuilla. Kokeile myös operaattoria **. Keksitkö mitä se tekee?


In [ ]:
2**2

In [ ]:


In [ ]:


In [ ]:
2/3.0

Sivuhuomautus: Pythonin 2.7 ja 3 versiot laskevat jakolaskun eri tavalla. Vanhempi ja käytöstä poistuva 2.7 saattaa tuottaa ikävän yllätyksen: 5/2 palauttaakin arvon 2, eikä 2.5. Jos Python 2.7:lla haluaa tarkan jakolaskun tuloksen on kirjoitettava 5.0/2.0. Tässä pitää olla tarkkana, sillä Python 2.7 -ympäristöihin saattaa törmätä vielä ajoittain.

Toinen sivuhuomautus: Saatat huomata tehdessäsi omia laskuja, että tulos ei ole aivan sitä mitä odotit. Tällöin järjestys, missä Python suorittaa laskuoperaatot saattaa olla eri mitä tarkoitit. Voit pakottaa Pythonin laskemaan haluamassasi järjestyksessä lisäämällä sulkuja. Esimerkiksi 3+4+5/3 ei tuota samaa vastausta kuin (3+4+5)/3.


In [ ]:

Vertailuoperaattorit

`== `tutkii ovatko luvut yhtäsuuret
`!= `tutkii ovatko luvut erisuuret
`< `tarkistaa onko vasemmalla puolella oleva luku pienempi kuin oikealla puolella oleva
`> `tarkistaa onko vasemmalla puolella oleva luku suurempi kuin oikealla puolella oleva
`<= `tarkistaa onko vasemmalla puolella oleva luku pienempi *tai yhtäsuuri* kuin oikealla puolella oleva
`>= `tarkistaa onko vasemmalla puolella oleva luku suurempi *tai yhtäsuuri* kuin oikealla puolella oleva

Kokeile näitä alla. Esimerkiksi:

>>> 5 < 4 + 3
>>> 12 + 1 >= 12
>>> 16 * 2 == 32
>>> 16 != 16
>>> 5 >= 6

In [ ]:


In [ ]:


In [ ]:


In [ ]:


In [ ]:

Vertailuoperaatot ovat tärkeitä ohjelmoinnissa, kuten pian tulemme näkemään. Niiden avulla voimme ohjelmoida tietokoneen tekemään eri asioita eri tilanteissa.

2. Merkkijonot

Paitsi lukuja, käsittelevät tietokoneet myös paljon tekstimuotoista tietoa. Tekstimuotoinen tieto on tallennettu tietokoneelle jonona kirjoitusmerkkejä, eli tuttavallisemmin merkkijonona.

Python tulkitsee merkkijonoksi tekstinpätkän, joka on lainausmerkkien välissä. Kokeile:

>>> "hello world"
>>> "omppu"
>>> omppu

In [ ]:
"hello world"

In [ ]:


In [ ]:
omppu

Viimeisen esimerkin, eli sen ompun, jota ei oltu ympyröity lainausmerkein, tuleekin antaa virhe. Virheisiin palaamme pian, mutta tässä esimerkin tarkoitus on iskostaa mieleesi seuraava sääntö: jos haluat syöttää Pythonille merkkijonon, käytä lainausmerkkejä

Operaatioita merkkijonoille

Kuten luvuille, myös merkkijonoille voi tehdä erilaisia operaatioita:

  • yhdistäminen: +
  • toistaminen: *

Katso ja kokeile mitä Python tekee kun annat sille seuraavat ohjeet:

>>> "Hei " + "muukalainen"
>>> "HAHA" * 100

In [ ]:


In [ ]:

3. Muuttujat

Tutustuimme edellä siihen, miten lukuja ja merkkijonoja käsitellään Pythonilla. Seuraavaksi tutustumme ideaan, jota voi käyttää molempien kanssa - eli muuttujaan.

Matematiikan tunnilta saatat muistaa x:n. Sitä käytettiin merkitsemään jotain tuntematonta (tai tunnettua) lukua. Ohjelmointikielessä nämä muuttujat toimivat hieman samalla tavalla.

Muuttujat ovat kuin laatikoita, joiden sisään voit pakata numeroita, merkkijonoja tai muita "juttuja".

Laske alla olevassa harmaassa laatikossa lasku:

>>> 12 * 12

In [ ]:

Python kuitenkin unohtaa tuloksen heti. Entäs jos haluaisit, että vastaus pysyy muistissa? Voit laittaa tuloksen muistiin sijoittamalla sen nimettyyn muuttujaan:

>>> tulos = 12 * 12
>>> tulos

In [ ]:


In [ ]:

Muuttujat säästävät aikaa ja vaivaa, sillä voit nyt käyttää muuttujaa tulos uudelleen ja uudellen tulevissa laskutoimituksissa ja ohjeissa.

Huomaa, että tulos ei ole lainausmerkeissä. Näin siksi, että se ei ole merkkijono, vaan muuttuja. Yleensä kannattaa käyttää kuvaavia muuttujan nimiä. Näin ei tarvitse turhaan arvailla ja selvitellä, että mitä muuttujassa on sisällä - nimi kertoo sen jo.

Voit uudelleenkäyttää muuttujia. Sijoita vaan sinne uusi arvo. Esimerkiksi:


In [ ]:
color = 'yellow'

In [ ]:
color = 12

Mitä luulet 'color' muuttujassa nyt olevan? Kokeillaan (suorita kaikki tämän esimerkin kolme laatikkoa ylhäältä alas):


In [ ]:
color

Muuttujat ovat ohjelmoinnissä hyvin tärkeitä. Siksi kertauksena:

  • Voit laittaa tulokset talteen muuttujaan ja käyttää näitä tuloksia myöhemmin
  • Voit vaihtaa muuttujan arvon vaikka sen nimi pysyy samana
  • Muuttujaan sijoitetaan '=' operaattorilla. Tämä erotuksena '==' operaattoriin, joka siis tutkii ovatko luvut tai muuttujien sisältämät luvut samat (esimerkki alla). Tässä sekoilu on hyvin yleinen virhe.

In [ ]:
x = 3
y = 3
x==y

Tässä muuten joitain muita juttuja, mitä muuttujilla - ja erityisesti merkkijonomuuttujilla - voi tehdä.


In [ ]:
hedelma = "appelsiini"
hedelma[2]

In [ ]:
indeksi = 4
hedelma[indeksi-2]

Alle voit kokeilla tätä merkkijonoihin indeksointia itse:


In [ ]:

4. Virheet

Eräs ohjelmoinnissa hyvin tärkeä asia ovat virheet ja virheilmoitukset. Paraskaan ohjelmoija ei osaa kirjoittaa virheetöntä ohjelmakoodia. Siksi onkin hyvä, että työkalu osaa tunnistaa ja kertoa meille suurimmassa osassa tapauksista milloin olemme tehneet jotain väärin - ja mikä vielä tärkeämpää, missä ja mikä virhe oikein oli. Suorita alla olevat koodit.


In [ ]:
"kaveri"*5

In [ ]:
"kaveri"+5

Mitä ylle ilmaantunut virhe mielestäsi tarkoittaa? Mitä 'str' ja 'int' tarkoittavat?

Pureskellaan virheilmoitus auki:

  • Merkkijonot ('str' lyh. string)
  • Kokonaisluvut ('int' lyh. integer)
  • Molemmat ovat jotain objekteja (objects suom. olioita)
  • Mutta Python ei osaa yhdistää niitä, sillä ne ovat eri tyyppisiä (TypeError).

Usein lukemalla virheilmoituksen huolellisesti voi päästä jyvälle siitä mikä menee vikaan. Esimerkkitapauksessamme virhe olisi korjattavissa niin, että annamme myös numeron lainausmerkkien välissä olevana merkkijonona, jolloin yhdistettävät ovat molemmat merkkijonoja. Kokeile:

>>> "kaveri"+"5"

In [ ]:

Perustietotyypit

Olemme jo tutustuneet kolmeen tietotyyppiin:

  • "Hei!", joka on merkkijono (eng. string)
  • 27, joka on kokonaisluku (eng. integer)
  • 3.14, joka on desimaaliluku/liukuluku (eng. float)

Sivuhuomautus: Huomaa, että Pythonin desimaalierotin on piste eikä pilkku. Tämä on hyvin yleistä ohjelmointikielissä ja tietojenkäsittelyssä, mutta ensikertalaisen kannattaa kiinnittää asiaan huomiota.

Python osaa kertoa meille tyypin Pythoniin sisäänrakennetulla type(...)-funktiolla. Funktioihin tutustumme lähemmin tuonnempana.


In [ ]:
tervehdys = "Hei!"
type(tervehdys)

Hae alla vastaavalla tavalla tyyppikuvaus kokonaisluvulle ja liukuluvulle:


In [ ]:
type(12)

In [ ]:

Voit muuttaa tietoa toiseen muotoon int(...), str(...) ja float(...) -funktioilla. Esimerkiksi:


In [ ]:
float(5)

Kokeile muuttaa kokonaisluku merkkijonoksi:


In [ ]:

Entäs muuttuuko numeron sisältävä merkkijono desimaaliluvuksi?:


In [ ]:

5. Listat

Lista voi pitää sisällään sarjan olioita. Esimerkiksi:


In [ ]:
hedelmat = ["omena", "banaani", "mandariini"]

In [ ]:
numerot = [3, 17, -4, 8.8, 1]

Arvaa mitä type(...)-fuktio osaa kertoa:


In [ ]:
type(hedelmat), type(numerot)

Voit käyttää kokonaislukuindeksiä ja hakasulkuoperaattoria hakeaksesi jonkin listan alkion:


In [ ]:
hedelmat[0]

In [ ]:
numerot[1]

Huomaa edellisistä esimerkistä pari seikkaa. Ohjelmointikielissä on tyypillistä, että listan ensimmäinen alkio haetaan indeksillä 0 - se on siis tavallaan "nollas" alkio eikä "ensimmäinen". Näin myös Pythonissa.

Mihin negatiivinen indeksi -1 osoittaa? Entä -2? Kokeile arvasitko oikein:


In [ ]:
hedelmat[-1]

Tehtävä:

Tee lista kolmesta lempiväristäsi:


In [ ]:

Käytä indeksiä ja hakasulkuoperaattoria hakeaksesi yhden lempiväreistäsi:


In [ ]:

Extratehtävä: mitä tapahtuu jos indeksoit kahdesti hedelmat-listaa tai lempivärilistaa? Miksi tulos on se mikä se on?


In [ ]:
hedelmat[1][3]

6. Totuusarvot (eng. booleans)

Totuusarvo voi olla True tai False


In [ ]:
1==1

In [ ]:
15 < 5

Kokeile mitä tapahtuu jos kirjoitat Pythonille pelkän True tai False. Entäs pystytkö sijoittamaan totuusarvon muuttujaan?


In [ ]:


In [ ]:

Mikä on totuusarvon tyyppi? Tarkista se type(...)-funktiolla, kuten teimme kokonaisluvuille ja merkkijonoille:


In [ ]:

Huomaa, että True ja False on kirjoitettu suurella alkukirjaimella, ja että ne eivät ole ympäröity lainausmerkein, eli ne eivät ole merkkijonoja. True ja False ovatkin Pythonin varattuja sanoja, eli kieleen sisäänrakennettuja asioita.

and / or / not

Myös and, or ja not ovat Pythonissa varattuja sanoja. Niillä voi muuttaa totuusarvoja, sekä yhdistää niitä tuottavia vertailuoperaatioita toisiinsa.

Alla risuaidan # jälkeen kirjoitettua ei tulkita Python-kieleksi. Ne ovat koodin sekaan kirjoitettuja kommentteja, mikä onkin usein tarpeen, jotta koodin tarkoitusta ei tarvitse turhaan kummastella. Kommentit auttavat koodaajaa - ja mikä tärkeämpää - muita koodaajia ymmärtämään mitä koodi tekee.


In [ ]:
1==1 and 2==2   # molemmat ovat tosia, lopputulos tosi

In [ ]:
1==1 and 2!=2  # Vain toinen on tosi, lopputulos epätosi

In [ ]:
1==2 and 2==3  # Kummatkaan eivät ole tosia, lopputulos epätosi

In [ ]:
1==1 or 2==2   # molemmat ovat tosia, lopputulos tosi

In [ ]:
1==1 or 2!=2  # Vain toinen on tosi, lopputulos silti tosi

In [ ]:
1==2 or 2==3  # Kummatkaan eivät ole tosia, lopputulos epätosi

In [ ]:
1==1

In [ ]:
not 1==1

Tehtävä:

Kokeile sijoittaa muutama totuusarvo muuttujiin (esim. a ja b) ja kokeile itse and, or ja not operaattoreita.


In [ ]:


In [ ]:


In [ ]:

XOR: Osaatko tehdä vertailun, joka palauttaa True vain jos jompikumpi vertailtavasta on tosi (ns. exclusive-or, xor)? Vinkki: käytä muuttujia ja ryhmittele vertailuoperaattoreita suluilla. Esim:

>>> not (True and (True or False))

In [ ]:

Merkkijonojen vertailu: Kokeile vielä verrata merkkijonoja keskenään. Kokeile onko suurilla ja pienillä kirjaimilla merkitystä. Yllätyitkö?


In [ ]:
"test" == "Test"

7. Logiikka

Tähän mennessä olemme käyttäneet Pythonia lähinnä moneen hienoon temppuun taipuvana laskukoneena. Jotta pystyisimme kirjoittamaan tietokoneelle pidempiä ohjeita, tulee meidän tutustua keinoihin joilla ohjeiden logiikka kuvataan Pythonin kaltaisissa ohjelmointikielissä. Tähän on käytettävissä kaksi perustekniikkaa: ehdot ja simukat.

7.1. Ehtolause

if -lause, eli ehtolause, on tapa pistää tietokone päättämään mitä sen tulisi koodia tulkitessaan seuraavaksi tehdä.

Alla on muutamia esimerkkejä, joita saattaisit käyttää tosielämän päätöksentekoon:

"Jos olet nälkäinen, mennään lounaalle."

"Jos roskis on täynnä, mene ja tyhjää se."

Alla esimerkki siitä, miten samankaltainen asia ilmaistaisiin Python-koodissa:

>>> nimi = "Jussi"
>>> if name == "Jussi":
>>> ····print("Moi Jussi!")

Moi Jussi!

Huomattavaa: Pythonissa ehtolauseen jälkeen tulee kaksoispiste, joka puolestaan kertoo että seuraavalta riviltä alkaa uusi lohko. Lohko on pätkä ohjelmakoodia, joka kuuluu yhteen, ja jonka tietokone suorittaa kokonaisuutena rivi kerrallaan (ylhäältä alas). Lohko on sisennetty neljällä välilyönnillä ja kaikki samaan tasoon sisennetyt peräkkäiset rivit kuuluvat samaan lohkoon (yllä olevassa esimerkissä pisteet tarkoittavat välilyöntejä, ja ovat siinä näkyvillä vain siksi, että välilyöntien käyttö tulisi selvemmäksi).

Mutta entä jos henkilö ei olekaan Jussi? Pythonissa on varattu sana else näitä tilanteita varten:

>>> if name=="Jussi":
>>> ····print("Moi Jussi!")
>>> else:
>>> ····print("Hujari!")

Jos taas henkilöitä on enemmän, voidaan käyttää sanaa elif tämän toisen ehdon tarkastamiseen:

>>> if name=="Jussi":
>>> ····print("Moi Jussi!")
>>> elif name=="Aki":
>>> ····print("Hei Aki!")
>>> else:
>>> ····print("Kuka sinä olet?")

Huomattavaa:

  • elif -ehto tarkastetaan vain jos mikään ennen sitä olevista ehdoista ei toteutunut.
  • else -lohko suoritetaan vain jos mikään aiempi ehto ei toteutunut.

Toisinsanoen: if/elif/else rakenteesta suoritetaan aina vain yksi haara (lohko).

Tehtävä:

Kirjoita koodinpätkä, joka tulostaa ruudulle "Yeah!" jos muuttuja nimeltä color on "yellow":


In [ ]:

Lisää ehtoon vielä elif ja else -haarat, joissa tutkit onko muuttujassa jokin toinen väri ja jos on, tulostat jotain muuta nokkelaa.

7.2. Silmukat

Toinen perusrakenne ohjelmointikielissä on silmukat. Sitä käytetään kun halutaan, että tietokone toistaa jokin asia monta kertaa. Silmukoita on kahdenlaisia:

  • Laskevat silmukat, jotka toistetaan tietyn monta kertaa
  • Ehdolliset silmukat, joita toisteaan kunnes jokin ehto täyttyy

Laskeva silmukka

Laskevat silmukat kirjoitetaan pythonissa käyttäen for-avainsanaa ja siksi niitä sanotaankin for-silmukoiksi. Silmukka vaatii myös nimetyn laskumuuttujan (esimerkissä numero), in-avainsanan ja esim. listan numeroita, jotka silmukan laskumuuttuja saa järjestyksessä yksi toisensa jälkeen. Huomaa myös kaksoispiste rivin lopussa ja uuden lohkon merkiksi tehty sisennys:


In [ ]:
for numero in [1,2,3,4,5]:
    print("Hei", numero)

Tehtävä:

Kirjoita koodinpätkä, joka laskee kertoman (merkitään matematiikassa huutomerkillä !), eli kertoo peräkkäiset numerot keskenään. Esim.

5! = 5*4*3*2*1

Käytä muuttujaa, johon säilöt tuloksen. Pitkien lukulistojen kirjoittaminen on työlästä, joten kannattaa käyttää Pythoniin sisäänrakennettua range(a,b)-funktiota, joka tekee sinulle lukulistan a:sta b:hen. Havainnollistava esimerkki alla:


In [ ]:
list( range(1,5) ) # voit for-silmukassa jättää list(...)-osan pois.

Ehdollinen silmukka

Ehdollinen silmukka pyörii kunnes joku ehto täyttyy (tai jää täyttymättä). Pythonissa tämä on toteutettavissa while(...): rakenteella, missä sulkujen sisään tulee tutkittava ehto ja alle toistettava koodilohko.


In [ ]:
lkm = 1
while (lkm<4):
    print ('toistojen lukumäärä on', lkm)
    lkm = lkm+1

Huomattavaa: on tärkeää, että ehto jää täyttymättä edes joskus, sillä muuten kyseessä on päättymätön silmukka. Niillekin on paikkansa, mutta yleensä ohjelma menee ns. jumiin, jos se jää pyörimään tällaiseen.

Tehtävä:

Käy edellä olevaa esimerkkiä rivi riviltä päässäsi läpi suorittaen sitä tietokoneen lailla askel kerrallaan. Huomioi missä vaihessa muuttujan arvoa kasvatetaan ja missä vaiheessa ehdon tarkastus tehdään.

9. Aliohjelmat

Ajattele keksirepsetiä:

Kumpi on helpompaa, noudattaa reseptiä, vai kysyä äidiltä, että "leipoisitko keksejä"? Ohjelmoinnissa tällainen pyyntö vertautuu aliohjelmakutsuun, sillä aliohjelma on joukko yhteen liittyviä ohjeita paketoituna nimetyksi kokonaisuudeksi.

Tämä on kätevää, sillä vaikka reseptin seuraaminen meiltä onnistuisikin, on pyytäminen huomattavasti helpompaa. Ja asioiden tekeminen helpommin, tehokkaammin ja nopeammin on pitkälti se, mistä ohjelmoinnissa on kyse.

Aliohjelmien syntaksi (eli kirjoitustapa)

Pythoniksi muutettuna tämä kaunis pyyntö saada tuoreita pikkuleipiä voitaisiin ilmaista vaikka näin:

!Python
pikkuleivat = leivo_pikkuleipia(montako_tarvitaan)

Tässä leivo_pikkuleipia on aliohjelman nimi ja montako_tarvitaan on parametri, joka määrää sen kuinka suurelle joukolle (eli kuinka montakertaisen pikkuleipätaikinan) äiti leipoo.

Pythonissa aliohjelmat esitellään def-avainsanaa käyttäen, jonka jälkeen annetaan sille nimi ja sulut. Esittelyrivi päättyy kaksoispisteeseen, ja seuraavalla rivillä on aliohjelman toteutuksen määrittelevä koodilohko, eli aliohjelman runko.

Aliohjelmaa kutsutaan kirjoittamalla sen nimi ja sulut:


In [ ]:
def moikkaa_mua(): # tämä on aliohjelman esittely
    print("moi")
    
moikkaa_mua() # tämä on aliohjelmakutsu

Huomattavaa: esittelyn ja kutsumisen eron ymmärtäminen on hyvin tärkeää. Siis kertauksena: esittelyssä kerrotaan yksityiskohtaisesti miten joku asia tehdään ja kutsuttaessa pyydetään tekemään kyseinen asia!

Aliohjelmalle voidaan lisätä parametreja kirjoittamalla ne sulkujen väliin. Näitä parametrimuuttujia voidaan sitten käyttää aliohjelman lohkon koodissa kuten mitä tahansa muuttujaa. Huomaa, että jos aliohjelmalle on lisätty parametri, tällöin myös aliohjelman kutsussa pitää antaa kyiseiselle parametrimuuttujalle arvo. (suorita alla oleva koodi)


In [ ]:
def moikkaa_kaveria(nimelta): #esittely
    print("moi", nimelta)
    
moikkaa_kaveria("Jussi")

Tehtävä:

Kutsu edellä esiteltyä moikkaa_kaveria-aliohjelmaa niin, että se moikkaa sinua. Esittele sitten uusi aliohjelma, joka ottaa kaksi parametria (parametrit erotetaan toisistaan pilkulla): tervehdyksen ja listan nimiä ja moikkaa kaikkia listassa olevia henkilöitä (kts. for-silmukan ja listan ohjeet yltä, jos et muista miten niitä käytettiin).


In [ ]:
1+2

In [ ]:

Aliohjelmien paluuarvot

Käytämme edelleen pikkuleipiä leipovaa äitiä apuna:

!Python
pikkuleivat = leivo_pikkuleipia(montako_tarvitaan)

Rivin alkuun on nyt lisätty pikkuleivat-muuttuja ja yhtäsuuruusmerkki. Tähän muuttujaan puolestaan sijoitetaan aliohjelman paluuarvo, eli valmistuneet pikkuleivät.

Tässä yhteydessä toinen hyödyllinen tapa ajatella aliohjelmia on tehdasvertaus: Aliohjelma on kuin tehdas, minne menee raaka-aineita sisään (parametrit) ja ulos tulee valmis tuote (paluuarvo). Emme nimittäin ole kiinnostuneita siitä miten tehdas toimii, kunhan se vain tekee sen mitä lupaa.

Aliohjelman esittelyn yhteydessä, sen koodilohkossa, käyttämällä return-avainsanaa, voidaan lopettaa aliohjelma samalla palauttaen jokin arvo. Esimerkiksi näin (suorita alla oleva koodi):


In [ ]:
def tuplaa(numero): #esittely
    return numero*2

tuplaa (4) #kutsu

Tehtävä:

Tuplaa 12 käyttäen tuplaa-aliohjelmaa.

Tai, mitä tapahtuu jos tuplaat oman nimesi? Kokeile.


In [ ]:


In [ ]:

Yhteenveto aliohjelmista

Opimme paljon Pythonin aliohjelmista, mutta kerrataan vielä:

  • Aliohjelmat esitellään def-avainsanalla
  • Aliohjelmia kutsutaan kirjoittamalla sen nimi ja heti nimen perään sulut: kutsun_nimi()
  • Aliohjelmakutsun sulkujen väliin kirjoitetaan mahdolliset parametrien arvot pilkuilla eroteltuna
  • Jos aliohjelma palauttaa paluuarvon, sen voi ottaa talteen muuttujaan yhtäsuuruusmerkillä (sijoitus)
  • Aliohjelman runkolohkossa voi lopettaa aliohjelman suorituksen ja palauttaa paluuarvon return-avainsanalla.

10. Syöte

Syöte on tietoa, jota syötämme ohjelmalle. Tämä tieto voidaan sitten vaikkapa välittää aliohjelmalle tai näyttää se ruuudulla.

Pythonissa on sisäänrakennettu aliohjelma nimeltä input(), joka kysyy käyttäjältä jotain. Esimerkki alla (suorita se ja vastaa kysymyksiin):


In [ ]:
def sano_kohteliaisuus():
    print("Kirjoita nimesi:")
    nimi = input()
    print("Kirjoita lempinumerosi:")
    vari = int(input())
    print( "Hei",nimi+",", vari, "on sitten hyvä numero.")
    
sano_kohteliaisuus()

Tehtävä:

Kirjoita koodi, joka kysyy kaksi numeroa ja laskee ne yhteen.


In [ ]:

11. Modulit

"Pyörää ei kannata keksiä uudelleen" on sanonta, joka pätee erityisen hyvin koodauksessa. Suuri osa yksinkertaisista koodaustehtävistä on jo tehty, ja usein nopein tapa saada asioita aikaan on uudelleenkäyttää jonkun toisen kirjoittamaa ohjelmakoodia.

Pythonin tarjoama ratkaisu tähän on modulit. Voit ajatella modulia vaikka kokoelmana yhteen littyviä aliohjelmia, jotka tekevän jonkin tehtävän tekemisestä helppoa. Ne ovat tavallaan ohjelmoinnin leegopalikoita. Pythonin mukana tulee koko joukko moduleita, tutustutaan alla niistä muutamaan:

Satunnaisen numeron arpominen väliltä 1-100:

>>> import random
>>> print( random.randint(1,100) )

Kellonajan tarkistaminen:

>>> from datetime import datetime
>>> print( datetime.now() )
  • from X import Y tarkoittaa tässä sitä, että haemme datetime modulista vain datetime nimisen "palikan".

Kalenterin tulostaminen:

>>> import calendar
>>> calendar.prmonth(2015, 9)

Huomattavaa: moduleiden sisällä asustavia aliohjelmia ja muita "juttuja" kutsutaan pistenotaatiolla, eli niin, että ensin tulee modulin nimi, sitten piste, sitten kutsuttavan aliohjelman (tai muun "jutun") nimi, ja aliohjelman ollessa kyseessä sulut ja niiden väissä parametrit.

Tehtävä:

Kokeile itse käyttää esimerkkien moduleita kirjoittamalla niiden koodi alle (muistathan, että ">>>" EI ole osa kopioitavaa koodia):


In [ ]:


In [ ]:


In [ ]:

Alla esitellään esimerkkien avulla vielä pari mielenkiintoista modulia. Sisäänrakennettuja moduleita voit selata Pythonin dokumentaation modulilistasta. Lisäksi netti on puolellaan kolmannen osapuolen moduleita, tarpeeseen jos toiseenkin.


In [ ]:
import os
for tiedosto in os.listdir( os.getcwd() ):
    print(tiedosto)

In [ ]:
import urllib.request
py_home = urllib.request.urlopen("http://www.python.org")
print(py_home.read()) #Tulostaa pythonin kotisivun HTML-muodossa.

Tehtävä:

Hyödynnä äsken ja aiemmin oppimaasi ja kirjoita alle peli, joka arpoo satunnaisen numeron (random), ja pyytää sinua arvaamaan sen (print, input) kunnes (while) osut oikeaan. Voit rullailla ylöspäin tätä Notebookia, jos et muista jotain yksityiskohtaa. Jos peli tuntuu liian vaikealta, voit laittaa ohjelman tulostamaan vinkkejä, kuten "luku on pienempi" tai "polttaa".


In [ ]:

12. Kilpikonnagrafiikkaa

Pythonissa on eräs mielenkiintoinen moduli nimeltä turtle, jolla leikimme seuraavaksi. Kyseessä on omassa ikkunassaan asuva kilpikonna, jota ohjaat kirjoittamalla koodia.

Valitettavasti Pythonin sisäänrakennettu kilpikonna ei toimi verkossa olevassa Jupyter-muistilehtiössä (esim. Azure Notebooks), vaan tähän tehtävään tarvitset paikallisen Python-asennuksen. Suositeltavaa on käyttää Anaconda-jakelua. Asennuspaketti eri alustoille (Windows/OSX/Linux) on ladattavissa oheisen linkin takaa.

Kun olet asentanut Anacondan ja avannut tämän ipynb-tiedoston siellä, meillä on toimiva kilpikonna. Pistetäänhän se liikkeelle!


In [ ]:
import turtle
turtle.reset()

#Kirjoita kilpikonnan ohjauskoodi tähän
turtle.fd(100)

turtle.Screen().mainloop()

Jos saat virheilmoituksen, jokin meni pieleen, eikä Jypyter-ympäristö asentunut tai käynnistynyt koneellasi oikein. Tarkista, että olet käynnistänyt Jupyter Notebook -palvelimen käynnistysvalikosta ja että selain on aukaissut seuraavan sivun: http://127.0.0.1:8888

Kun ajat kodin kilpikonna vain kököttää paikallaan. Pistetään siihen vähän liikettä. ENSIN KUITENKIN SULJE AUENNUT KILPIKONNAIKKUNA RUKSISTA. JOS ET TEE TÄTÄ, ET NÄE MUUTTUNEEN KOODIN VAIKUTUKSIA.

Alla joitain "temppuja", mitä kilpikonna osaa:

turtle.forward(10) # kilppari kulkee eteenpäin annetun määrän askelia
turtle.right(45) # kilppari kääntyy annetun määrän asteita oikealle
turtle.left(90) # kilppari kääntyy annetun määrän asteita oikealle

Tehtävä:

Käytä näitä kolmea käskyä ja silmukoita tuottaaksesi erilaisia toinen toistaan villimpiä kuvioita. Voit kirjoittaa koodin yllä olevaan runkoon. Huom: Komennot ovat myös lyhennettävissä fd, rt, lt jne.

Jos jäit koukkuun, Pythonin turtle-modulin dokumentaatiosta voit lukea mitä kaikkia temppuja Python-kilppari osaa. Voit mm. vaihtaa ikkunan taustaväriä, kilpikonnan muotoa, viivan paksuutta ja väriä jne.

Lisätehtävä:

Dokumentaatiota lukemalla paljastuu, että kilpikonnaikkunan kautta voi lukea hiiren ja näppäimistön painalluksia. Tämä mahdollistaa jo vaikka mitä! Kokeile mitä alla oleva koodi tekee ja jatkokehitä koodia vaikka peliksi asti!


In [ ]:
from mobilechelonian import Turtle
t = Turtle()

def painettu_ylos():
    t.setheading(90)
    t.forward(20)
    
def painettu_alas():
    t.setheading(-90)
    t.forward(20)
    
def painettu_vasemmalle():
    t.setheading(180)
    t.forward(20)
    
def painettu_oikealle():
    t.setheading(0)
    t.forward(20)
    
# Kiinnitetään näppäimenpainallukset edellä oleviin aliohjelmiin
#  kun näppäintä painetaa, aliohjelmaa kutsutaan.
screen = turtle.Screen()
screen.onkey(painettu_ylos, "w")
screen.onkey(painettu_vasemmalle, "a")
screen.onkey(painettu_alas, "s")
screen.onkey(painettu_oikealle, "d")
screen.listen()
screen.mainloop()

Onneksi olkoon, olet nyt oppinut pythonin perusteet ja sitä mukaa kun otat edellä oppimaasi haltuun, voit rakentaa aina vain isompia ja hienompia juttuja. Ai mitä vai? Alla joitain esimerkkejä. Huomaa kuitenkin, että vain osa näistä toimii Jupyter-ympäristössä, joka on tarkoitettu paremminkin tieteelliseen käyttöön ja automaattiseen tietojenkäsittelyyn. Suositeltavaa onkin sovellusten tai kuvan ja äänen kanssa työskennellessä käyttää kehitysympäristöä kuten Visual Studio Code. Sen ja modulien avulla:

  • Voit kirjoittaa pelejä (googleta "pygame-zero")
  • Toistaa ja tehdä musiikkia ja videoita (googleta "pymedia")
  • Rakentaa verkkosivuja ja -sovelluksia (googleta "python flask")
  • Rakentaa mobiilisovelluksia ja -pelejä (googleta "kivy")
  • Tehdä matematiikan, fysiikan ja muiden aineiden kotitehtäviä (googleta "scientific python" tai "<opetettavan aiheen englanninkielinen avainsana tähän> python")

Tämä on mahdollista, koska lähes kaikkeen löytyy Python -moduli:


In [ ]: