keskiviikko 28. syyskuuta 2016

5. Python IV

Toistorakenteet

Ehtorakenteiden avulla ohjelma voi suorittaa valikoivasti koodirivejä, mutta ohjelman suoritus etenee silti koko ajan rivejä alaspäin. Toistorakenteet antavat ohjelmalle mahdollisuuden suorittaa samoja rivejä monta kertaa peräkkäin. Nyt jos ohjelman täytyy tehdä monta kertaa sama asia, tarvittava koodi riittää kirjoittaa kerran.
Python-kielen toistorakenteet ovat while-silmukka, jossa ohjelma toistaa samaa koodia niin kauan, kuin jokin ehto on voimassa, sekä for-silmukka, jossa ohjelma käy läpi joukon tietoja ja suorittaa jokaisen kohdalla saman koodin. Tämä opas esittelee molemmat toistorakenteet, vaikka for-silmukka pääsee täysiin oikeuksiinsa vasta seuraavissa oppaissa listojen ja merkkijonojen käsittelyssä.

while-silmukka

Seuraava ohjelma kysyy käyttäjältä tunnussanaa, kunnes käyttäjä antaa oikean tunnussanan "python".

Ohjelman tulostus voi olla seuraava:
Kirjoita tunnussana: kissa
Kirjoita tunnussana: putka
Kirjoita tunnussana: python
Tervetuloa!
Ohjelmassa on while-silmukka, jonka alussa on totuusarvomuotoinen ehto. Tässä ehto sana != "python" tarkoittaa, että ohjelma toistaa silmukkaa niin kauan, kuin tunnussana ei ole oikein. Jokaisella silmukan kierroksella ohjelma kysyy käyttäjältä tunnussanaa, ja kun käyttäjä antaa oikean tunnussanan, silmukan ehto ei ole enää voimassa ja silmukka päättyy.
Esimerkissä ohjelman suoritus etenee seuraavasti:
  1. Muuttuja sana saa alkuarvon "".
  2. Ohjelma saapuu silmukkaan.
  3. Ehto sana != "python" pätee ja ohjelma suorittaa silmukan koodin.
  4. Silmukassa sana saa arvon "kissa".
  5. Ohjelma palaa silmukan alkuun.
  6. Ehto sana != "python" pätee ja ohjelma suorittaa silmukan koodin.
  7. Silmukassa sana saa arvon "putka".
  8. Ohjelma palaa silmukan alkuun.
  9. Ehto sana != "python" pätee ja ohjelma suorittaa silmukan koodin.
  10. Silmukassa sana saa arvon "python".
  11. Ohjelma palaa silmukan alkuun.
  12. Ehto sana != "python" ei päde ja silmukka päättyy.

for-silmukka

Seuraava ohjelma tulostaa lukujen 0–9 neliöt eli luvut korotettuna toiseen potenssiin. Esimerkiksi luvun 5 neliö on 25, koska 52 = 5 * 5 = 25.
Ohjelman tulostus on seuraava:
Luvun 0 neliö on 0
Luvun 1 neliö on 1
Luvun 2 neliö on 4
Luvun 3 neliö on 9
Luvun 4 neliö on 16
Luvun 5 neliö on 25
Luvun 6 neliö on 36
Luvun 7 neliö on 49
Luvun 8 neliö on 64
Luvun 9 neliö on 81
Ohjelmassa on for-silmukka, joka käy läpi joukon tietoja ja suorittaa joka tiedon kohdalla saman koodin. Tässä range(10) tarkoittaa, että silmukka käy läpi kymmenen ensimmäistä kokonaislukua nollasta alkaen. Jokaisella silmukan kierroksella muuttuja i saa arvokseen käsiteltävän kokonaisluvun.
Esimerkissä ohjelman suoritus etenee seuraavasti:
  1. Muuttuja i saa arvon 0.
  2. Ohjelma suorittaa silmukan sisällä olevan koodin.
  3. Muuttuja i saa arvon 1.
  4. Ohjelma suorittaa silmukan sisällä olevan koodin.
  5. Muuttuja i saa arvon 2.
  6. Ohjelma suorittaa silmukan sisällä olevan koodin.
  7. (jne.)
Lukuväliin liittyy kolme parametria: mistä luvusta silmukka alkaa, minkä luvun kohdalla silmukka päättyy ja kuinka paljon luku kasvaa silmukan kierroksen jälkeen. Oletuksena silmukka alkaa nollasta ja luku kasvaa yhdellä kierroksen jälkeen. Seuraavassa on esimerkkejä lukuväleistä:
merkintälukuväli
range(10)0, 1, 2, 3, 4, 5, 6, 7, 8, 9
range(5, 15)5, 6, 7, 8, 9, 10, 11, 12, 13, 14
range(-6, 3)-6, -5, -4, -3, -2, -1, 0, 1, 2
range(24, 16, -1)24, 23, 22, 21, 20, 19, 18, 17
range(3, 20, 2)3, 5, 7, 9, 11, 13, 15, 17, 19
range(35, 4, -4)35, 31, 27, 23, 19, 15, 11, 7
Opassarjan seuraavissa osissa nähdään, mitä muuta for-silmukalla voi tehdä kuin käydä läpi lukuvälejä.

Keskeytys

Tunnussanan kysymisen voi toteuttaa myös seuraavasti:


Tässä silmukan alussa on ehto True, joka on aina tosi eikä rajoita silmukan toistamista. Kuitenkin silmukan sisällä komento break keskeyttää silmukan, jos käyttäjä antaa oikean tunnussanan. Silmukan toimintatapa on siis ennallaan, mutta ehdon sijainti poikkeaa aiemmasta.
Komentoa break voi käyttää kaikissa silmukoissa: while-silmukassa se keskeyttää silmukan, vaikka alkuehto olisi voimassa, ja for-silmukassa se keskeyttää silmukan, vaikka kaikkia tietoja ei olisi vielä käsitelty.

Uusi kierros

Seuraava ohjelma tulostaa parittomien lukujen neliöitä:
 Ohjelman tulostus on seuraava:
Luvun 1 neliö on 1
Luvun 3 neliö on 9
Luvun 5 neliö on 25
Luvun 7 neliö on 49
Luvun 9 neliö on 81
Tässä silmukan sisällä on komento continue, joka siirtyy silmukassa uudelle kierrokselle, jos käsiteltävä luku on parillinen. Komennon vaikutuksesta silmukan loppuosa jää suorittamatta, jos luku on parillinen, eli silmukka tulostaa vain parittomien lukujen neliöt.
Komentoa continue voi käyttää kaikissa silmukoissa: while-silmukassa se palaa silmukan alkuun ehdon tarkistukseen, ja for-silmukassa se palaa silmukan alkuun ja siirtyy seuraavan tiedon käsittelyyn.

Esimerkki: Suorakulmiot

Seuraava ohjelma tulostaa suorakulmioita käyttäjän ohjeiden mukaisesti:
Ohjelman tulostus voi olla seuraava:
Korkeus: 4
Leveys: 5
*****
*****
*****
*****
Haluatko jatkaa (k/e)? k
Korkeus: 2
Leveys: 10
**********
**********
Haluatko jatkaa (k/e)? k
Korkeus: 6
Leveys: 3
***
***
***
***
***
***
Haluatko jatkaa (k/e)? e
Ohjelman pääsilmukka on while-silmukka, jonka jokaisella kierroksella ohjelma tulostaa yhden suorakulmion for-silmukan avulla. Ensimmäinen for-silmukka tulostaa yhden suorakulmion rivin, ja toinen for-silmukka tulostaa yhden rivillä olevan merkin.

Esimerkki: Luvun tekijät

Luvun jakaminen tekijöihin tarkoittaa, että luku esitetään kertolaskuna, jossa olevia lukuja (tekijöitä) ei voi enää jakaa osiin. Toisin sanoen luku esitetään alkulukujen tulona. Esimerkiksi luvun 15 tekijät ovat 3 ja 5, koska 3 * 5 = 15, ja luvun 44 tekijät ovat 2, 2 ja 11, koska 2 * 2 * 11 = 44. Luku 31 on alkuluku, joten sitä ei voi jakaa osiin.
Seuraava ohjelma jakaa annetun luvun tekijöihin:
Seuraavassa on muutamia ohjelman tulostuksia:
Anna luku: 15
3 * 5

Anna luku: 44
2 * 2 * 11

Anna luku: 31
31
Ohjelma käy läpi mahdollisia luvun tekijöitä 2:sta alkaen. Jokaisen tekijän kohdalla luku jaetaan tekijällä ja tekijä tulostetaan, kunnes luku ei ole enää jaollinen tekijällä. Ohjelma päättyy, kun kokeiltava tekijä on lukua suurempi. Käytännössä tällöin luku on jakolaskujen seurauksena 1.

Esimerkki: Viljanjyvät

Tarinan mukaan shakkipelin keksijä pyysi palkkiokseen yhden viljanjyvän shakkilaudan ensimmäiseen ruutuun, kaksi toiseen ruutuun, neljä kolmanteen ruutuun, kahdeksan neljänteen ruutuun jne., siis joka ruutuun kaksinkertaisen määrän jyviä edelliseen ruutuun verrattuna.
Seuraava ohjelma laskee, kuinka monta viljanjyvää shakkilaudan kuhunkin ruutuun tulisi ja kuinka monta viljanjyvää shakkilaudalla olisi yhteensä.
 Ohjelman tulostus on seuraava:
Ruudussa 1 on 1 jyvää
Ruudussa 2 on 2 jyvää
Ruudussa 3 on 4 jyvää
Ruudussa 4 on 8 jyvää
... (välissä rivejä)
Ruudussa 61 on 1152921504606846976 jyvää
Ruudussa 62 on 2305843009213693952 jyvää
Ruudussa 63 on 4611686018427387904 jyvää
Ruudussa 64 on 9223372036854775808 jyvää
Yhteensä 18446744073709551615 jyvää
Shakkipelin keksijän palkkiota ei pystytty koskaan maksamaan, koska koko maailmassa ei ole näin monta viljanjyvää.

torstai 15. syyskuuta 2016

4. Python III

Totuusarvo

Totuusarvo on joko tosi (True) tai epätosi (False): jokin asia pitää paikkansa tai ei pidä paikkaansa. Esimerkiksi "pistemäärä on yli 1000" ja "pelaajan nimi ei ole Einari" vastaavat totuusarvoja, jotka voivat olla ohjelman yhdellä suorituskerralla tosia ja toisella suorituskerralla epätosia. Jos pelaajalla on 1500 pistettä ja hänen nimensä on Einari, ensimmäinen totuusarvo on tosi mutta toinen totuusarvo on epätosi.
Totuusarvoja tuottavat vertailut, joissa tarkistetaan, ovatko kaksi lukuarvoa tai merkkijonoa samat tai mikä on niiden suuruusjärjestys tai aakkosjärjestys:
vertailumilloin tosi?
X == YX on sama kuin Y
X != YX ei ole sama kuin Y
X < YX on pienempi kuin Y
X <= YX on pienempi tai sama kuin Y
X > YX on suurempi kuin Y
X >= YX on suurempi tai sama kuin Y
Merkinnän != sijasta voi käyttää myös merkintää <>. Jos vertailussa ovat lukuarvot, "pienempi" ja "suurempi" tarkoittavat lukujen suuruusjärjestystä. Jos vertailussa ovat merkkijonot, "pienempi" ja "suurempi" tarkoittavat merkkijonojen aakkosjärjestystä, joka riippuu siitä, missä järjestyksessä merkit ovat käytetyssä merkistössä.


  • Anna muuttujille "nimi" ja "vuosi" eri arvot ja tulosta totuusarvoja erilaisista vertailuista. Kts. koodi lopussa.
Koodissa vertailut nimi != "Antti", vuosi >= 1672 ja nimi > "Antti" ovat tosia, koska nimi ei ole Antti, vuosi on ainakin 1672 ja nimi on aakkosissa Antin jälkeen. Vertailut vuosi == 1726 ja vuosi < 1600 ovat epätosia, koska vuosi ei ole 1726 ja vuosi ei ole myöskään alle 1600.
Useamman vertailun voi tehdä myös peräkkäin, jolloin tulos on tosi, jos kaikki yksittäiset vertailut toteutuvat.

  • Anna muuttujille a ja b arvot ja vertaile niitä vertailuilla seuraavasti 0 < 1 < 2 on tosi, koska 0 < 1 on tosi ja 1 < 2 on tosi. Vertailu a < b < 1 on epätosi, koska b < 1 on epätosi. Vertailu a < b == 0 on tosi, koska a < b on tosi ja b == 2 on tosi. (Kts.koodi)

Ehtorakenne

Ehtorakenne muuttaa ohjelman suoritusta sen mukaan, onko jokin totuusarvo tosi vai epätosi eli pitääkö jokin ehto paikkansa vai ei. Seuraava ohjelma tervehtii käyttäjää vain, jos hänen nimensä on  Ehtorakenteen aloittaa if-sana, jonka jälkeen tulee totuusarvomuotoinen ehto. Jos ehto on tosi, ohjelma suorittaa ehtorakenteen sisällä olevat rivit. Muuten ohjelma hyppää ehtorakenteen yli. Tässä ehto on tosi, jos nimi on Henrikki, ja muuten epätosi.'
  • Tee ohjelma, joka tervehtii käyttäjää vain jos hänen nimensä on Henrikki.
Erilaiset tulostukset voisivat olla:
Nimi: Antti
Ei muuta...
Nimi: Henrikki
Hoi, sankari!
Minne matka?
Ei muuta...

Python tunnistaa ehtorakenteen sisällä olevat rivit siitä, että ne on sisennetty eli niiden edessä on ylimääräistä tyhjää. Ohjelmoijan päätettävissä on, kuinka paljon tyhjää rivien edessä on, kunhan kaikkien ehtorakenteessa olevien rivien edessä on yhtä paljon tyhjää.

Lisää ehtoja

Seuraava ohjelma tervehtii Henrikkiä eri tavoin kuin muita. Ohjelma sanoo Henrikille "Hoi, sankari!" ja kaikille muille "Hellurei!". Nyt ehtorakenteen loppuun lisätään else-osa, jonka ohjelma suorittaa, jos alussa oleva ehto ei ole tosi.

Tässä ovat ohjelman erilaiset tulostukset:
Nimi: Henrikki
Hoi, sankari!

Nimi: Antti
Hellurei!

Sitten ehtorakenteen laajin muoto: Ohjelma suorittaa ensimmäisen if- tai elif-osan, jota vastaava ehto on tosi. Jos mikään ehto ei ole tosi, ohjelma suorittaa else-osan.
  • Seuraava ohjelma tekee omat tervehdykset Henrikille, Antille ja Uoleville. Kaikkia muita ohjelma tervehtii samalla tavalla. 
Tässä ovat ohjelman erilaiset tulostukset:
Nimi: Henrikki
Hoi, sankari! 
Nimi: Antti
Morjens! 
Nimi: Uolevi
Tsaukki! 
Nimi: Justiina
Hellurei!
Ehtorakenteesta voi aina puuttua else-osa, jolloin ohjelma ei tee mitään, jos mikään ehto ei ole tosi.

Totuusarvojen yhdistys

Totuusarvoja voi yhdistää toisiinsa seuraavin merkinnöin:
yhdistysmilloin tosi?
A and B    A on tosi ja B on tosi
A or BA on tosi tai B on tosi
not AA ei ole tosi
Ehtorakenteessa yhdistyksen and avulla voi tarkistaa, päteekö monta ehtoa yhtä aikaa, ja yhdistyksen or avulla voi tarkistaa, päteekö ainakin yksi ehdoista.
  • Seuraavan ohjelman pitäisi tarkistaa, ovatko käyttäjän tunnus ja salasana oikein: Ohjelma tulostaa "Oikein!", jos tunnus on "antti" ja salasana on "abc".
  • Seuraavaksi tee ohjelma, joka tarkistaa käyttäjän iän ja tulostaa "Mahdotonta!", jos käyttäjä on alle 0 vuotta tai yli 120 vuotta.

Jos totuusarvo on monimutkainen, sulkujen avulla voi varmistaa, että Python tulkitsee sen oikein. Esimerkiksi on vaikeaa tietää, miten Python tulkitsee totuusarvon tunnus == "antti" and salasana == "abc" or suojaus == 0. Sulkujen avulla pystyy erottamaan mahdolliset tulkinnat:
  1. (tunnus == "antti" and salasana == "abc") or suojaus == 0
  2. tunnus == "antti" and (salasana == "abc" or suojaus == 0)
Ensimmäisessä tapauksessa riittää, että tunnus ja salasana ovat oikein tai suojaus on 0. Toisessa tapauksessa ensinnäkin tunnuksen täytyy olla oikein ja lisäksi salasanan täytyy olla oikein tai suojauksen täytyy olla 0.

Tietokilpailu

  • Tee tietokilpailupeli, joka kysyy käyttäjältä kysymyksiä. Jokaisesta oikeasta vastauksesta saa pisteen, ja ohjelma ilmoittaa lopuksi pistemäärän.
Ohjelmassa muuttuja pisteet on laskurimuuttuja, jonka arvo on aluksi nolla ja jonka arvo kasvaa yhdellä aina, kun käyttäjä vastaa kysymykseen oikein.
Lyhennys pisteet += 1 tarkoittaa samaa kuin pisteet = pisteet + 1.
Vastaavaa merkintää voi käyttää myös muiden laskutoimitusten kanssa.
Ohjelman tulostus voisi olla seuraava:

Tervetuloa tietokilpailuun!
Kuinka monta sekuntia on tunnissa?
3600
Oikein!
Minä vuonna J. Sibelius kuoli?
1957
Oikein!
Mikä on Bulgarian pääkaupunki?
Plovdiv
Väärin!
Peli loppui!
Pisteet: 2

Arvaaja

  • Tee ohjelma, joka arvaa käyttäjän ajatteleman viikonpäivän. Ohjelma kysyy korkeintaan kolme kyllä/ei-kysymystä.

Ohjelman tulostus voi olla seuraava:

Ajattele jotain viikonpäivää!
Onko viikonpäivän nimessä n-kirjain (k/e)? e
Onko viikonpäivän nimessä k-kirjain (k/e)? e
Onko viikonpäivän nimessä r-kirjain (k/e)? k
Viikonpäivä on torstai!
 
Ohjelman toiminta perustuu seuraavaan päättelykaavioon:



Ohjelma sisältää paljon sisäkkäisiä ehtorakenteita, joissa liikutaan sen mukaan, mitä vastauksia käyttäjä antaa kysymyksiin. Ohjelman täytyy tulostaa monessa kohdassa melkein samanlainen kysymys, minkä vuoksi kysymyksen alkuosa ja loppuosa haetaan muuttujista. Kuten ohjelmasta näkyy, input-funktion tulos voi olla suoraan osana ehtoa.






torstai 8. syyskuuta 2016

3. Python II

Yritä tehdä seuraavien ohjeistusten (ja opettajan tunnin alun ohjeiden mukaan) avulla koodit jotka tekevät pyydetyt asiat. Tee kaikki yhteen ja samaan python-tiedostoon. Lopuksi ota vielä viimeisestä ohjelman suorituksesta ruudunkaappauskuva suoritusikkunasta ja jaa se blogiisi. Python-kooditiedosto OneDrive-kansioonsa.


Näytölle tulostaminen
  • Komennolla print tulostetaan näytölle
  • Esim. print("Tämä tulostuu!")
  • Tee koodi, joka tulostaa "Ohjelmointi on hauskaa!"
  • Tee toinen koodi, jossa annat muuttujille lukuarvot ja viime tunnin ohjeiden mukaan tulostat lukujen arvot.
  • Tee kolmas koodi, jossa annat muuttujille lukuarvot ja tulostat luvut ja lukujen summan.

Näppäimistön lukeminen
  • Komennolla input voi pyytää käyttäjää antamaan tietoja ohjelmalle
  • Vastaus palautetaan aina merkkijonona, vaikka käyttäjä antaisikin luvun
  • Tee koodi, joka kysyy käyttäjän nimen ja tulostaa "Hei NIMI"


Tyyppimuunnokset
  • input-käsky palauttaa käyttäjän syötteen aina merkkijonona, joten ennen kuin käyttäjältä saatuja tietoja voi käyttää laskutoimituksissa, tulee tehdä tyyppimuunnos merkkijonosta luvuksi
  • float on desimaaliluku ja int kokonaisluku
  • Tee koodi joka kysyy luvun ja tulostaa luvun kaksinkertaiseksi kerrottuna


Vakiot
  • Vakio on ohjelmassa kiinteästi määritelty arvo, jolle on annettu sitä kuvaava nimi eikä sen arvoa muuteta.
  • Vakiot tekevät koodista helpommin ymmärrettävää.
  • Sen sijaan, että kirjoittaisi saman lukuarvon useaan kohtaan koodia, voi käyttää vakion nimeä.
  • Vakioiden nimet kirjoitetaan isoilla kirjaimilla.
  • Esim. KILOHINTA
  • Tee koodi, joka saa vakiona kilohinnan ja pakkauskulut ja kysyy painon. Tulosteena koodi antaa tuotteen hinnan (paino*kilohinta+pakkauskulut).

Luovuutta!
  • Nyt kokeile luoda jokin yksinkertainen tuotos itse. 
  • Ohjelman pitäisi kysyä käyttäjältä jotakin lukua ja merkkijonoa ja tulostaa niitä tai niiden kerrannaisia. Käytä myös vakioita.

Alla kuvassa on yhdenlaiset mallisuoritukset, omien koodiesi ei tarvitse olla täsmälleen samanlaiset, mutta kuvan koodi voi antaa vinkkejä suoritukseen.



torstai 1. syyskuuta 2016

2. Python I

Aloitetaan Python-koodausta.

Käynnistä IDLE opettajan ohjeiden mukaan. Jos teet tätä kotona niin englanninkieliset ohjeet asennukseen ja aloitukseen löytyy (esim. täältä luvusta 1) ja itse asennuspaketti löytyy (täältä).

Aloitetaan testailu.
Kokeile Pythonin komentorivillä erilaisia laskutoimituksia kirjoittamalla lasku ja painamalla enter, esim.

  • 1+2
  • 3*4
  • 15/3
  • 15/5+2*5
Sitten kokeile antaa jollekin muuttujalle arvo ja käyttää sitä, testaile esim. seuraavia syötteitä
  • luku=10
  • luku
  • luku*3
  • luku*2+luku/5
  • luku
  • luku=13
  • luku

Huomasit, että kun annat muuttujalle uudelleen arvon, vaihtuu muuttujassa oleva arvo uudeksi.
Testaapa seuraavia ja mieti mitä tapahtuu...
  • luku=5
  • luku=luku+5
  • luku=luku*10
  • munat=3
  • pekoni=5
  • makkara=2
  • munakas=munat+pekoni+makkara

Osaatko arvata mitä tulee tulostukseksi nyt kun kirjoitat
  • luku
  • munakas
Seuraavaksi onkin aika sitten testailla tekstin kanssa. Merkkijono (string) annetaan Pythonissa heittomerkkien välissä. Tekstijonoja voidaan liittää toisiinsa, käyttää muuttujissa ja kun otetaan vielä mukaan tekstiä tulostava print-käsky niin voidaan liittää tulostukseen muutakin. Testaapa...
  • 'Testinki!'
  • 'Testaaminen ' + 'on tylsää!'
  • lause='Tämä on päälause'
  • konjunktio=', johon'
  • sivulause=' voidaan liittää sivulause.'
  • virke=lause+konjunktio+sivulause
  • virke
  • print('Tässä luku ',pekoni,' voidaan laskea yhteen luvun ',8,' kanssa ja tulokseksi saadaan ',pekoni+8,'!')
Ota nyt ruudunkaappaus/näytönkuva "Python 3.5.2 Shell"-ikkunasta. Valitsemalla se aktiiviseksi ja painamalla alt+printscreen.
Liitä kuva blogiisi ja kirjoita saatteeksi pari sanaa siitä miltä Python vaikuttaa.
Tee Office365-OneDriveesi itsellesi Python-koodeja varten kansio, anna nimeksi vaikka "omanimi_pythonit". Jaa kansio opettajalle. Jatkossa kaikki Python-koodaukset tallennetaan tuohon kansioon ja ne ovat kerralla kaikki opettajan saatavilla kun kansio on jaettuna.