54 Funkcijeizvr²enja naredbe def povezuje s odgovaraju¢im referencama. Na primjer, funkcija moºe brojati kolikoje puta pozivana:def counter( ):counter.count += 1return counter.countcounter.count = 0Iako ogu¢nost pridruºivanja atributa s funkcijom moºe ponekad biti od koristi njena primjena nije£esta. Mnogo £e²¢e, kada se trebaju povezati neki podaci i programski kôd zajedno, koriste se objektnoorijentiranimehanizmi.6.4 Naredba 'return'Naredba return u <strong>Python</strong>u dopu²ta se jedino unutar tijela funkcije, a iza nje moºe slijediti neki izraz.Kada se return izvr²i, funkcija zavr²ava i dobiva se povratna vrijednost izraza. Funkcija vra¢a vrijednostNone ako zavr²ava dolaskom do konca svog funkcijskog tijela ili izvr²enjem naredbe return bezpridruºenog izraza. Stvar je stila programskog pisanja da se naredba return ne pi²e na kraju tijelafunkcije, ako ona nema izraz koji se vra¢a programskom kôdu koji funkciju poziva. Isto tako, ako nekereturn naredbe u funkciji imaju izraz koji vra¢aju pozivatelju, onda bi ga i sve ostale return naredbetrebale imati. Naredba return None moºe se pisati ako se eksplicitno ºeli zadrºati stil takvog pisanja.Iako <strong>Python</strong> ne prisiljava na stilske konvencije, njihovo po²tivanje na£init ¢e na² kôd jasnijim i£itljivijim.6.5 Poziv funkcijePoziv funkciji je izraz sa sljede¢om sintaksom:funkcijsko_ime(argumenti)funkcijsko_ime moºe biti bilo kakva referenca na objekt funkcije, ²to je naj£e²¢e samo ime doti£nefunkcije. Zagrade ozna£uju operaciju poziva funkcijie, dok su argumenti u najjednostavnijem slu£aju nizod nula ili vi²e izraza odvojenih zarezima, koji daju, prenose, vrijednosti odgovaraju¢im parametrimadenirane funkcije. Kada se funkcija poziva , parametri poziva funkcije povezuju se s funkcijskimargumentima, tijelo funkcije se izvr²ava sa stvarnim vrijenostima argumenata, a funkcija nakon izvr²enjana koncu vra¢a pozivatelju neku vrijednost izraza.6.5.1 Prijenos argumenataU tradicionalnim terminima izraºeno, sve operacije preno²enja argumenata u <strong>Python</strong>u su putem vrijednosti(engl. by value). Na primjer, ako se varijabla prenosi kao argument, <strong>Python</strong> prenosi funkcijiobjekt (vrijednost) koju varijabla pokazuje, a ne samu varijablu (adresu koju sadrºi). Na taj na£infunkcija ne moºe re-povezati, tj. mijenjati sadrºaj varijable, nego samo kopiju vrijednosti. Ali, akose kao argument prenosi promjenljivi objekt, funkcija moºe zahtjevati izmjene na objektu, jer <strong>Python</strong>prenosi sam objekt (njegovu adresu), a ne njegovu kopiju. Re-povezivanje varijable i promjena objektasu dva potpuno razli£ita koncepta u <strong>Python</strong>u. Na primjer:def f(x, y):x = 23y.append(42)a = 77b = [99]
6.5. Poziv funkcije 55f(a, b)print a, b # ispisuje se: 77 [99, 42]Naredba print pokazuje da je a jo² uvijek povezano sa 77, iako se kao parametar x proslijedila ufunkciju f(x,y). Re-povezivanje funkcijskog parametra x na 23 nema efekta s obzirom na poziv funkcijef, jer je x lokalna varijabla funkcije.Mežutim, naredba print takožer pokazuje da je b sad povezano s [99,42]. Objekt b je jo² uvijekpovezan s istim objektom liste kao i prije poziva, ali se taj objekt mijenjao, jer se unutar funkcije fpridodao 42 na taj objekt liste. U oba slu£aja, f nije izmijenio poveznice pozivatelja, niti f moºeizmijeniti broj 77, jer su brojevi nepromjenljivi. Ali, f moºe izmijeniti objekt liste, jer su objekti listepromjenljivi. U ovom primjeru, f mijenja objekt liste koji pozivatelj prenosi na f kao drugi argumentpozivaju¢i append metodu objekta.6.5.2 Vrste argumenataUpravo opisani argumenti zovu se pozicijski argumenti. Svakom pozicijskom argumentu pridruºuje sevrijednost parametra koji mu odgovara po poziciji (redoslijedu) u deniciji funkcije. U pozivu funkcijes nula ili vi²e pozicijskih argumenata mogu slijediti jedan ili vi²e imenovanih argumenata sa sljede¢omsintaksom:identifikator=izrazidentifikator mora biti jedno od imena formalnih parametara koja se koriste u def naredbifunkcije. izraz daje vrijednost formalnom parametru.Poziv funkcije mora pruºiti, putem pozicijskih i/ili imenovanih argumenata, to£no jednu vrijednostza svaki obvezatni parametar, te nula ili jednu vrijednost za svaki slobodno izabrani parametar. Naprimjer:def divide(divisor, dividend): return dividend // divisorprint divide(12,94) # ispisuje se: 7print divide(dividend=94, divisor=12) # ispisuje se: 7O£evidno je da su ova dva poziva za dijeljenje ekvivalentna. Imenovani argumenti £esto se pi²u usvrhu £itljivosti, kada se £itljivost i razumljivost napisanog kôda moºe pove¢ati identikacijom uloge iupravljanjem redoslijeda argumenata. Treba primjetiti, kako kod poziva imenovanih arguemanta nijebitan redoslijed njihova pisanja. ƒe²ta uporaba imenovanih argumenata je u svrhu povezivanja izabranihparametara s posebnim vrijednostima, dok drugi slobodni parametri uzimaju svoje pretpostavljenevrijednosti:def f(middle, begin='init', end='finis'): return begin+middle+endprint f('tini', end='')# ispisuje se: inittiniZahvaljuju¢i imenovanom argumentu end= pozivatelj moºe specicirati vrijednost, u ovom slu£ajuto je prazan string ' ' za funkcijski (tre¢i) parametar end, te jo² uvijek dopustiti funkcijskom (drugom)parametru begin, kori²tenje njegove pretpostavljne vrijednosti, stringu 'init'. Na kraju argumenata upozivu funkciji, po izboru se moºe koristiti bilo koji (ili oba) posebna oblika *niz i **rj. Ako su obaprisutna, onaj sa dvije zvjezdice mora do¢i na zadnjem mjestu.Parametar *niz prenosi £lanove niz kao pozicijske argumente funkcije (poslije obi£nih pozicijskihargumenata, ako ih ima). Pritom niz moºe biti bilo kakav niz ili iterator.S druge pak strane, **rj prenosi £lanove rj kao imenovane argumente funkcije, gdje rj morabiti rje£nik £iji su svi klju£evi stringovi. Klju£ svakog £lana je ime parametra, a vrijednost tog £lanaje vrijednost argumenta. Ponekad je potrebno prenijeti argument oblika *niz ili **rj kad formalniparametri koriste sli£ne oblike. Na primjer, koriste¢i funkciju zbroj() moºe se ispisati zbroj svihvrijednosti u rije£niku d. Ovo se postiºe vrlo jednostavno sa *niz oblikom: