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.