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.