A Visual Introduction to Python 3
Tavoitteet:
Kerrata Python-kielen rakenteita visuaalisesti havainnollistaen. Otsikko on nimetty Trinket.io -sivuston opastuksen mukaan, jota seurataan tällä oppitunnilla. Tästä linkistä pääsee kurssille. Noudata kuitenkin järjestelmällisesti tätä sivua, josta ohjataan tilanteen mukaan mainitulle sivustolle.
Onnistuminen harjoituksissa edellyttää tehtävien systemaattista läpikäyntiä ja keskittymistä ymmärtämään, mitä missäkin kohdassa koodia tapahtuu.
Tarkennettuna tavoitteena tällä tunnilla on kerrata ja syventää osaamista seuraavissa asioissa:
Funktiot
funktiot ilman parametria
funktion parametrit
(myöhemmin myös funktion paluuarvo)
Funktioiden tarkoitus selkeyttää ohjelmiston rakennetta ja välttää toistoa
Voinet arvata, että kehittyneemmät ohjelmat sisältävät satoja, tuhansia ja jopa huomattavasti enemmän rivejä. Tällaista ohjelmaa ihmisen ja varsinkaan työryhmän eli useamman ihmisen on vaikea hallita ja hahmottaa ellei ohjelmaa jaeta osiin.
Ohjelmaa kannattaa ruveta jakamaan osiin viimeistään silloin, kun koodi alkaa olla yhden näyttöruudun kokoinen.
Ensimmäinen tällainen osiin jakaminen on funktioiden käyttäminen.
Funktio on siis oma, itsenäinen osa ohjelmasta.
Hyvä funktio on myös toiminto, jossa tapahtuu yksi asia. Esimerkiksi neliön piirtäminen.
Funktion merkitseminen Pythonissa
Funktio aloitetaan sanalla def
Sitä seuraa funktion nimi. Funktion nimen kannattaa olla kuvaava. Myös suomen kielen käyttö on ok, kun ryhmäläiset ovat suomenkielisiä.
Nimeämisessä kannattaa käyttää ns. CamelCase-tyyliä. Trinketin oppimateriaalissa on malli, jossa funktio on nimetty first_function. Parempi tyyli olisi firstFunction.
Funktion nimeä seuraa sulkeet, joiden sisällä saattaa olla parametreja. Parametrien avulla välitetään erityyppisiä arvoja funktiota kutsuttaessa. Näitä arvoja hyödynnetään funktiota suoritettaessa.
def firstFunction(): Funktion nimeltään firstFunction. Funktiolla ei ole parametreja.
def piirraNelio(sivunPituus): Funktio nimeltään piirraNelio. Funktion parametrina on sivunPituus, jolle funktiota kutsuttaessa annetaan arvo
Kokeile seuraava koodi
Varmista, että huomaat millä tavoin seuraava koodi on erilainen kuin edellinen koodi
Harjoitus 1
Tavoite: Laatia oma funktio. Funktion kutsussa ei välitetä parametria. Siis sulkeet ovat tyhjät.
Tehtävä: Laadi funktio nimeltään tervehdiMaailmaa. Sen tulee tulostaa teksti "Terve maailma!"
Lisää ohjelmaan myös funktion kutsu, jotta voit testata funktion toiminnan.
Vihje: Täydennä seuraava koodi puuttuvilta osin.
def tervehdiMaailmaa():
# Lisää tähän komento, joka tulostaa "Terve maailma!"
# Seuraavassa kutsutaan funktiota
tervehdiMaailmaa()
Harjoitus 2
Tavoite: Laatia oma funktio. Funktion kutsussa välitetään parametri. Parametri annetaan sulkeissa.
Tehtävä: Laadi funktio nimeltään tervehdi. Sen tulee tulostaa esimerkiksi teksti "Terve Jukka", mikäli funktiota on kutsuttu parametrilla Jukka. Lisää siis ohjelmaan myös funktion kutsu esimerkiksi tervehdi("Jukka"). Tarvitset funktion kutsuun parametrin välittääksesi nimen funktiolle .
Vihje: Täydennä seuraava koodi puuttuvilta osin.
def tervehdi(nimi):
# Lisää tähän komento, joka tulostaa "Terve Jukka". Sanaa Jukka ei saa käyttää komennossa, vaan käytä sanaa nimi.
# Kutsutaan funktiota (esimerkiksi nimellä Jukka)
Lisätehtävä: Kysy nimi käyttäjältä. Käytä siis input -komentoa.
Harjoitus 3
Tavoite: Parametrin välittäminen
Tehtävä: Muuta aiempaa esimerkkikoodia kolmion piirtämisestä.
import turtle
tina=turtle.Turtle()
tina.shape('turtle')
tina.color('purple')
def triangle(otus):
otus.left(60)
otus.forward(30)
otus.left(120)
otus.forward(30)
otus.left(120)
otus.forward(30)
triangle(tina)
Lisää parametri, joka ilmoittaa sivun pituuden. Funktion kutsu on silloin esimerkiksi triangle(otus, 50), jolloin piirretään tasasivuista kolmiota. Sivun pituus on tällöin 50.
Lisätehtävä: Kysy käyttäjältä sivun pituus (input). Ohjelma piirtää sitten kyseisen suuruisen kolmion. Toisin sanoen luku 50 tulee korvata muuttujalla. Muuttujan nimi olkoon sivunPituus.
Vihje: Huomaa, että sivunPituus on kokonaisluku-tyyppinen eli int.
sivunPituus = int(input("Anna sivun pituus "))
Harjoitus 4
Tavoite: Parametrin välittäminen
Tehtävä: Laadi funktio piirraNelio(otus, sivunPituus, viivanVari, tayttovari, x, y)
otus on parametrina välitettävä viittaus olioon
sivunPituus on neliön sivun pituus
viivanVari on viivan väri
tayttovari on neliön täyttöväri
x on lähtöpisteen x-koordinaatti neliön vasemmassa alakulmassa
y on lähtöpisteen y-koordinaatti neliön vasemmassa alakulmassa
Huomaa myös, ettei kynä saa olla alhaalla, kun funktiossa siirrytään vasempaan alakulmaan.
Laadi sitten muutama kutsu, joilla testaat erilaisten neliöiden piirtämistä eri kohtiin piirtoalustalla. Esimerkiksi:
piirraNelio(tina, 50, "red", "blue", 100, 140)
piirra Nelio(tina, 20, "black", "green", -150, -80)
Vihje: Aiemmin piirrettiin kolmio. Kopioi kyseinen koodi ja muuta se ensin siten, että saat piirrettyä jonkinlaisen neliön.
HUOMAA: Toteuta koodi vaiheittain. Tee yksi asia kerrallaan kuntoon. Eli koodaa yksi asia ja testaa se. Täydennä koodia yksi osa kerrallaan!
Vaativa Lisätehtävä:
Laadi tikkapeli. Tai oikeastaan kyse on laivan upotuksesta, jossa tietokone arpoo 40 x 40 pikseliä kokoisen neliön sijainnin 100 x 100 kokoiselle alueelle (molemmat arvot ovat 0 - 99).
Käyttäjän tehtävä on arvata, mihin ohjelma on arponut kyseisen neliön. Ohjelmaa kysyy siis käyttäjältä koordinaattiparin.
Ohjelma tulostaa sen jälkeen näyttöön neliön ja tikkaa symbolisoivan pienen ympyrän (säde esimerkiksi 4).
Arvio osumisesta paljastuu siis visuaalisesti eli näytöltä näkee, osuiko tikka neliöön vain ei.
Lisätehtävän lisätehtävä on se, että ohjelma tarkistaa, osuiko koordinaattipiste neliön sisään ja antaa käyttäjälle vastauksen 'Osui!' tai 'Ohi!'
Funktion paluuarvo
Kenties olet juuri opiskellut matematiikassa funktioista. Voimme laatia matemaattisen funktion, jolloin on luontevaa, että funktio palauttaa arvon.
Tällöin funktion rakenne voi olla seuraavanlainen:
def funktionNimi(muuttuja1, muuttuja2, jne.):
# funktio tekee jotain käyttäen parametreina välitettyjä muuttujien arvoja
return funktionArvo
Tutki esimerkkejä:
Tunnista seuraavaan koodiin tehty muutos
Ja selvitä se itsellesi! Tämä on hyödyllistä ja tärkeää huomata.
Huomasithan, että laskutoimitus tehtiin return-komennon yhteydessä:
return 2 * 3.1416 * sade
Harjoitus 5
Laadi funktio, joka palauttaa ympyrän kehän pituuden, kun syötteeksi annetaan ympyrän halkaisijan pituus.
Laadi myös ympäristö, jossa voit käyttää funktiota. Siis vastaavasti kuten aiemmat esimerkit.
Vihje: Kopioi aiempi koodi, joka on myös tässä alla:
# Funktio laskee kehän pituuden
# Parametrina annetaan muuttujan sade arvo
# Funktio palauttaa kehän pituuden
def ympyranKehanPituus(sade):
return 2 * 3.1416 * sade
print "Lasken ympyrän kehän pituuden, kun annat säteen."
print "Muista, että piste on nyt desimaalierottimena!"
sade = float(input("Anna säteen pituus: ")) # Luetaan käyttäjän syöte ja muutetaan se liukuluvuksi (float)
kehanPituus = ympyranKehanPituus(sade)
print kehanPituus
Muuta sitten koodia siten, että kehän pituus lasketaankin halkaisijan avulla.
Harjoitus 6
Laadi funktio, joka palauttaa ympyrän pinta-alan, kun syötteeksi annetaan ympyrän säteen pituus. Vihje: käytä esimerkiksi lauseketta 3.1416 * x * x.
Laadi myös ympäristö, jossa voit käyttää funktiota. Siis vastaavasti kuten aiemmat esimerkit.
Vihje: Kopioi edellisen harjoituksen toimiva koodi ja tee siihen tarvittavat muutokset.
Harjoitus 7
Laadi funktio, joka palauttaa ympyrän pinta-alan, kun syötteeksi annetaan ympyrän halkaisijan pituus.
Laadi myös ympäristö, jossa voit käyttää funktiota. Siis vastaavasti kuten aiemmat esimerkit.
Vihje: Kopioi edellisen harjoituksen toimiva koodi ja tee siihen tarvittavat muutokset.
Listojen käyttäminen ja funktio
Seuraavassa yhdistettynä kaksi erillistä asiaa eli listat ja funkiot.
Listassa voi olla erityyppisiä alkioita, kuten kokonaislukuna (int), desimaali- eli liukulukuja (float) ja tekstiä (string). Tai milteipä mitä tahansa, kuten myöhemmin olioita.
Kokeile seuraavat koodit ja tutki, mitä niissä tapahtuu!
Harjoitus 8
Korjaa edellinen koodi siten, ettei viitata taulukon ulkopuolelle vaan viimeiseen alkioon, jonka arvo on blue.
Muuta sitten koodia niin, että tulostat kaikki alkiot kunkin omalle rivilleen.
Satunnaisluku
Ohjelmoidessa tarvitaan toisinaan satunnaislukuja. Silloin on ensin ladattava kirjasto random.
Tutustu satunnaisluvun arpomiseen alla. Aja ohjelma useita kertoja, jotta huomaat, että satunnaisluku vaihtelee.
Harjoitus 9
Kopio edellinen koodi ja siirrä lista väreistä funktioon nimeltään annaVari.
Muuta sitten funktiota annaVari siten, että se antaa satunnaisen värin, kun funktiota kutsutaan. Et siis tarvitse parametria, joten sulut voivat olla tyhjät. Sen sijaan tarvitset return-komennon, jotta funktio voi palauttaa värin.
Laadi testiympäristö siten, että voit kokeilla ajaa ohjelman ja katsoa, millaisia arvoja eli värin nimiä funktio palauttaa tekstinä.
Harjoitus 10
Laadi ohjelma, joka tulostaa satunnaisen kokoisia (kuitenkin säteen arvojen 1-100 väliltä ) ja värisiä ympyröitä näyttöön niin monta kuin käyttäjä haluaa.
Toteuta ratkaisu siten, että ympyrän tulostaminen tapahtuu funktiossa ja että tästä funktiosta kutsutaan funktiota, joka arpoo satunnaisen värin.
Lisää tietoa, mikäli haluat, ettei käyttäjä kaataisi ohjelmaa virheellisillä syötteillä
Tämä on innokkaimmille opiskelijoille.
Jos haluat varmistaa, ettei käyttäjä kaada ohjelmaa epäsopivilla syötteillä, käytä try... except -rakennetta.
Harjoitus 11
Täydennä edellistä harjoitusta 10 siten, ettei käyttäjä kaada ohjelmaa.