Funkcije

Funkcija je blok organizirane kode za večkratno uporabo, ki se uporablja za izvedbo nekega povezanega dejanja. Funkcije zagotavljajo našemu programu  boljšo modularnost  in visoko stopnjo ponovne uporabe kode.

Kot že vemo, Python nudi veliko vgrajenih funkcij, kot so print (), itd., Vendar lahko ustvarimo tudi svoje funkcije. Tem funkcijam pravimo uporabniško definirane funkcije.

Definiranje funkcije

Definiranje  nove funkcije terja določeno obliko.

Funkcijski bloki se začnejo s ključno besedo def, ki ji sledi ime funkcije in oklepaji (()).

Sintaksa
def imeFunkcije (parametri):
   "opisFunkcije"
   telo funkcije
   return [izraz]

Za imenom funkcije sledijo oklepaji, v katerih so navedeni parametri (argumenti) funkcije. Temu sledi dvopičje.
Imenu lahko (neobvezno) sledi v navednicah opis funkcije.

Telo funkcije je zamaknjeno. V telesu imamo  (ne nujno) tudi stavek return. Ta pomeni povratek na klicatelja. Stavek return ima lahko tudi v oglatih oklepajih izraz, ki ga vrača klicatelju (ni pa to obvezno)

Vrstni red morebitnih parametrov mora biti enak tako v definiciji funkcije kot pri njeni uporabi.

Primer definiranja funkcije:
Naslednja funkcija bo izračunala vsoto dveh števil, navedenih kot vhodna parametra, in vrnila rezultat:

def vsota (x,y):
   "funkcija izracuna vsoto"
   rezultat = x + y
   return [rezultat]


Klicanje funkcije

Z definicijo funkcije smo podali njeno ime, navedli vhodne parametre in v telesu funkcije zapisali kodo. Ko enkrat funkcijo definiramo, jo lahko (tudi večkrat) pokličemo v našem programu.

Za naš primer poglejmo sedaj celoten program in ga preizkusimo:



          

Globalne in lokalne spremenljivke

Vse spremenljivke v programu morda niso dostopne na vseh lokacijah v tem programu. To je odvisno od tega, kje smo spremenljivko deklarirali .

Obseg spremenljivke določa področje programa, v katerem lahko dostopamo do določenega imena. Obstajata dve osnovni področji spremenljivk:

Spremenljivke, ki so definirane v telesu neke funkcije, imajo lokalni obseg (le znotraj te funkcije), tiste, ki so definirane zunaj, pa imajo globalni obseg.

To pomeni, da je do lokalnih spremenljivk mogoče dostopati samo znotraj funkcije, v kateri so deklarirane, do globalnih spremenljivk pa lahko dostopamo po celotnem telesu programa in pri vseh funkcijah. Pri klicu neke funkcije so spremenljivke, ki so deklarirane znotraj nje, uvedejo v  njen lokalni doseg.

Poglejmo preprost primer:



          

Globalna in lokalna spremenljivka imata isto ime, a očitno drugo vrednost. Sprememba lokalne spremenljivke ni pomenila spremembe globalne.

Posredovanje parametrov po vrednosti ali po referenci

Zveni nekoliko komplicirano: Dejansko dobi funkcija kopijo parametra. In če to kopijo spremeni, se originalna vrednost v klicanem programu ne spremeni. To lahko  hitro preverimo z naslednjim primerom:



          


Razlaga: Funkciji smo posredovali vrednost stevila (ki je enaka 4). Funkcija je svojo kopijo tega podatka spremenila v 5 . Originalna vrednost pa se ni spremenila.

Imena drugih podatkovnih struktur (kot so na primer zaporedja ipd) pa so dejansko naslovi, kje se te strukture nahajajo v računalniku.  Če v kličoči funkciji podamo tako ime, ji dejansko posredujemo naslov (temu rečemo referenco). To pomeni, da funkcija dobi  kopijo naslova, kje se podatki dejansko nahajajo. In če ta vrednosti na tem naslovu spremenimo v funkciji,  se sprememba odraža tudi v kličočem programu.

Poglejmo primer:



          

Komentar: Tako imena kot njegova kopija seznamImen kažeta na iste podatke. Zato sprememba teh podatkov v klicani funkciji pomeni dejansko spremembo originalnih podatkov.

Argumenti funkcije

Funkcijo lahko pokličete z uporabo naslednjih vrst formalnih argumentov :

Zahtevani argumenti

Zahtevani argumenti so argumenti, ki morajo biti posredovani funkciji v pravilnem vrstnem redu. Število argumentov v funkcijskem klicu se mora natančno ujemati z definicijo funkcije.

Pomembnost števila in vrstnega reda zahtevanih parametrov je razvidna iz naslednjega primera:


          

Argumenti s ključnimi besedami

Ta prijem omogoča, da klicatelj označi argumente kar z imenom argumenta, uporabljenim v definiciji funkcije. To omogoča, da Pythonov tolmač ugotovi, za kateri argument gre, kar po ključnih besedah argumentov, podanih v definiciji funkcije. Tako lahko pri klicu funkcije pomešamo vrstni red argumentov (parametrov).



          

Privzeti argumenti

Privzeti argument je argument, ki že v definiciji funkcije podaja privzeto vrednost za primer da ta vrednost ni navedena v klicu funkcije za ta argument.

Naslednji primer ponazarja odejo o privzetih argumentih, saj funckija uporabi privzeto starost, če ni ta ni podana v klicu




          

Spremenljivo število argumentov

Pri programiranju se včasih ne zavedamo vseh možnih primerov uporabe naše  kode pa vendar želimo bodočim uporabnikom  ponuditi več možnosti. Uporabimo lahko idejo, znano pri nekaterih drugih programskih jezikih, da argumente podajamo v seznamu (ki je pri klicu funkcije lahko različne dolžine).


* args z eno zvezdico uporabimo pri definiciji funkcije kot parameter za posredovanje seznama argumentov spremenljive dolžine.

Primer:



          

Anonimne funkcije

Anonimne funkcije niso deklarirane na standardni način z uporabo ključne besede def. Ustvarimo jih s ključno besedo ključno besedo lambda.

Take funkcije lahko sprejmejo poljubno število argumentov, vendar vrnejo samo eno vrednost v obliki izraza.

Lambda funkcije imajo svoj lokalni imenski prostor in ne morejo dostopati do spremenljivk, razen tistih v seznamu parametrov in tistih v globalnem imenskem prostoru.

lambda funkcije imajo naslednjo formalno obliko:


lambda [arg1 [, arg2, ..... argn]]: izraz

Primer lambda funkcije in njene uporabe: