29 Alamprogramm. Funktsioon
Arvutiprogrammi võib jagada väiksemateks osadeks ehk alamprogrammideks. Näiteks võib pangaautomaadi programmis olla alamosa, mis tegeleb kontojäägi näitamisega. Programmis juhtub sageli, et sarnast alamprogrammi kasutatakse mitmes erinevas kohas. Selle asemel, et korduvat alamprogrammi kõikjal eraldi välja kirjutada, on arukam see alamprogramm kirjeldada täpselt ühes kohas ning edaspidi sellele kohale viidata. Sellist lahendust nimetame funktsiooniks.
Funktsiooni oleme juba kasutanud
Juba esimestes programmides kasutasime näiteks funktsiooni print
teksti kuvamiseks ja funktsiooni input
kasutajalt sisendi saamiseks. Funktsioonidel on tihti sulgudes antavad argumendid (teise sõnaga parameetrid), mis funktsiooni tööd mõjutavad, näiteks forward(100)
liigutab kilpkonna 100 sammu edasi.
Seni oleme kasutanud sisseehitatud funktsioone, mille on kirjutanud Pythoni arendajad. Mõned neist on laetud automaatselt (näiteks print
ja input
), teised vajavad esmalt neid sisaldava mooduli importimist (näiteks forward
kasutamiseks tuleb laadida moodul turtle
). Kuna olemasolevatest funktsioonidest meile alati ei piisa, kasutame võimalust funktsioone ise juurde luua.
Funktsiooni defineerimine
Funktsiooni kirjeldamiseks ehk defineerimiseks kasutame võtmesõna def
. Võtmesõnale järgneb funktsiooni nimi, mille järgi me seda funktsiooni edaspidi välja kutsuda saame. Nimevalik on küllaltki vaba (sarnaselt muutujale nime valimisega), kuid hea programmeerimise stiil on valida nimi, mis funktsiooni tehtavat kirjeldab. Funktsiooni nimele järgnevad sulud, kus määratakse funktsiooni argumendid (selles näites argumente pole). Pärast sulge tuleb koolon. Kõik funktsiooni sisus olevad read peavad olema esimese rea suhtes taandatud. Defineerime ühe funktsiooni:
def trükiAB(): print("A") print("B")
Nende ridadega defineerime funktsiooni trükiAB
, kuid ridu käivitades ei ilmu ekraanile midagi, sest funktsiooni me ei käivitanud. Defineerimisega näitasime Pythonile, kuidas tegutseda siis, kui käsk trükiAB
edaspidi välja kutsutakse.
Kutsume nüüd funktsiooni välja, kasutades selleks funktsioonile antud nime:
Näiteprogramm. trükiAB defineerimine ja väljakutsumine
def trükiAB(): print("A") print("B") print("C") trükiAB() print("D") trükiAB()
Katseta, mis ilmub ekraanile. Nagu näed, on print("C")
esimene rida, mis reaalselt käivitatakse. Sellele järgneb funktsiooni trükiAB
esimene käivitamine. Tühi rida definitsiooni ja põhiprogrammi sisu vahele lisatakse loetavuse huvides, programmi käitumist see ei mõjuta.
Enesekontroll (1 küsimus)
Defineerida tuleb enne väljakutsumist
Funktsiooni puhul on oluline, et defineerimine toimuks enne, kui funktsioon välja kutsutakse. Vastasel juhul ei oska Python sellise nimega funktsiooni korral kuidagi käituda ning annab veateate. Proovi järgmist näidet:
trükiAB() def trükiAB(): print("A") print("B")
Veateatest on tüüpiliselt võimalik lugeda, kus tõrge tekkis.
Enesekontroll (1 küsimus)
Funktsioon tsüklis
Funktsiooni saame välja kutsuda ka tsüklis. Selles näites kutsutakse funktsioon trükiAB
välja kümme korda:
Näiteprogramm. Funktsioon tsüklis
def trükiAB(): print("A") print("B") for i in range(10): trükiAB()
Tsükkel funktsioonis
Funktsiooni kirjelduses saame kasutada erinevaid struktuure, nende seas ka meile tuntud tsükleid.
Kirjutame programmi, mis loendab kümnest alla, kasutades funktsiooni:
Näiteprogramm. Kümnest alla loendav funktsioon
from time import sleep def loe_alla(): i = 10 while i > 0: print(i) i -= 1 sleep(1) loe_alla()
Jälgi, et tsükli sisu oleks funktsiooni sisu suhtes õigesti taandatud.
Funktsioon teise funktsiooni kirjelduses
Me juba kasutasime sisseehitatud funktsiooni print
enda funktsiooni trükiAB
kirjeldamisel. Samamoodi saame kasutada enda loodud funktsioone edasiste funktsioonide defineerimisel.
Näiteprogramm. Funktsioon teise funktsiooni definitsioonis
def funktsioon_a(): print("a") def funktsioon_b(): funktsioon_a() print("b")
Endiselt ei käivitata kumbagi funktsiooni enne, kui neid edasises koodis välja kutsutakse.
Enesekontroll (1 küsimus)
Video
Vaata ka kokkuvõtvat videot.
Funktsioon iseenda kirjelduses (rekursioon)
Tegelikult saab funktsioon välja kutsuda ka iseennast. Sellist olukorda nimetatakse rekursiooniks ja see on kindlates olukordades mõjuv lähenemine. Rekursiooni abil saab näiteks sugupuust (või muust puulaadsest struktuurist) konkreetset nime üles otsida. Rekursioon on küllaltki keeruline teema ja siinsetes materjalides me sellega ei tegele.
Funktsiooni argumendid
Funktsioone võib tinglikult jaotada kahte rühma: üht tüüpi funktsioonide puhul me tahame, et nad midagi ära teeksid ja teiste puhul, et nad midagi arvutaksid ning meile tulemuse tagastaksid. Senised selle osa funktsioonid tegid midagi ära – näiteks väljastasid midagi ekraanile. Tegelikult on selline ka funktsioon print, mida oleme korduvalt varem kasutanud. Funktsioonile print andsime argumendiks sõne, mida tahtsime ekraanile saada:
print("Sisesta PIN-kood:")
Funktsioonile etteantavaid suurusi nimetatakse argumentideks ning need pannakse funktsiooni väljakutsel funktsiooni nimele järgnevate sulgude sisse (nii tegime ka funktsiooniga print). Argumentidest tuleb juttu järgmises peatükis. Samuti tuleb seal juttu funktsioonidest, mille põhiroll ei ole millegi ärategemine, vaid hoopis mingisuguse tulemuse arvutamine.
Käsureaaken
Lisaks sellele, et funktsiooni saab rakendada programmi sees, saab seda teha ka Thonny käsureaaknas. See on Thonny osa, mille tiitelribale on kirjutatud Shell ja iga rea ees on >>>
.
Olgu meil programm, milles on ainult funktsiooni kirjeldus, aga selle funktsiooni rakendamist pole:
def trükiAB(): print("A") print("B")
Kui nagu tavaliselt valida roheline nupp, F5 või Run-menüüst Run current script, siis käsureaaknas näidatakse vaid, mis failis olev programm käivitati:
Kui käsureale kirjutada trükiAB()
ja reavahetusklahvi vajutada, siis see funktsioon käivitatakse:
Meie jätkame ikkagi nii, et funktsiooni väljakutsumine toimub programmiteksti sees. See-eest on käsurea abil võimalik funktsiooni toimimist mugavalt kontrollida.
Vaata ka kokkuvõtvat videot.