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.

Litsents

Icon for the Creative Commons Attribution 4.0 International License

Programmeerimine on loodud Eno Tõnisson, Tauno Palts, Merilin Säde, Kaarel Tõnisson jt poolt Creative Commons Attribution 4.0 International License litsentsi alusel, kui pole teisiti märgitud.

Jaga seda raamatut