13. Funktsioon ehk alamprogramm
Võimalik, et programmis leidub koodilõike, mida tahame programmi kestel kasutada korduvalt: arvutada etteantud andmete põhjal ruumala, väljastada kasutaja andmeid jne. Samuti on suure programmi puhul keeruline jälgida programmi struktuuri. Koodi lühendamiseks ja struktuuri parandamiseks kasutatakse funktsioone e. alamprogramme. Funktsioon on koodiridade plokk, millel on oma nimi.
def funktsioon(): <käsk> <käsk>
Sel viisil defineeritud funktsiooni saab välja kutsuda e. selle alla kuuluvaid käske käivitada korduvalt niimoodi:
funktsioon()
Näiteks
def tekst(): print("Pikk ekraanile väljastatav lause.") tekst() tekst() tekst()
Ülaltoodud näites kutsutakse funktsiooni tekst() välja kolm korda, seega trükitakse ka lauset kolm korda. Kui funktsioon on defineeritud, võib seda välja kutsuda suvalisest kohast programmi sees.
Argumendid
Sageli on kordamist vajavad operatsioonid küll sarnased, kuid neid tuleb teha erinevate andmetega: kokku liita erinevaid arve, välja trükkida erinevate kasutajate andmeid jne. Sel juhul saame funktsioonile ette anda argumente, mida kasutades ta käske käivitab. Argumendid kirjutatakse komadega eraldatult sulgudesse funktsiooni väljakutsumisel ning nende väärtused võrdsustatakse muutujatega funktsiooni defineerimisel. Saadud muutujaid saab funktsiooni sees kasutada, kuid väljaspool funktsiooni mitte.
def tervita(nimi): print("Ole tervitatud, " + nimi) tervita("Siim") tervita("Kadri")
def liida(arv1, arv2): print("Arvude " + str(arv1) + " ja " + str(arv2) + " summa on " + str(arv1 + arv2)) liida(20, 30) liida(5, 3)
Tulemuste tagastamine
Toodud näidetes toimus funktsiooni sees andmete väljatrükk. Mõnikord on vaja, et funktsiooni töö tulemusi vajatakse kusagil väljaspool funktsiooni: tulemuse alusel jätkatakse arvutusi vms. Sel juhul tagastatakse funktsiooni töö tulemus käsuga return ning loomulikult võetakse tagastatud tulemus ka funktsiooni käivitades vastu.
def liida(arv1, arv2): summa = arv1 + arv2 return summa summa1 = liida(20, 30) print("Kahe esimese arvu summa on " + str(summa1)) summa2 = liida(5, 3) print("Kahe järgmise arvu summa on " + str(summa2)) kogusumma = liida(summa1, summa2) print("Arvude kogusumma on " + str(kogusumma))
Toodud programmis kasutatakse funktsiooni liida() kolm korda, viimasel korral kasutatakse argumentidena kahel eelmisel korral saadud tulemusi.
Muutujate väärtuste kehtivuse ulatus e. skoop
Kõikide muutujate väärtused, mida me funktsioonis kasutame, kehtivad ainult funktsiooni sees. Nagu nägime: elleks, et tagastada tulemusi väljapoole funktsiooni, kasutasime käsku "return". Samas on mõnikord sellisel moel väljaspool funktsiooni kehtivate muutujate väärtustamine vaevarikas, seepärast võime funktsiooni algusesse (pärast funktsiooni definitsiooni) kirjutada käsu "global <muutuja_nimi>", näiteks:
global punktisumma
Nii ütleme programmile, et muutuja "punktisumma" pole mitte selle funktsiooni sisene, vaid selles funktsioonis kasutatakse väljaspool funktsiooni deklareeritud muutujat "punktisumma". Nii saab ka funktsiooni sees kasutada seda muutujat, näiteks lugeda või muuta selle väärtust.
Creative Commons litsentsiga Autorile viitamine + Mitteäriline eesmärk 3.0 Eesti (CC BY-NC 3.0 EE) - https://creativecommons.org/licenses/by-nc/3.0/ee/