Tapaaminen 05.11.2009

Aiheina:

  • Funktiot
  • Parametrit ja argumentit
  • import-lause
  • ohjelman suoritusjärjestys
  • muuttujien näkyvyys
  • pino-tietotyyppi

Linkkejä:

Tehtävien tarkistus

Tapaaminen alkoi edellisen kerran tehtävien (kappale 2) tarkistamisella.

Funktiot

Funktion määrittely koostuu kahdesta osasta, def-sanalla alkavasta otsakkeesta ja funktion vartalosta, joka on sisennetty jonkin verran suhteessa otsakkeeseen. Käytetään sisennykseen pep8:n suosittelemaa neljää välilyöntiä. Esimerkiksi:

def foo():
    print "foo"

Tehtävä 1

Tee tiedostoon luku03.py funktio new_line, joka tulostaa rivinvaihdon.

Ratkaisu:

def new_line():
    print
new_line()

Kun tämä tiedosto suoritetaan komennolla python luku03.py, tulostuu tyhjä rivinvaihto.

Tehtävä 2

Lisää tiedostoon luku03.py funktio three_lines, joka tulostaa kolme rivinvaihtoa. Lisää tiedostoon komennot

print "foo"
three_lines()
print "bar"

Ratkaisu:

def new_line():
    print
def three_lines():
    new_line()
    new_line()
    new_line()
print "foo"
three_lines()
print "bar"

Vaihtoehtoisia toteutuksia three_lines-funktiolle:

def three_lines():
    print
    print
    print
def three_lines():
    print '\n', '\n'

Funktioiden parametrit ja argumentit

Funktioille voidaan antaa parametrimuuttujien arvoja argumentteina. Funktion toiminta riippuu sille kutsuttaessa annettujen argumenttien arvoista, jotka sijoitetaan funktion otsakkeessa esiteltyihin parametreihin. Esimerkiksi, jos määrittelemme funktion foo seuraavasti:

def foo(param):
    print param

voidaan funktiota kutsua esimerkiksi seuraavasti: foo(“Bar”) ja foo(“baz”). Näistä ensimmäisessä parametrin param arvoksi tulee merkkijono “Bar” ja funktio tulostaa sen. Toisessa parametrin arvona taas käytetään merkkijonoa “baz”.

Argumentteja voidaan funktioille antaa useampiakin sen mukaan, montako parametria funktion määrittelyssä on esitelty. Funktion kutsussa annettavat argumettien arvot sijoitetaan parametrimuuttujiin samassa järjestyksessä.

Tehtävä 3

Lisää tiedostoon luku03.py funktio print_twice, jolle voidaan antaa yksi argumentti, ja joka tulostaa sen kaksi kertaa samalle riville välilyönnillä erotettuna.

Ratkaisu:

def print_twice(param):
    print param, param

import-lause

Käynnistetään interaktiivinen Python-tulkki samassa hakemistossa, jossa luku03.py sijaitsee. Annetaan komentotulkille seuraava import-komento:

>>> from luku03 import print_twice

Kokeillaan nyt kutsua print_twice-funktiota komentamalla:

>>> print_twice()

Python-tulkki vastaa:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: print_twice() takes exactly 1 argument (0 given)

Tämä virheilmoitus johtuu siitä, että print_twice-funktio tarvitsee yhden argumentin ja nyt sille ei annettu yhtään. Kokeillaan uudelleen yhdellä argumentilla:

>>> print_twice('bar')
bar bar

Kokeillaan monimutkaisemmalla lausekkeella:

>>> print_twice('foo'+'bar'*3)
foobarbarbar foobarbarbar

Huomaa operaatioiden suoritusjärjestys! Ensin *-operaatio, sitten +-operaatio.

Annettu import-lause siis toi tiedostosta pyydetyn funktion print_twice käytettäväksi.

Tehtävä 4

Määrittele jälleen luku03.py-tiedostoon uusi funktio, cat_twice, joka saa kaksi merkkijonoargumettia, jotka se yhdistää peräkkäin ja tulostaa tämän yhdisteen kaksi kertaa samalle riville välilyönnillä erotettuina.

Ratkaisu:

def cat_twice(part, part2):
    cat = part1 + part2
    print_twice(cat)

Kokeillaan funktiota:

>>> from luku03 import cat_twice
>>> chant1 = 'Pie Jesu domine, '
>>> chant2 = 'dona eis requiem.'
>>> cat_twice(chant1, chant2)
Pie Jesu domine, dona eis requiem. Pie Jesu domine, dona eis requiem.

Jos nyt yritetään tutkia muuttujaa cat, jota käytettiin funktion sisällä, huomataan, että funktion sisällä määritellyt muuttujat eivät näy sen ulkopuolelle.

>>> print cat
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'cat' is not defined

Pino

Pinoksi kutsutaan tietorakennetta, joka toimii LIFO-periaatteella (Last In, First Out). Tämä tarkoittaa alkiokokoelmaa, josta aina seuraava poistettava alkio on se, joka sinne on viimeisenä lisätty. Siis nimensä mukaisesti pino (=stack). Alkion lisäämisestä pinon päällimmäiseksi käytetään nimitystä push ja päällimmäisen alkion poistamista pinosta kutsutaan nimellä pop.

Kotitehtävät

Kappaleen 3 tehtävät. Tehkää tehtävät 1-4 samaan tiedostoon ja lähettäkää kopio kustakin vaiheesta Terolle. (4 tiedostoa)