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.)

../_images/parametrit-uusi1.png

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.

../_images/parametrit-uusi2.png

Funktion laske_korko if-käskyssä annetaan arvo muuttujalle korkoprosentti. If-käskyn suorituksen jälkeen muistin tilanne näyttää seuraavalta:

../_images/parametrit-uusi3.png

Seuraavaksi funktiossa laske_korko lasketaan ja annetaan arvo muuttujalle kokonaiskorko. Tilanne on alla olevan kuvan mukainen.

../_images/parametrit-uusi4.png

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.

../_images/parametrit-uusi5.png

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

../_images/parametrit-uusi6.png

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ä.