52 Funkcije6.2 ParametriFormalni parametri koji su jednostavni identikatori navedeni u deniciji funkcije predstavljaju obvezatneparametre, ²to zna£i da svaki poziv funkcije mora pruºiti i odgovaraju¢u vrijednost - (argument)za svaki parametar. Nakon niza ili liste parametara odvojenih zarezima s niti jednim ili s vi²e (obveznih)parametara moºe slijediti jedan ili vi²e slobodnih parametara koji imaju sljede¢u sintaksu:identifikator=izrazNaredba def ra£una, ocjenjuje izraz, te sprema referencu vrijednosti koju izraz vra¢a, koja se zovepretpostavljena vrijednost (eng. default value). Kad poziv funkcije nema argument koji odgovaratakvom slobodnom parametru, onda se identikator argumenta povezuje s tom pretpostavljenom, iliizra£unatom, vrijednosti.Treba primjetiti da se isti objekt, pretpostavljena vrijednost, povezuje sa slobodnim parametromkad god u pozivu funkcije nema pridruºenog argumenta. Ovo dakako, moºe biti nezgodno, ako jepretpostavljena vrijednost promjenljivi objekt, a tijelo funkcije mijenja taj parametar. Na primjer:def f(x, y=[ ]):y.append(x)return yprint f(23) # ispisuje se: [23]prinf f(42) # ispisuje se: [23,42]Druga naredba print ispisuje [23,42] zato jer prvi poziv funkcije f mijenja vrijednost y, koja jeprije bila prazna lista [], a onda dodavanjem 23 poprima tu novu (a pretpostavljenu) vrijednost, panovi poziv uzima zadnje stanje argumenta. Ako je potrebno povezati y s novim objektom liste svakiput kada se f poziva s jednim argumentom, koristi se sljede¢e:def f(x, y=None):if y is None: y = [ ]y.append(x)return yprint f(23) # ispisuje se: [23]prinf f(42) # ispisuje se: [42]Na kraju formalnih parametara u deniciji funkcije, dopu²teno je koristiti jedan ili oba posebnaoblika: *identifikator1 i **iidentifikator2. Ako su obadva na raspolaganju, onaj s dvije zvjezdicemora do¢i zadnji. Parametar *identifikator1 omogu¢uje da poziv funkcije moºe osigurati dodatnepozicijske argumente, dok **identifikator2 omogu¢uje da poziv funkcije moºe osigurati dodatneargumente s imenom. Na taj na£in rje²avaju se pozivi funkcija s promjenljivim, varijabilnim brojemargumenata. Svaki poziv funkcije povezuje identifikator1 s n-tercem £iji su £lanovi dodatni pozicijskiargumenti (ili praznim n-tercem, ako ih nema). Identifikator2 povezuje se s rje£nikom £iji su £lanoviimena i vrijednosti dodatnih argumenata koji se imenuju (ili praznim rje£nikom, ako ih nema). Evokako se pi²e funkcija koja prihva¢a bilo koji broj argumenata i vra¢a njihov zbroj:def zbroj(*broj):rez = 0for x in broj: rez += xreturn rezprint zbroj(23,42) # ispisuje se: 65print zbroj(23,42,15) # ispisuje se: 80Oblik ** dopu²ta konstrukciju rje£nika s klju£evima stringa u obliku koji se lak²e £ita nego standardnarje£ni£ka sintaksa:
6.3. Atributi funkcijskih objekata 53def vbr_rj(**kwds): return kwdsprint vbr_rj(a=23, b=42)# ispisuje se: {'a':23, 'b':42}Treba primjetiti da se tijelo funkcije vbr_rj sastoji od samo jedne jednostavne naredbe, tako da semoºe staviti u istu liniju kao i naredba def. Dakako, bilo bi jednako to£no (i moºda £itljivije) ako bi sefunkcija vbr_rj ispisala koriste¢i dvije linije umjesto jedne:def vbr_rj(**kwds):return kwdsMoºe se takožer denirati rje£nik £iji su klju£evi i vrijednosti funkcije, a onda na£initi rje£nikdvosmjernim:inverse = {sin:asin, cos:acos, tan:atan, log:exp}for f in inverse.keys( ): inverse[inverse[f]] = fNa taj na£in za odreženu funkciju moºe se brzo na¢i inverzna funkcija. ƒinjenica da su funkcijeobjekti u <strong>Python</strong>u, £esto se izraºava rije£ima da su funkcije objekti prve klase.6.3 Atributi funkcijskih objekataNaredba def denira atribute i tijelo objekta funkcije. Atribut func_name, kojem se moºe pristupiti i kao__name__, je samo£itaju¢i (engl. read-only) atribut (pa poku²aj njegovog mijenjanja podiºe iznimku)koji se odnosi na identikator kori²ten kao ime funkcije u naredbi def. Atribut func_defaults, kojise moºe ponovno povezati ili re-povezati, odnosi se na n-terac pretpostavljenih vrijednosti za slobodneparametre (ili prazan n-terac, ako funkcija nema slobodnih parametara). Jo² jedan funkcijski atribut jedokumentacijski string (engl. documentation string), takožer poznat kao docstring. Docstring atributfunkcije moºe se koristiti kao func_doc ili __doc__. Ako je prva naredba u tijelu funkcije string literal,compiler povezuje taj niz sa docstring atributom funkcije. Docstring se £esto proteºu preko nekolikozi£kih linija, te se stoga obi£no ozna£uju kao string literali unutar trostrukih navodnika. Na primjer:def zbroj(*brojevi):'''Prihvati bilo koji broj numeri£kih argumenata i vrati njihov zbrojArgumenti su n-terac ili lista od jednog ili vi²e brojeva. Izlaz je njihov zbroj. '''rez = 0for broj in brojevi: rez += brojreturn rezDokumentacijski nizovi vaºan su sadrºaj svakoga <strong>Python</strong> kôda. Njihova je uloga sli£na komentarimau bilo kojem programskom jeziku, ali im je iskoristivost ²ira, jer su dostupni pri procesu pokretanja programa(engl. runtime). Programerska okruºenja i drugi alati mogu koristiti docstring-ove funkcijskih,klasnih i modularnih objekata da podsjete programera kako koristiti te objekte. To zna£i da djelujukao pomo¢ (engl. help) programa. Da bi se docstring u£inio ²to korisnijim, trebalo bi po²tovati nekolikojednostavnih dogovora. Prva linija docstringa trebala bi biti saºeti opis svrhe funkcije, a po£injalabi s velikim slovom i zavr²avala to£kom. Unutar nje se ne bi trebalo spominjati ime funkcije, osimako ime nije rije£ iz prirodnog, govornog jezika pa dolazi kao dio opisa operacije te funkcije. Ako jedocstring protegnut preko vi²e linija, druga linija trebala bi biti prazna, a sljede¢e linije bi trebale formiratijedan ili vi²e odlomaka, odvojenih praznim linijama, koji opisuju o£ekivane argumente funkcije,potrebne uvjete, izlazne (povratne) vrijednosti, te mogu¢e nuspojave. Daljnja obja²njenja, knjiºevnereference, te primjeri kori²tenja (koji se mogu provjeriti sa doctest) mogu po slobodnom izboru slijeditiiza, prema zavr²etku docstring-a. Uz ove predenirane atribute, funkcijskom objektu mogu se dodatii drugi atributi. Da bi se stvorio atribut objekta funkcije, prikladna atributna vrijednost se nakon