Veel funktsioonidest
Print vs return
Uuri kaht järgnevat programmi, kus mõlemas on defineeritud funktsioon ringi pindala arvutamiseks. Mõlemal juhul on meie eesmärgiks arvutada ringi pindala ja kuvada tulemus ekraanile.
Programm 1:
from math import pi def ringi_pindala(raadius): print(f"Pindala on {pi * raadius**2}") ringi_pindala(16.5)
Programm 2
from math import pi def ringi_pindala(raadius): return pi * raadius**2 print(f"Pindala on {ringi_pindala(16.5)}")
Kui sooviksime arvutuse tulemust näidata ainult ekraanil, siis tehniliselt pole vahet, kas me kasutame print
käsklust funktsiooni sees või väljaspool. Erinevus tuleb sisse, kui me soovime tulemust veel kuskil kasutada, näiteks teha edasisi arvutusi – meie esimeses programmis olev funktsioon siis enam ei sobi. Teises variandis on funktsioon defineeritud üldisemana ja seetõttu saab seda kasutada rohkemates situatsioonides. Ilus oleks muidugi tagastatud tulemus ümardada return round(pindala, 2)
, aga vahepealsete tulemuste ümardamisega peab olema ettevaatliks, sest võib mõjutada lõpptulemuse täpsust!
Vaikeväärtus
Mõnikord on konkreetse argumendi väärtus peaaegu alati sama ja oleks tüütu seda iga kord uuesti ette anda. Sellisel juhul saame kasutada vaikeväärtust. Kui funktsiooni väljakutsel pole seda argumenti näidatud, siis saab argumendi väärtuseks vaikeväärtus:
Näiteprogramm. Vaikeväärtusega funktsioon
def kasKiiruseÜletamine(kiirus, piirkiirus = 90): return kiirus > piirkiirus print(kasKiiruseÜletamine(100)) print(kasKiiruseÜletamine(90, 70))
Vaikeväärtus on ka funktsiooni print
argumendil end
, millega määratakse väljastatava sõne lõppu lisatav(ad) sümbol(id). Vaikimisi on lõpus reavahetus, sest argument on vaikimisi end = "\n"
. Me võime sellele argumendile anda ka teistsuguse väärtuse:
print("Kartul on ", end = "kollane.")
Näiteks, kui tahame, et rida ei lõppeks reavahetusega, siis saame sellele argumendile anda väärtuseks tühja sõne:
print("Kartul on ", end = "") print("kollane.")
Mitu funktsiooni koos
Vaatame programmi, kus funktsioone kasutatakse nii, et ühe väärtus on teise argumendiks:
ümardatud_sisestatud_arv = round(float(input("Sisestage arv: "))) print(f"See arv ümardatult on {ümardatud_sisestatud_arv}")
Katseta seda suhteliselt kokkusurutud programmi erinevate komakohtadega arvudega. Selle esimesel real sooritatakse hulk tegevusi. Tegevused algavad "seestpoolt".
- Funktsiooniga
input
küsitakse kasutaja käest arv. Funktsiooniinput
väärtus on sõnetüüpi. - Funktsioon
float
võtab argumendiks sõne ja tema enda väärtuseks saab vastav ujukomaarv. Teiste sõnadega: funktsioon tagastab vastava ujukomaarvu. Või veel kõnekeelsemalt: funktsioon muudab sõne vastavaks ujukomaarvuks. - Funktsioon
round
võtab argumendiks ujukomaarvu ja ümardab selle täisarvuks.
Lõpuks määratakse see täisarv muutuja ümardatud_sisestatud_arv
väärtuseks.
Niimoodi teise funktsiooni argumendiks saab olla ainult väärtust tagastav funktsioon. Sellisena saab muidugi kasutada ka isekirjeldatud funktsioone:
def summa(x,y): return x + y a = summa(summa(1, 3)*2, 4)
Main-funktsioon
Kuna põhiprogrammis võib olla mitmeid käsklusi, siis oleks hea neid struktuurselt omakorda koondada ühte põhifunktsiooni, mille nimi võiks olla main. See omakorda tähendab, et siis peaks seda funktsiooni main ka programmi lõpus välja kutsuma.
Sellisel juhul oleks kogu programm selline:
from math import pi def ringi_pindala(raadius): pindala = pi * raadius**2 return round(pindala, 2) def main(): print(ringi_pindala(5)) print(ringi_pindala(10)) main()
Programmmide kirjutamisel tuleb tulevikus kasuks funktsiooni main() välja kutsuda programmi lõpus if-lauseosas, et vältida importimisel peafunktsiooni käivitamist. Seda just seepärast, et kui tulevikus tahate oma varasemaid programme teegina kasutada, siis oleks importimine võimalik ilma põhiosa jooksutamata. Pythoni standardteekide kohta saab lugeda silmaringimaterjalist Silmaring. Standardteek ja moodulid. Seega mõistlik main-funktsiooni väljakutsumine näeks välja nii:
from math import pi def ringi_pindala(raadius): pindala = pi * raadius**2 return round(pindala, 2) def main(): print(f"Ringi pindala on {ringi_pindala(5)}") if __name__ == "__main__": main()
Tüüpimine
Funktsioonide puhul oleks hea teada, mis tüüpi argumentide väärtusi funktsioon ootab ja mis tüüpi väärtuse funktsioon tagastab. Selleks on võimalik määrata muutujatele ka vaikimisi tüübi täisarvu puhul int
, ujukomaga arvu puhul float
, sõne puhul str
.
Näiteks peatüki alguses oleva ringi pindala arvutamise näite puhul saame määrata, et oodatakse täisarvu ehk int
tüüpi argumenti ja tagastatav väärtus on ujukomaarvu float
tüüpi:
from math import pi def ringi_pindala(raadius: int) -> float: pindala = pi * raadius**2 return round(pindala, 2) def main(): print(f"Ringi pindala on {ringi_pindala(5)}") if __name__ == "__main__": main()
NB! Selline tüübi määramine ei takista funktsioonile teist tüüpi argumendi andmist, vaid on pigem informatiivne ja on abiks intelligentsemate koodiredaktoritega suurte projektidega töötamisel.