Parametrit

Tarkastellaan seuraavaa esimerkkiä: haluamme laatia ohjelman, joka kertoo, miten sijoituksen arvo kasvaa vuosittain, kun ohjelmalle annetaan sijoitettava arvo, sijoitusaika ja oletettu vuosittainen tuottoprosentti (oletetaan, että tuottoprosentti pysyy samana koko sijoitusajan). Haluamme siis, että ohjelma tulostaa luettelon, jossa on sijoituksen arvo kunkin vuoden päätyttyä.

Ohjelma koostuu periaatteessa kahdesta eri osasta: Ensin pyydetään käyttäjältä sijoituksen tiedot. Tämän jälkeen lasketaan sijoituksen arvon kehittyminen ja tulostetaan arvot eri vuosina. Näistä jälkimmäinen sopii hyvin kirjoitettavaksi omaksi funktiokseen, joka voi olla nimeltään esimerkiksi laske_arvokehitys. Tämä funktio tarvitsee kuitenkin lähtötietoinaan tiedon sijoituksen alkuperäisestä arvosta, sijoitusajasta ja tuottoprosentista. Nämä tiedot voidaan välittää funktiolle parametrien avulla.

Parametri on tapa välittää funktiota kutsuvalta ohjelman osalta tietoa funktiolle. Funktion käyttämät parametrit on kerrottu funktion määrittelyn otsikossa sulkujen sisässä. Esimerkiksi funktion laske_arvokehitys määrittelyn otsikko voisi tällöin olla:

def laske_arvokehitys(paaoma, aika, tuottoprosentti):

Parametreja paaoma, aika ja tuottoprosentti voi käyttää funktion sisällä samalla tavalla kuin mitä tahansa muuttujia. Se, mikä arvo näille parametreille annetaan funktion suorituksen alussa, määrätään funktiota kutsuttaessa funktion nimen perässä olevien sulkujen sisällä. Jos esimerkiksi funktiota kutsutaan

laske_arvokehitys(5000.0, 5, 4.5)

lähdetään funktiota laske_arvokehitys suorittamaan niin, että parametrin paaoma arvo on 5000.0, parametrin aika arvo 5 ja parametrin tuottoprosentti arvo 4.5. Kutsussa olevat arvot annetaan siis parametrien arvoksi samassa järjestyksessä kuin ne on funktion määrittelyn otsikossa ja funktion kutsussa lueteltu. Määrittelyn otsikossa ensimmäisenä oleva parametri saa arvokseen kutsussa sulkujen sisällä ensimmäisenä annetun arvon ja niin edelleen.

Funktion kutsussa esiintyvien parametrien arvojen ei tarvitse olla välttämättä vakioita, vaan ne voivat olla mitä tahansa lausekkeita, joiden arvo voidaan laskea, esimerkiksi

laske_arvokehitys(500.0 + 600, 2 + 1, 9.0 / 2)

tai

laske_arvokehitys(muuttuja1, muuttuja2, muuttuja3)

missä muuttuja1, muuttuja2 ja muuttuja3 ovat muuttujia, joille on annettu arvo ennen funktion kutsumista.

Samaa funktiota voidaan kutsua myös esimerkiksi samasta pääohjelmasta useita kertoja eri parametrien arvoilla. Seuraavassa animaatiossa on vielä esitetty funktiokutsujen toimintaa. Jotta funktion sisällä olevan toistokäskyn seuraaminen ei kestäisi liian kauan, animaatio ei näytä sen toimintaa askel askeleelta.

Seuraavaksi on esitetty sijoituksen arvokehityksen laskeva ohjelma.

def laske_arvokehitys(paaoma, aika, tuottoprosentti):
    print("Sijoituksen arvo vuoden lopussa:")
    print("vuosi  arvo")
    for i in range(1, aika + 1):
        paaoma = paaoma * (1.0 + tuottoprosentti / 100.0)
        print(f"{i:2d}. {paaoma:10.2f} euroa")


def main():
    print("Ohjelma laskee sijoituksen arvon kehittymisen vuosittain")
    rivi = input("Anna sijoitettava summa (euroa): ")
    summa = float(rivi)
    rivi = input("Anna sijoitusaika (vuotta): ")
    vuodet = int(rivi)
    rivi = input("Anna odotettu tuottoprosentti: ")
    tuotto = float(rivi)
    laske_arvokehitys(summa, vuodet, tuotto)


main()

Esimerkki ohjelman suorituksesta:

Ohjelma laskee sijoituksen arvon kehittymisen vuosittain
Anna sijoitettava summa (euroa): 20000
Anna sijoitusaika (vuotta): 5
Anna odotettu tuottoprosentti: 4.5
Sijoituksen arvo vuoden lopussa:
vuosi  arvo
 1.   20900.00 euroa
 2.   21840.50 euroa
 3.   22823.32 euroa
 4.   23850.37 euroa
 5.   24923.64 euroa

Esimerkkitapauksessa siis pääohjelmassa muuttujan summa arvoksi tulee 20000.0, muuttujan vuodet arvoksi 5 ja muuttujan tuotto arvoksi 4.5. Kun funktion laske_arvokehitys suoritus aloitetaan, sen parametri paaoma saa arvokseen pääohjelman muuttujan summa arvon, parametri aika pääohjelman muuttujan vuodet arvon ja parametri tuottoprosentti pääohjelman muuttujan tuotto arvon. Tämä seuraa siitä, että pääohjelmassa funktion kutsussa näiden muuttujien nimet on kirjoitettu sulkujen sisään tässä järjestyksessä.

Myös pääohjelman se osa, joka pyytää lähtötiedot käyttäjältä, sopisi hyvin omaksi funktiokseen. Tässä vaiheessa opituilla tiedoilla ei ole kuitenkaan vielä keinoja saada funktion käyttäjältä lukemia arvoja pääohjelman ja sitä kautta toisen funktion käyttöön.