Kertausta: parametrit, muuttujat ja paluuarvot
Tässä kappaleessa kerrataan vielä parametrien, muuttujien ja paluuarvon käsitettä käyttämällä esimerkkinä ohjelmaa, joka laskee sijoitustilille kertyvän koron. Oletetaan, että pankki maksaa sijoitustilille vuosittaista korkoa 0,5 %, jos talletettava summa on 10000 euroa, 1,0 %, jos talletussumma on vähintään 10000 mutta alle 15000 euroa ja 1,5 %, jos talletussumma on tätä suurempi. Ohjelma kysyy käyttäjältä talletettavan rahasumman ja talletusajan kuukausina. Ohjelma laskee ja tulostaa talletukselle kertyvän koron. Talletusajan oletetaan olevan korkeintaan vuosi (vaikka sitä ei ohjelmassa tarkistetakaan), joten ohjelman ei tarvitse laskea korkoa korolle.
def laske_korko(saldo, kuukaudet):
if saldo < 10000.0:
korkoprosentti = 0.5
elif saldo < 15000.0:
korkoprosentti = 1.0
else:
korkoprosentti = 1.5
kokonaiskorko = korkoprosentti / 100.0 * kuukaudet / 12 * saldo
return kokonaiskorko
def main():
print("Ohjelma laskee sijoitustilin tuoton.")
paaoma = float(input("Anna sijoitettava paaoma (eur): "))
aika_kk = int(input("Montako kuukautta rahat pidetaan tililla? "))
korko = laske_korko(paaoma, aika_kk)
print(f"Saat rahoille korkoa {korko:.2f} euroa.")
main()
Ohjelman suoritus alkaa siis pääohjelmasta eli main
-funktiosta. Kun
Python-tulkki aloittaa funktion suorittamisen, varataan tietokoneen
keskusmuistista oma muistialue juuri tämän funktion käyttämien
muuttujien tallentamiseen. Tätä muistialuetta kutsutaan kehykseksi.
Jos käyttäjä antaa sijoitettavaksi pääomaksi 12000 euroa ja
talletusajaksi 6 kuukautta, on tilanne keskusmuistissa ennen funktion
laske_korko
kutsua alla olevan kuvan näköinen. (Itse arvot 12000.0
ja 6 on piirretty kehyksen ulkopuolelle, koska ne voidaan tallentaa
keskusmuistissa muualle. Kehyksen alueella on kuitenkin muistipaikat
funktion käyttämille muuttujille ja näissä muistipaikoissa tieto siitä,
missä itse arvo sijaitsee. Kuva näyttää vähän erilaiselta kuin animaatioissa,
koska animaatioissa muuttujien arvojen esittämistä on vähän yksinkertaistettu.)
Kun ohjelmassa kutsutaan funktiota laske_korko
, luodaan sen
käyttämiä muuttujia varten oma kehys. Ennen funktion suorituksen alkua
kopioidaan funktiokutsussa annetut parametrien arvot vastaavien
laske_korko
-funktion parametrien arvoiksi. Tilanne on nyt alla
olevan kuvan näköinen.
Funktion laske_korko
if-käskyssä annetaan arvo muuttujalle
korkoprosentti
. If-käskyn suorituksen jälkeen muistin tilanne
näyttää seuraavalta:
Seuraavaksi funktiossa laske_korko
lasketaan ja annetaan arvo
muuttujalle kokonaiskorko
. Tilanne on alla olevan kuvan mukainen.
Pääohjelmalla (funktiolla main
) ja funktiolla laske_korko
on
siis molemmilla omat muuttujansa. Funktion sisällä ei voi käyttää
suoraan sellaisia muuttujia, jotka ovat toisen funktion kehyksessä.
Esimerkiksi funktiossa laske_korko
ei voi käyttää suoraan muuttujaa
paaoma
. (Tarkasti ottaen funktiossa laske_korko
saa käyttää
paaoma
-nimistä muuttujaa, mutta se ei ole silloin sama muuttuja kuin
pääohjelmassa, vaan toinen muuttuja, jolla vain sattuu olemaan sama nimi
ja jonka arvo voi muuttua itsenäisesti riippumatta pääohjelman
samannimisen muuttujan arvosta.)
Kun funktio laske_korko
on suoritettu loppuun, sen kehys tuhotaan
tietokoneen keskusmuistista. Funktion käyttämät muuttujat häviävät.
Kuitenkin return
-käskyssä palautettu arvo otetaan talteen ja
välitetään ohjelmassa sinne, mistä funktiota kutsuttiin.
Pääohjelmassa funktion laske_korko
palauttama arvo sijoitetaan
muuttujan korko
arvoksi. Huomaa, että funktion laske_korko
käyttämiä muuttujia ei ole enää tallessa missään. Jos pääohjelmassa
kutsuttaisiin funktiota uudelleen, aloitettaisiin sen seuraava suoritus
puhtaalta pöydältä eikä edellisen suorituskerran tietoja olisi tallella.
Ennen print
-käskyn suoritusta tilanne keskusmuistissa näyttää
seuraavalta
Huomautus: Ohjelmassa olisi ollut järkevää tallentaa eri korkoprosentit ja rajat niiden käytölle vakiomuuttujiin. Sitä ei ole kuitenkaan tehty tässä esimerkissä, koska tässä on haluttu pitää muuttujien määrä pienenä, jotta esimerkkikuvat olisivat tarpeeksi selviä.