Funktsiooni mõiste ja kasutamine

Põhikoolist alates on matemaatikas kasutatud erisuguseid funktsioone. Näiteks y = 2x lubab leida y väärtuse, erisuguste x väärtuste puhul. Programmeerimises on funktsioonide kasutamine samuti väga oluline, kuna nad võimaldavad:

  1. Struktureerida programmi nii, et see oleks lugejale arusaadavam.
  2. Olemasolevat koodi taaskasutada ja kohandada sõltuvalt kontekstist.
  3. Vähendada programmi arenduse ning hoolduse maksumust, kuna programm on selgem ja kvaliteetsem.

Funktsioonid on universaalsed ja kasutusel peaaegu igas programmeerimiskeeles.

Funktsioone iseloomustab võtmesõna def.

def function_name(paramater):
    # Statements, i.e. the function body

Funktsiooni loomisel tuleb peale võtmesõna def kirjutada talle nimi ja seejärel sulud. Sulgudesse võib panna 0 või rohkem parameetrit. Funktsiooni sisemus käivitub iga kord, kui funktsioon välja kutsutakse. Samuti võib funktsioonis olla, aga ei pea, võtmesõna return. Kui return ära jätta, siis funktsioon töötab lõpuni ja tagastab vaikimisi spetsiaalse väärtuse None. Võtmesõna return lõpetab otsekohe funktsiooni töö ja tagastab määratud väärtuse. Kui pärast võtmesõna return ei ole midagi, siis lõpetab funktsioon oma töö ning tagastab spetsiaalväärtuse None.

def func():
    print("This is printed to the console")
    return
    # this line can never be reached


print(func())
# This is printed to the console
# None


def second_func():
    num = 4

print(second_func)  # prints None


def third_func():
    return 5

print(third_func())  # prints 5

Parameetritega funktsioonid

def fahrenheit(temp_in_celsius):
    return (temp_in_celsius * 9 / 5) + 32

Siin on näha kuidas funktsioon nimega fahrenheit võtab parameetrina sisse temperatuuri Celsiustes tagastades sama temperatuuri, millega on teostatud vastav korrutamise ja liitmise operatisoon. Teoreetiliselt võiks tagastuse asemel olla lihtsalt print(), aga tagastamine võimaldab näiteks omistada tagastatud väärtus mingile muutujale.

def fahrenheit(temp_in_celsius):
    return (temp_in_celsius * 9 / 5) + 32


# Saving the return value into variable
temp_in_f = fahrenheit(22)

print(temp_in_f)  # prints 71.6, 22°C is 71.6°F

Edasi soovitaks tutvuda peatükiga funktsiooni defineerimine, argumendid, et saada aru eri tüüpi funktsioonidest ning seejärel siia tagasi tulla, et saada aru miks on funktsioonid nii kasulikud.

Koodi kordamise vältimine kasutades funktsioone

Funktsioonid vähendavad koodi hulka. Soovime näiteks tervitada kõiki oma sõpru ühekaupa. Esialgu kirjutame naiivselt sellise koodi:

print("Hello Anni, and welcome to the Python world")
print("Hello Mark, and welcome to the Python world")
print("Hello Bill, and welcome to the Python world")
print("Hello Romeo, and welcome to the Python world")
print("Hello Julia, and welcome to the Python world")

Sellele koodile peale vaadates võib näha, et koodi ülesanne on üks ja sama - tervitada inimest antud nimega. Programmeerimisel tasub jälgida DRY-printsiipi (Don´t Repeat Yourself) ehk sarnase koodi kordamist tuleks vältida. See koodijupp on hea näida sellest, mida tuleks vältida.

Kirjutame nüüd koodi ümber kasutades funktsiooni:

names = ('Anni', 'Mark', 'Bill', 'Romeo', 'Julia')


def greet(name):
    print(f"Hello {name}, and welcome to the Python world")

for name in names:
    greet(name)

Lõime funktsiooni, millel on parameeter name ja vastavalt sellele muutub ka prinditava sõne sisu. Paneme kõik nimed ühte ennikusse (võib mõelda kui järjendist) ja loome tsükli, mis kutsub välja meie loodud funktsiooni greet iga ennikus oleva nimega. Selle koodi haldamine on juba palju lihtsam.

Tüübi vihjed (type hints)

Pythonis on võimalik mitmel pool vihjata võimalikule andmetüübile kasutades tüübi vihjet.

Vaatame lihtsat näidet ilma vihjeta:

def greeting(name):
    """Greet a person by name."""
    return "Hello " + name

Nüüd lisame parameetrile name tüübivihje str, mis vihjab sellele, et tegemist võiks olla sõnega. Kirjutame juurde ka tüübivihje tagastatavale väärtusele, milleks antud juhul on samuti str.

def greeting(name: str) -> str:
    """Greet a person by name."""
    return "Hello " + name

Miks on see kasulik?

  • Aitab IDE-l oluliselt efektiivsemalt määrata muutuja andmetüüpi ja seeläbi pakkuda sobivaid funktsioone. Siin esimese näite puhul ei oska PyCharm objekti tüüpi määrata, seega ”.” lisamisel ei pakuta võimalike funktsioone. Teise näite puhul seevastu kuvatakse ”.” lisamisel terve hulk funktsioone, mida on võimalik sõnel kutsuda.
  • Abiks dokumenteerimisel ja aitab vältida TypeError -eid.

NB! Python on dünaamiliste andmetüüpidega keel ja tüübi vihjete lisamine ei keela programmeerijal teiste tüüpide kasutamist! Vale tüübi kasutamine piirdub vaid IDE hoiatusega.

Võimalik on ka vihjata mitmele tüübile, oma tehtud klassile ja palju muud.

Põhjalikumalt saab lugeda dokumentatsioonist: https://docs.python.org/3/library/typing.html (kirjeldatud PEP 484-s, PEP 526-s).