12.07.2015 Views

Python

Python

Python

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

Mario EssertDigitalni udºbenik<strong>Python</strong>- osnove -Odjel za matematikuSveu£ili²ta Josipa Jurja StrossmayeraOsijek, 2007.


SadrºajSadrºaj 31 <strong>Python</strong> interpreter 71.1 Jezi£ne zna£ajke . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71.2 Izvoženje <strong>Python</strong> programa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81.3 Na² prvi <strong>Python</strong> program . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92 Tipovi podataka 112.1 Brojevi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142.2 Nizovi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152.2.1 Stringovi - nizovi alfanumeri£kih znakova . . . . . . . . . . . . . . . . . . . . . . 152.2.2 N-terac . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172.2.3 Lista . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172.3 Temeljne operacije i metode s nizovima . . . . . . . . . . . . . . . . . . . . . . . . . . . 182.3.1 Ugražene metode string-ova . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192.3.2 Ugražene metode listi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212.4 Rje£nik . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222.4.1 Ugražene metode rje£nika . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222.5 Skup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233 Izrazi, operatori i operacije 253.1 Varijable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253.2 Naredbe pridruºivanja . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253.2.1 Obi£na pridruºba . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263.2.2 Pro²irena pridruºba . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273.2.3 Naredba del . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273.2.4 Bool-ove vrijednosti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283.3 Operatori i operacije . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283.3.1 Numeri£ke i aritmeti£ke operacije . . . . . . . . . . . . . . . . . . . . . . . . . . . 303.3.2 Prisilna i eksplicitna pretvorba . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303.3.3 Usporedba . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313.3.4 Operacije na bitovima cijelih brojeva . . . . . . . . . . . . . . . . . . . . . . . . . 313.4 Operacije na nizovima . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313.4.1 Kri²ka (eng. slicing) niza . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323.4.2 Stacionarne operacije na listi i rje£niku . . . . . . . . . . . . . . . . . . . . . . . 333.5 Naredba Print . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334 Programsko upravljanje 354.1 Naredba if . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 354.2 Naredba while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364.3 Naredba for . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 373


4.4 Iteratori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 384.5 Funkcije range i xrange . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 394.6 Saºete liste . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 394.7 Naredba break . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 405 Iznimke 415.1 Vrste iznimki . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 415.2 Rad s iznimkama . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 455.3 Obradba iznimki . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 465.3.1 Ignoriranje iznimke . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 475.3.2 Pronalaºenje argumenta iznimke . . . . . . . . . . . . . . . . . . . . . . . . . . . 475.3.3 Obradba svih iznimki . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 475.3.4 Pokretanje programskog koda bez prisustva iznimke . . . . . . . . . . . . . . . . 475.3.5 Obradba vi²e iznimki . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 485.3.6 Pokretanje obaveznog kôda za £i²¢enje . . . . . . . . . . . . . . . . . . . . . . . . 485.3.7 Eksplicitno podizanje iznimke . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 485.4 Korisni£ki denirane iznimke . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 495.4.1 Tvorba iznimki . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 495.4.2 Dijagnosti£ko pridruºivanje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 506 Funkcije 516.1 Naredba 'def' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 516.2 Parametri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 526.3 Atributi funkcijskih objekata . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 536.4 Naredba 'return' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 546.5 Poziv funkcije . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 546.5.1 Prijenos argumenata . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 546.5.2 Vrste argumenata . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 556.5.3 Prostor imena . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 566.5.4 Naredba 'global' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 566.6 Ugnjeºžene funkcije . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 567 <strong>Python</strong> - objektni jezik 597.1 Klase i instance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 597.2 Naredba 'class' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 607.3 Tijelo klase . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 607.3.1 Atributi klasnog objekta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 607.3.2 Denicija funkcije unutar tijela klase . . . . . . . . . . . . . . . . . . . . . . . . . 617.3.3 Varijable speci£ne za klasu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 627.3.4 Dokumentacijski string . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 627.4 Instanca klase . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 627.4.1 __init__ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 637.4.2 Atributi objekta instance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 637.4.3 Tvorni£ka funkcija . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 647.4.4 Brojanje referenci i brisanje instance . . . . . . . . . . . . . . . . . . . . . . . . . 657.5 Naslježivanje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 657.5.1 Premo²¢uju¢i atributi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 667.5.2 Posluºivanje metoda superklase . . . . . . . . . . . . . . . . . . . . . . . . . . . . 677.5.3 Vi²eobli£je . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 677.5.4 Skrivanje informacije (engl. information hiding) . . . . . . . . . . . . . . . . . . . 677.5.5 Operatorsko punjenje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 687.6 Testovi pripadnosti klasa i tipova . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69


SADRšAJ 58 Moduli i paketi 718.1 Modul . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 718.1.1 Traºenje modula . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 738.1.2 U£itavanje modula i compilacija . . . . . . . . . . . . . . . . . . . . . . . . . . . 738.1.3 Ponovno punjenje modula . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 748.2 Paketi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 749 Ulaz i izlaz 779.1 ƒitanje naredbene linije i varijable okoli²a . . . . . . . . . . . . . . . . . . . . . . . . . . 779.2 Datoteke . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 789.3 Standardni ulaz, izlaz i pogre²ka (engl. Input, Output, Error) . . . . . . . . . . . . . . . 799.4 Naredba print . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 809.5 Otpornost . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81Literatura 83


POGLAVLJE 1<strong>Python</strong> interpreter<strong>Python</strong> je interpreterski, interaktivni, objektu orjentirani programski jezik, kojeg je 1990. godine prvirazvio Guido van Rossum. Ve¢ do konca 1998., <strong>Python</strong> je imao bazu od 300.000 korisnika, a od 2000.ve¢ su ga prihvatile ustanove kao MIT, NASA, IBM, Google, Yahoo i druge. <strong>Python</strong> ne donosi nekenove revolucionarne zna£ajke u programiranju, ve¢ na optimalan na£in ujedinjuje sve najbolje ideje ina£ela rada drugih programskih jezika. On je jednostavan i snaºan istodobno. Vi²e nego drugi jezici onomogu¢uje programeru vi²e razmi²ljanja o problemu nego o jeziku. U neku ruku moºemo ga smatratihibridom: nalazi se izmežu tradicionalnih skriptnih jezika (kao ²to su Tcl, Schema i Perl) i sistemskihjezika (kao ²to su C, C++ i Java). To zna£i da nudi jednostavnost i lako kori²tenje skriptnih jezika(poput Matlab-a), uz napredne programske alate koji se tipi£no nalaze u sistemskim razvojnim jezicima.<strong>Python</strong> je besplatan (za akademske ustanove i neprotnu upotrebu), open-source software, s izuzetnodobrom potporom, literaturom i dokumentacijom.1.1 Jezi£ne zna£ajkeInterpretacija mežukôda<strong>Python</strong> kôd sprema se u tekst datoteke koje zavr²avaju na .py. Program kompilira kôd uniz bytecode-ova koji se spremaju u .pyc datoteke koje su prenosive na bilo koje platformegdje se mogu izvoditi interpretacijom tog mežukôda. Na sli£an na£in izvr²ava se Java kôd -interpretacijom mežukôda. Brzina izvoženja <strong>Python</strong> kôda istog je reda veli£ine kao u Javi iliPerlu. <strong>Python</strong> je napisan u ANSI C i raspoloºiv za cijeli niz strojeva i operacijskih sustavauklju£uju¢i Windows, Unix/Linux i Macintosh.Jezik visoke razineOsim standardnih tipova podataka (brojevi, nizovi znakova i sl.) <strong>Python</strong> ima ugraženetipove podataka visoke razine kao ²to su liste, n-terci i rje£nici.Interaktivnost<strong>Python</strong> se moºe izvoditi u razli£itim okruºenjima. Za razvitak programa najlak²i je interaktivnina£in rada u kojem se programski kôd pi²e naredbu za naredbom. Ne postoji razlika urazvojnom i izvedbenom (engl. runtime) okoli²u: u prvom se izvodi naredba za naredbom ,a u drugom odjednom £itava skripta.ƒista sintaksa7


8 <strong>Python</strong> interpreterSintaksa jezika je jednostavna i o£evidna. Uvlake zamjenjuju posebne znakove za deniranjeblokova kôda, pa je napisani program vrlo pregledan i jednostavan za £itanje.Napredne zna£ajke jezika<strong>Python</strong> nudi sve zna£ajke o£ekivane u modernom programskom jeziku: objektu orijentiranoprogramiranje s vi²estrukim naslježivanjem, dohva¢anje izuzetaka ili iznimki (engl. exception),redeniranje standardnih operatora, pretpostavljene argumente, prostore imena (engl.namespaces), module i pakete.Pro²irivost<strong>Python</strong> je pisan u modularnoj C arhitekturi. Zato se moºe lako pro²irivati novi zna£ajkamaili API-ima. (engl. application programming interface).Bogate knjiºnice programaPotpora<strong>Python</strong>ova knjiºnica (engl. library), koja uklju£uje standardnu instalaciju, uklju£uje preko200 modula, ²to pokriva sve od funkcija operacijskog sustava do struktura podataka potrebnihza gradnju web-servera. Glavni <strong>Python</strong> web site (www.python.org) nudi saºeti indexmnogih <strong>Python</strong> projekata i razli£itih drugih knjiºnica.<strong>Python</strong> ima veliku entuzijasti£ku zajednicu korisnika koja se svake godine udvostru£uje.1.2 Izvoženje <strong>Python</strong> programa<strong>Python</strong> kôd moºe se izvoditi na vi²e na£ina:Interaktivni radTo je naj£e²¢i na£in rada kod pisanja novih programa, a zapo£inje pozivom python u Linux-u,odnosno dvostrukim klikom na ikonicu u Windows okruºenju. U MS-DOS okruºenju,<strong>Python</strong> se poziva isto kao u Unix-u/Linux-u, jedino je sistemski znak (engl. prompt) druga£iji.Pozivom interpetera otvara se njegova okolina, npr. pod <strong>Python</strong>Win-om:<strong>Python</strong>Win 2.5 (r25:51908, Sep 19 2006, 09:52:17) [MSC v.1310 32 bit (Intel)] on win32.Portions Copyright 1994-2006 Mark Hammond - see 'Help/About <strong>Python</strong>Win'for further copyright information.>>>ili pod Linux-om:$ python<strong>Python</strong> 2.5 (r25:51908, Oct 6 2006, 15:24:43)[GCC 4.1.2 20060928 (prerelease) (Ubuntu 4.1.1-13ubuntu4)] on linux2Type "help", "copyright", "credits" or "license" for more information.>>>Interepreter dakle ispisuje svoj prompt >>>, iza kojeg korisnik unosi (utipkava) naredbu, akoju zavr²a s ENTER tipkom (ili Return tipkom). Zatim <strong>Python</strong> izvodi tu naredbu, ispisujerezultat i ponovo ispisuje prompt o£ekuju¢i novu naredbu:>>> print 'Znam zbrojiti: 1+2 =', 1+2Znam zbrojiti: 1+2 = 3>>>


1.3. Na² prvi <strong>Python</strong> program 9Na ovaj na£in <strong>Python</strong> se moºe koristiti kao jednostavan, ali i vrlo sloºen kalkulator.U slu£aju naredbi koje pretpostavljaju daljnje naredbe u nastavku, npr. naredbe petlje (for,while, ...), <strong>Python</strong> interpreter ispisuje '...' i automatski £ini uvlaku za nove naredbe. UWindows okruºenju postoji vi²e gra£kih rje²enja za interaktivan rad. U instalacijskompaketu s <strong>Python</strong>om dolazi IDLE kojeg je razvio <strong>Python</strong>-ov autor. IDLE koristi TkinterGUI framework i prenosiv je na sve <strong>Python</strong> platforme koje imaju Tkinter potporu.Bolja rje²enja od IDLE-a su <strong>Python</strong>Win, PyScripter i novija, koja korisniku daju punogra£kih rje²enja za jednostavnu <strong>Python</strong> upotrebu kako u interaktivnom tako i u skriptnomradu.Skriptni radProgrami se spremaju u skripte s pomo¢u obi£nog text editora ili <strong>Python</strong> orjentiranog gra-£kog okruºenja, a onda se kao Unix/Linux ili Windows skripte pozivaju iz sistemske linije.Ako smo na primjer gornju naredbu (ili vi²e njih) spremili u datoteku-skriptu 'moj.py', ondase pozivom:python moj.pyskripta izvodi i na zaslonu se dobije rezultat: Znam zbrojiti:bio isti onaj utipkan u interaktivnom radu.Umetnuti (embeded) kôd1+2 = 3 jer je kôd skripteIako se £e²¢e unutar <strong>Python</strong>a mogu pozivati funkcije iz drugih programa (npr. C-a za slu£ajprogramskog ubrzanja), mogu¢e je <strong>Python</strong> kôd u obliku izvornih tekst naredbi izvoditi iunutar programa pisanog u drugom programskom jeziku, koriste¢i <strong>Python</strong> runtime API, naprimjer unutar C-programa:#include . . .Py_Initialize();PyRun_SimpleString("x = a + 2*pi");1.3 Na² prvi <strong>Python</strong> programNeka se na po£etku promotri jedan primjer <strong>Python</strong> programa, kako bi se uo£ila svojstva i na£in pisanjaprogramskog kôda.,from random import randintgotovo = False ; korak =0broj = randint (1, 100)while not gotovo :x=int( raw_input (" Pogodi zamisljeni broj :"))if x== broj :print 'Cestitamo !'gotovo = True ;elif x< broj :print ('Pucaj navise !')else :print ('Pucaj nanize !')korak +=1print 'Pogodak iz %d. puta .' % korak


10 <strong>Python</strong> interpreterPrva linija programa uvla£i (engl. import) iz modula random funkciju randint() s kojom ¢e segenerirati slu£ajan cijeli broj. Varijabla 'gotovo' postavlja se u Bool-ovo stanje neistine (engl. False),a varijabla 'korak' inicijalizira se sa 0. Znak ';' sluºi za odvajanje naredbi pisanih na istoj liniji. Uvarijablu 'broj' sprema se slu£ajni broj (izmežu 1 i 100), kojeg korisnik pogaža. Kako se vidi, postojipetlja while koju program u izvoženju vrti sve dok varijala gotovo ne postane istinita, tj. True, ato se dogadja kad zami²ljeni 'broj' bude jednak, od korisnika izabranoj, vrijednosti varijable 'x'. Uslu£aju da to nije ispunjeno, program 'pomaºe' korisniku savjetom da pogaža navi²e ili naniºe. Pritomse varijabla 'korak' svaki put pove¢ava za 1, kako bi na koncu, nakon £estitke, bilo ispisano i kolikokoraka je trebalo da se do nje dože.Treba primjetiti kako u <strong>Python</strong>u ne postoje oznake po£etka i konca bloka naredbi (kao ²to su toviti£aste zagrade u C-jeziku ili begin-end u Pascal-u), nego se to ostvaruje uvlakama. Na taj na£inkorisnik je prisiljen pisati strukturirani kod, lagan za £itanje. Sve upravlja£e naredbe (if, while, elsei sl.) zavr²avaju sa znakom dvoto£ke (':'). Treba takožer uo£iti kako je rad sa ulazom i izlazom u<strong>Python</strong>u jednostavan (poput Basic-a) - postoje dvije funkcije: row_input() za ulaz i print za izlaz.Prva ispisuje poruku korisniku i u£itava niz znakova (string) koji korisnik upi²e, a druga samo ispisujestring i/ili sadrºaj varijabli. Mogu¢e je takožer i formatiranje izlaza (zadnja print naredba).


POGLAVLJE 2Tipovi podatakaRa£unalni program je algoritam zadan programskim naredbama koje se izvr²avaju nad nekom vrstom ilitipom (binarno spremljenih) podataka. Sve podat£ane vrijednosti u <strong>Python</strong>u predstavljene su objektima,pa se za <strong>Python</strong> s pravom kaºe: "Sve je objekt". Svaki objekt moºe imati najvi²e £etiri svojstva:• identitet - adresa u memoriji gdje je objekt spremljen• tip - veli£ina memorijskog prostora kojeg objekt zauzima i na kojem se stanovite metode (obrade)mogu tj. smiju obavljati• vrijednost - sadrºaj memorijskog prostora spremljenog objekta• metodu - programski kôd koji se primjenjuje na vrijenosti(ma) objektaIdentitet i tip objekta su nepromjenljive veli£ine i deniraju se stvaranjem, generiranjem, objekta. Svakiobjekt moºe imati jednu ili vi²e vrijednosti, te jednu ili vi²e metoda. Neki objekti dolaze se <strong>Python</strong>interpreterom, zovemo ih ugraženi objekti (engl. built-in objects), a druge stvara sâm korisnik preko<strong>Python</strong> klasa. Vrijednosti objekta £esto se zovu atributi. Dohva¢anje atributa u objektu ostvarujese sintaksom obj.atr, gdje je obj ime objekta, a atr ime atributa. Objekti kojima se vrijednost(i)mogu mijenjati bez promjene identiteta zovu se promjenljivi (engl. mutable) objekti, a oni kojimase vrijednost ne moºe mijenjati bez stvaranja novog objekta istog tipa zovu se nepromjenljivi (engl.immutable) objekti. Promjena vrijednosti objekta obi£no se dogaža pridruºivanjem razli£itih literalaili djelovanjem metode na vrijednost objekta. Literal ozna£uje vrijednost podatka koja se neposredno,direktno, pojavljuje u programskoj naredbi:2347 # Cjelobrojni literal13.514 # Realni (Floating-point) literal5.0J # Imaginarni literal'hello'# String literal, niz znakovaOsim alfanumeri£kih znakova za brojeve i stringove, <strong>Python</strong> koristi i posebne simbole i to kao meža²eili grani£nike (npr. za po£etak i zavr²etak string literala koristi simbole jednostrukih, dvostrukih ilitrostrukih navodnika) ili kao simbole aritmeti£ko-logi£kih i odnosnih (relacijskih) operatora. Simbol '#'koristi se za po£etak komentara i ne obražuje se od strane <strong>Python</strong> interpretera: sve napisano u linijeiza njega, udesno, interpreter ne¢e obraživati. Meža²i sluºe i kod denicije sloºenih tipova, od kojih senaj£e²¢e koriste:[ 63, 'faks', 8.6 ] # Listina, lista ili popis (engl. list)( 450, 320, '600' ) # n-terac (engl. tuple){ 'a':72, 'b':1.4 } # rje£nik (engl. dictionary)11


12 Tipovi podatakaTipovi objekata mogu se sloºiti u kategorije (tablica 2.1), pa razlikujemo brojeve, nizove, klase, datoteke,module i sl. Neki objekti su promjenljivi (npr. liste), a neki nisu (npr. stringovi).Tablica 2.1: Ugraženi (built-in) tipovi u <strong>Python</strong> programskom jezikuKategorija tipapodatakaIme tipa podatkaOpisPrazno (None) NoneType 'null' objektBrojevi IntType Cijeli brojLongTypeDugi cijeli brojRealni broj s pom.FloatTypezarezomComplexTypeKompleksni brojNizovi StringType Niz znakova (string)UnicodeTypeUnicode (string)ListTypeListina, popis ili listaTupleTypen-teracXRangeTypeVra¢eno iz xrange()BufferTypeVra¢eno iz buer()Preslikavanje DictType Rje£nikKlase, razredi ClassType Denicija klaseInstanca klase, objekt InstanceType Stvaranje instanceDatotekaFileTypeDatoteka - podaci namedijuModuli ModuleType Modul (skup objekata)Objekti koji seBuiltinFunctionType Ugražene funkcijepozivajuBuiltinMethodTypeUgražene metodeClassTypeObjekt klaseFunctionTypeKorisni£ka funkcijaInstanceTypeInstanca klase, objektMethodTypeOgrani£ena metodaUnboundMethodTypeNeograni£ena metodaNutarnji tipovi CodeType Byte-compilirani kôdFrameTypeIzvedbeni okvirTracebackTypeSloºaj slijeda izuzetakaSliceTypeTip kri²ke (odlomka)EllipsisType Pro²ireni odlomci ()<strong>Python</strong> program pristupa vrijednostima objekata preko njihovih identiteta, tj. njihovih adresnihreferenci. Referenca je broj, adresa memorije, na kojoj je spremljena vrijednost objekta. Vrijednostobjekta £esto se jo² zove atribut objekta. Atributi sloºenih tipova (npr. liste, stringa ili rje£nika) £estose jo² zovu £lanovi (engl. items).Identitet ili adresna referenca objekta sprema se u memorijsku lokaciju koja se zove varijabla. Varijablamoºe pokazivati na spremljeni literal, na isti na£in kao i na objekt koji ima vi²e vrijednosti(sadrºajamemorijske lokacije) i/ili vi²e metoda. Svaka varijabla sa svojim sadrºajem moºe postojati samostalno,a moºe biti i ugražena u neki objekt. Dohva¢anje varijable, tj. njezinog sadrºaja iz objekta postiºe sesa obj.x, gdje je obj ime objekta, a x je ime varijable.Jedna ili vi²e <strong>Python</strong> programskih naredbi moºe se spremiti u funkciju. Razlikuju se ugražene (engl.built-in) i korisni£ke funkcije. Funkcije, zajedno s podacima, grupiraju se u klase. Funkcije deniraneunutar klasa, zovu se metode. Od klase moºe nastati jedan ili vi²e objekata.Korisni£ke funkcije denira korisnik, a ugražene dolaze s <strong>Python</strong> interpreterom. Dakako, i funkcija jeobjekt. Ona se moºe postojati samostalno, a moºe biti ugražena unutar onekog drugog objekta. Metoda


Tipovi podataka 13se iz klase/objekta dohva¢a sa obj.fun(), gdje je klasa/obj ime objekta, a fun()je ime funkcije. Unutarokruglih zagrada mogu se pozvati argumenti, odnosno parametri funkcije. Funkcija moºe imati ulazneargumente i vra¢ati izlazne vrijednosti.Na primjer, provjera tipa nekog objekta ostvaruje se pozivom ugražene funkcije type():>>> type("Zanimljivi <strong>Python</strong> svijet!") # string literal>>> type(512) # numeri£ki literal>>> k=2.178 # varijabla k>>> type(k)>>> type ({ 'a':72, 'b':1.4 })>>> z=2+3j # varijabla z>>> type(z)Objekti (varijable, funkcije, klase i dr.) s programskim naredbama koje na njima rade mogu sespremati u module, a moduli u pakete. Modul se u memoriju u£itava s pomo¢u naredbe 'import'.import sys# ucitava se modul sistemskih funkcijaPojedina£ni podatak ili funkcija iz modula dohva¢a se naredbom 'from ... import ... ' :from math import sin, cos# u£itavaju se samo sin() i cos() funkcijeDohva¢anje vrijednosti podatka preko atributa objekta postiºe se sintaksom 'objekt.atribut'.Objekt moºe imati vi²e atributa. U slu£aju da je atribut neka funkcija, odgovaraju¢a sintaksa je'objekt.atribut()'.>>>import math>>> print math.pi, math.sin(2.3)3.14159265359 0.745705212177Dohva¢anje vrijednosti podatka preko £lanova, £esto se naziva indeksiranje i odnosi se samo nastrukturirane tipove podataka (liste, stringove i sl.). Indeksacija po£inje s nultim (0) indeksom.>>> x=[1, 3, 9, 16] # lista s £etiri podatka>>> print x[3] # dohva¢anje tre¢eg podatka16Vrijednost reference (njena adresa u memoriji) moºe se doznati pozivom funkcije id(). Pridruºivanjemobjekata referenca se ponavlja, tj. objekti se ne dupliciraju. U memoriji ostaje samo jedanpodatak, a dvije varijable pokazuju na njega (imaju njegovu adresu).>>> a=123>>> id(a)3695888>>> b=a # pridruºba b sa a; objekt se ne kopira, samo adresa>>> b123>>> id(b) # b kao i a pokazuje na istu memorijsku adresu3695888>>> a=a+1 # stvoren je novi objekt>>> print 'a=',a,' b=',ba= 124 b= 123


14 Tipovi podataka>>> print 'id(a)=',id(a),' id(b)=',id(b) # ne pokazuju isto!id(a)= 3695876 id(b)= 3695888Izraz (engl.expression) je kombinacija vrijednosti (literala), varijabli i operatora. Vrijednost izra£unatogizraza ispisuje se na zaslon ra£unala kori²tenjem naredbe ili funkcije print:>>> print 'gruba aproksimacija pi = ', 22./7gruba aproksimacija pi = 3.14285714286Programske naredbe <strong>Python</strong>a temelje se na pridruºivanju (objekata referencama), upravljanju tijekomprograma (if, else,...), programskim petljama (for, while, ...) i pozivima funkcija i klasa.Identikator je ime objekta, tj. ime varijable, funkcije, klase i sl. Identikatori ne smiju koristitineku od 30 klju£nih rije£i <strong>Python</strong>-a (tablica 2.2), jer su one pridruºene osnovnim <strong>Python</strong> naredbama.Tablica 2.2:<strong>Python</strong> klju£ne rije£iand del for is raiseassert elif from lambda returnbreak else global not tryclass except if or whilecontinue exec import pass withdef finally in print yield2.1 BrojeviUgraženi brojevni objekti u <strong>Python</strong>u podrºavaju cijele brojeve (obi£ne i duga£ke), brojeve s pomi£nimzarezom (realne brojeve) i kompleksne brojeve. Objekti brojeva u <strong>Python</strong>u su nepromjenljivi (immutable)objekti, ²to zna£i da bilo kakva aritmeti£ka operacija na brojevnom objektu, uvijek stvara novibrojevni objekt.>>> a=1234>>> id(a)19431452>>> a=a+0>>> id(a)18681652>>> print a1234Literali cijelih brojeva mogu biti decimalni, oktetni, ili heksadecimalni. Decimalni literal je predstavljennizom znamenki gdje je prva znamenka razli£ita od nule. Oktetni literal je odrežen s po£etnom0 iza koje ide niz oktetnih znamenki (0 do 7). Na sli£an na£in heksadecimalni literal koristi po£etni niz0x nakon £ega slijedi niz heksadecimalnih znamenki (0 do 9 i A do F bilo velikim ili malim slovom).Na, primjer:1, 23, 3493 # Decimalni cijeli brojevi01, 027, 06645 # Oktetni cijeli brojevi0x1, 0x17, 0xda5 # Heksadecimalni cijeli brojeviBilo kojem literalu cijelog broja moºe moºe se dodati slovo 'L' ili 'l' kako bi se ozna£io duga£ki cijelibroj (long integer). Na primjer:


2.2. Nizovi 151L, 23L, 99999333493L # Duga£ki decimalni cijeli brojevi01L, 027L, 01351033136165L # Duga£ki oktetni cijeli brojevi0x1L, 0x17L, 0x17486CBC75L # Duga£ki heksadec. cijeli brojeviRazlika izmežu duga£kog i obi£nog cijelog broja je u tome ²to duga£ki cijeli broj nema predodreženunumeri£ku granicu; moºe biti toliko dug koliko ra£unalo ima memorije. Obi£an cijeli broj uzima nekolikookteta memorije i ima minimalnu i maksimalnu vrijednost koju diktira arhitektura stroja. sys.maxinitje najve¢i dostupni obi£an cijeli broj, dok je sys.maxinit-1 najve¢i negativni.>>> print sys.maxint # za uobicajeni stroj najveci cijeli broj je2147483647>>> 2L**500 # 2 na 500-tu potenciju 3273390607896141870013189696827599152216642046043064...7894832913680961337964046745548832700923259041571508866841275600710092172565458853...93053328527589376LRealni literal (broj s pomi£nim zarezom) predstavljen je nizom decimalnih znamenki koje uklju£ujudecimalni zarez, tj. to£ku (.), exponent (e ili E, te + ili - iza, s jednom ili vi²e znamenki na kraju), ilioboje. Vode¢i znak decimalnog literala ne smije biti e ili E, a moºe biti bilo koja znamenka ili to£ka(.). Na primjer:0., 1.0, .2, 3., 4e0, 5.e0, 6.0e0<strong>Python</strong>ova decimalna vrijednost odgovara uobi£ajena 53 bita preciznosti na modernim ra£unalima.Kompleksni broj sastavljen je od dviju decimalnih vrijednosti, jedne za realni, a druge za imaginarnidio. Mogu¢e je pristupiti dijelovima kompleksnog objekta z kao samo-£itaju¢im "read-only" atributimaz.real i z.imag. Imaginarni literal dobije se dodavanjem znaka 'j' ili 'J' realnom literalu:1j, 1.j, 1.0j, 1e0j, 1.e0j, 1.0e0jZnak J (ili j) na kraju literala ozna£uje kvadratni korijen od -1, ²to je uobi£ajena oznaka imaginarnogdijela u elektrotehni£koj praksi (neke druge discipline koriste znak 'i' u tu svrhu, ali <strong>Python</strong> je izabraoba² znak j).Treba primijetiti da brojevni literali ne uklju£uju predznak: ako postoji + ili - ispred broja, ondasu to posebni operatori.x=input('Upi²ite prvi prirodni broj: ') y=input('Upi²ite drugi prirodni broj: ')print "1) print "2)> 1) 12 : 15 = 0 i ostatak 12 2) 12 : 15 = 0.800000 >2.2 NizoviNiz je spremnik (engl. container) £lanova (engl. items) koji se indeksiraju ili dohva¢aju ne-negativnimcijelim brojevima. <strong>Python</strong> pruºa tri ugražene (engl. built-in) vrste nizova za stringove (obi£ne i Unicode),n-terace, i liste. Knjiºni£ki i ekstenzijski moduli pruºaju druge vrste nizova, a korisnik takožermoºe sam napisati svoje. Nizovi se mogu obraživati na vi²e na£ina.2.2.1 Stringovi - nizovi alfanumeri£kih znakovaUgraženi objekt string je poredan skup znakova koji se koristi za skladi²tenje i predstavljanje podatakana tekstovnoj bazi. Nizovi znakova u <strong>Python</strong>u su nepromjenljivi (engl. immutable), ²to zna£i da senovom operaciijom na nizu znakova, uvijek proizvede novi niz, a ne modicira stari. Objekti stringaimaju ugraženo vi²e metoda.Literalni niz znakova moºe biti pod navodnicima jednostrukim, dvostrukim ili trostrukim navodnicima.String u navodnicima je niz od nula ili vi²e znakova unutar identi£nih znakova navodnika. Naprimjer:


16 Tipovi podataka'Ovo je string literal'"Ovo je novi string literal"Dvije razli£ite vrste navodnika imaju identi£nu funkciju. Mogu se koristiti tako da apostroramo stringunutar stringa, ²to je £esto jednostavnije nego apostrorati string upotrebom posebnog znaka (\'za jednostruki ili\"za dvostruki navodnik):' jel\' me netko trazio?' # eksplicitni navodnik u stringu" jel' me netko trazio?" # Na ovaj nacin je citljivijeAko se string ºeli prikazati u vi²e linija, onda se na koncu svake linije stavlja znak lijeve kose crte(\):"Ovo je prva, \a ovo druga linija istog stringa"# Komentar nije dopusten na# liniji sa znakom \U stringu se dakako mogu umetati i posebni znakovi (\n za novu liniju, \t za tabulator i sl.), ako setakav niz ºeli programom ispisivati:"Ovo je prva, \na ovo druga linija istog stringa"Drugi pristup je uporaba stringa s trostrukim navodnicima, koji se dobiju trostrukim ponavljanjemjednostrukih (') ili dvostrukih navodnika (""")."""A ovo je jedan duuugi stringkoji se proteze na vise linija,u ovom slucaju na tri"""# Komentar dopusten samo na krajuU ovakvom literalu stringa s tri navodnika, automatski su sa£uvani novi redovi, pa se njihovi kontrolniznakovi ne trebaju dodavati u niz. Nije dopu²tena ni upotreba nekih kontrolnih (tzv. 'escape') znakova(tablica 2.3), kao na primjer znaka lijeve kose crte (engl. backslash;)Tablica 2.3: 'Escape' znakoviNiz Zna£enje ASCII/ISO kod\ < novired > Konac linije se zanemaruje Nema ga\\ Kosa crta ulijevo, backslash 0x5c\ ′ Jednostruki navodnik 0x27\” Dvostruki navodnik 0x22\a Zvono, bell 0x07


2.2. Nizovi 17Niz Zna£enje ASCII/ISO kod\b Brisanje ulijevo, backspace 0x08\f Nova stranica, form feed 0x0c\n Nova linija, newline 0x0a\r Skok u novi red, return 0x0d\t Tabulator, tab 0x09\v Vertikalni tabulator 0x0bOktalna vrijednosti ooo (\0000\0oookako je zadanodo \0377)Heksadecimalna vrijednost hh\xhhkako je zadano(\x00 do \xff)\uhhh Unicode vrijednosti Samo za Unicode str.Unicode je novi standard za pisanje znakova. Za razliku od ASCII standarda, novi standard uklju£ujesve znakove iz gotovo svih svjetskih jezika. Unicode literalni string ima istu sintaksu kao obi£ni literalnistring uz dodatak znaka 'u' ili 'U' koji se pi²e odmah ispred po£etnog navodnika. Unicode literalni nizoviznakova mogu koristiti '\u' iza kojeg slijede £etiri heksadecimalne znamenke koje opisuju Unicode znak.>>> a=u'str\xf6m gr\xfcn'>>> print aström grünVi²e string literala bilo koje vrste napisanih u slijedu, compiler ¢e povezati u jedan string objekt.>>> print 'koliko' 'je' 'tu' 'stringov' u'\xe4' '?'kolikojetustringovä?2.2.2 N-teracN-terac je nepromjenljivi niz £lanova. ƒlanovi u n-tercu su bilo koji objekti, istih ili razli£itih tipova. N-terac se denira nabrajanjem objekata odvojenih zarezima (,). Zadnjem £lanu u nizu takodjer se moºedodati zarez. N-terac sa samo jednim £lanom mora imati zarez na kraju, jer ina£e gubi tip n-terca.Prazan n-terac je ozna£en s praznim parom zagrada. £lanovi se mogu grupirati, pa nastaju ugnjeºdenin-terci.(100, 200, 300) # N-terac s tri clana(3.14,) # N-terac sa samo jednim clanom( ) # Prazan n-teracZa generiranje n-terca, osim nabrajanjem, mogu¢e je pozvati i ugraženu funkciju 'tuple()'. Ako jex neki niz, onda tuple(x) vra¢a n-terac s £lanovima jednakima £lanovima niza x.>>> x='abrakadabra'>>> tuple(x)('a', 'b', 'r', 'a', 'k', 'a', 'd', 'a', 'b', 'r', 'a')>>> y='sezame'>>> (x,y)('abrakadabra', 'sezame')2.2.3 ListaLista, listina ili popis je promjenljiv poredani niz £lanova objekata. £lanovi u listi su bilo kakvi objektirazli£itih tipova. Lista se denira nabrajanjem £lanova odijeljenih zarezima (,) i smje²tenih unutaruglatih zagrada ([ ]). Dopu²teno je iza zadnjeg £lana liste, ostaviti jo² jedan zarez. Prazna lista seozna£ava praznim parom uglatih zagrada. Evo nekih primjera:


18 Tipovi podataka[42, 3.14, 'zdravo' ] # Lista s tri £lana[123] # Lista s jednim £lanom['a', [-45j, 'b'], 4.5] # ugnjeºdena lista s tri £lana[ ] # Prazna listaNa sli£an na£in, kao i s generiranjem n-teraca, mogu¢e je pozvati prikladnu funkciju 'list()' za generiranjelisti. Na primjer:>>> a='ovo'>>> b='je'>>> c='lista'>>> d=[a,b,c] # tvorba liste nabrajanjem £lanova>>> print d['ovo', 'je', 'lista']>>> list(d) # tvorba liste pozivom funkcije['ovo', 'je', 'lista']>>> list(a) # tvorba liste pozivom funkcije['o', 'v', 'o']>>> type(d)>>> type(a)Treba primjetiti kako se tvorba listi preko list() funkcije uvijek realizira nad pripadnim tipom objekta.2.3 Temeljne operacije i metode s nizovimaDohva¢anje elementa bilo kojeg niza (stringa, n-terca, liste) postiºe se indeksiranjem. Dio niza, odlomakili kri²ka (engl. slice) dobiva se sintaksom 'i:j' gdje je 'i' po£etni indeks, a 'j' zavr²ni indeks kri²ke(tablica 2.4). Duºina niza dobiva se pozivom funkcije len(), a maksimalni i minimalni £lan niza sfunkcijama max(), odnosno min().s[i]s[i:j]len(s)min(s)max(s)Tablica 2.4: Operacije i metode nad svim nizovima£lanOpisVra¢a element i u nizu sVra¢a kri²ku - niz elemenata od i-tog do j-tog indeksaVra¢a broj elemenata u sVra¢a minimalni elemenat iz sVra¢a maksimalni elemenat iz sPromjenljivi nizovi (liste) imaju mogu mijenjati £lanove ili kri²ke £lanova odjednom, kao i brisati£lanove i skupine £lanova.>>> a=(1,3,5,7,9)>>> print a[0], a[3]1 7>>> b='ovo je string'>>> print b[9],b[0],b[-1]r o g>>> c=[7,'marko',-5,'kompleksni']>>> print c[3],c[1]kompleksni marko


2.3. Temeljne operacije i metode s nizovima 19>>> print len(a),len(b),len(c)5 13 4>>> print max(a), max(b), max(c)9 v marko>>> print min(a), min(b), min(c)1 -5>>> print a[1:3],b[7:12],c[0:2](3, 5) strin [7, 'marko']Treba primjetiti kako se dohva¢anje £lanova preko indeksa u kri²kama ostvaruje od po£etnog indeksado kona£nog, ali koji se pritom isklju£uje, ne uzima u obzir. Negativan indeks pak dohva¢a £lanove odkraja niza. Tako je '-1' indeks za zadnji £lan, '-2' za predzadnji i tako dalje.Budu¢i da se u kategoriji nizova samo liste mogu mijenjati direktno, postoje pridruºbe £lanovimaliste i funkcije brisanja £lanova (tablica 2.5). Obje operacije mogu se izvesti nad pojedina£nim i skupnim£lanovima liste.£lans[i] = vs[i:j] = tdel s[i]del s[i:j]Evo kratkog primjera:Tablica 2.5: Pridruºba i brisanjeOpisPridruºba £lanu na i-tom mjestuPridruºba skupini £lanovaBrisanje £lanaBrisanje skupine £lanova>>> lista=['tko zna','bilje','²iroko mu','polje']>>> lista[1]='bolje'>>> lista['tko zna', 'bolje', '²iroko mu', 'polje']>>> lista[1:3]=[',zna!']>>> lista['tko zna', ',zna!', 'polje']>>> del lista[-1]>>> lista['tko zna', ',zna!']2.3.1 Ugražene metode string-ovaBudu¢i da svaki objekt ima £lanove (varijable) i metode (funkcije), korisno ih je skupno prikazati(tablica 2.6), te isprobati ugraženo. Nabrojene metode nalaze se u modulu 'string', pa u primjerimaprije njihove uporabe treba pozvati naredbu 'from string import *'Metodas.capitalize()s.center(width)Tablica 2.6: String metodeOpisPretvara svako slovo od s u veliko slovo.Centrira string u polju duljine width.


20 Tipovi podatakaMetodas.count(sub[,start[,end]])s.encode([encoding[,errors]])s.endswith(suffix[,start[,end ]])s.expandtabs([tabsize])s.find(sub[,start[,end]])s.index(sub[,start[,end]])s.isalnum()s.isalpha()s.isdigit()s.islower()s.isspace()s.istitle()s.isupper()s.join(t )s.ljust(width )s.lower()s.lstrip()s.replace(old , new[,maxreplace ])s.rfind(sub[,start[,end]])s.rindex(sub[,start[,end]])s.rjust(width)s.rstrip()s.split([sep[,maxsplit]])s.splitlines([keepends])s.startswith(prefix[,start [,end ]])s.strip()OpisBroji pojavljivanja podstringa sub u stringu s.Vra¢a kodiranu ina£icu stringa.Provjerava kraj stringa za sux.Pro²iruje tabulatore praznim mjestima.Pronalazi prvo pojavljivanje zadanogpodstringa sub.Pronalazi prvo pojavljivanje zadanogpodstringa sub uz podizanje izuzetka, ako ganema.Provjerava jesu li svi znakovi alfanumeri£ki.Provjerava jesu li svi znakovi alfabetski.Provjerava jesu li svi znakovi znamenke.Provjerava jesu li svi znakovi pisani malimslovima.Provjerava jesu li svi znakovi praznine.Provjerava jeli string pisan kao naslov (prvoslovo svake rije£i napisano velikim slovom).Provjerava jesu li svi znakovi pisani velikimslovima.Povezuje stringove u listi t koriste¢i s kaomeža².Lijevo poravnanje s u stringu duljine width.Vra¢a s pretvoren u string s malim slovima.Odstranjuje prazna mjesta ispred stringa.Zamjenjuje podstring old sa new.Nalazi zadnji pojavak podstringa sub.Nalazi zadnji pojavak podstringa sub ili javljaizuzetakDesno poravnanje s u stringu duljine width.Odstranjuje prazna mjesta iza stringa.Dijeli string koriste¢i sep kao meža².maxsplit je nave¢i broj dijeljenja koji ¢e seizvr²iti.Dijeli string u listu linija. Ako je keependsjednak 1, £uvaju se kontrolni znakovi novihredaka.Provjerava da li string zapo£inje s prefix-omOdstranjuje prazna mjesta i ispred i izastringa.


2.3. Temeljne operacije i metode s nizovima 21s.swapcase()Metodas.title()s.translate(table[,deletechars ])s.upper()OpisVra¢a velika slova za string malih slova iobratno.Vra¢a verziju stringa kao naslova.Mijenja string koriste¢i transformacijskutablicu znakova.Vra¢a string pretvoren u velika slova.Primjer 2.1 String je nepromjenljivi objekt, pa se njegova promjena mogu¢a tek stvaranjem novogstringa. treba primjetiti kako se aritmeti£ki znak '+' koristi za povezivanje stringova, dok '1:' ozna£ujesve znakove nakon prvog.,>>> s1 = "Moj san">>> s2 = 'Tv ' + s1 [1:]>>> print s2,Tvoj san>>>Primjer 2.2 Modul 'string' sadrºi mnogo funkcija.stringu. Vra¢a poziciju naženog podstringaFunkcija 'nd' pronalazi podstring u zadanom,>>> import string>>> riba = " zubatac ">>> index = string . find (riba , "t")>>> print index>>>>>> string . find (" abrakadabra ", "ra")>>> string . find (" abrakadabra ", "ra" ,4)>>>,4292.3.2 Ugražene metode listiNa sli£an na£in, s pomo¢u tablice 2.7 mogu se u primjerima provjeriti ugražene metode koje olak²avajurad s listama.Tablica 2.7: Metode listeMetodaOpisli.append(x) Dodaje novi element x na kraj liste li.li.extend(t)Dodaje novu listu t na kraj liste li.li.count(x)Broji pojavke od x u listi li.li.index(x) Vra¢a najmanji i za koji je s[i] == x .li.insert(i,x) Ume¢e x na indeksu i .


22 Tipovi podatakaMetodali.pop([i])li.remove(x)li.reverse())li.sort([cmpfunc ])Primjer 2.3 Matrica je lista listi.OpisVra¢a element i i bri²e ga iz liste. Ako se iizostavi, onda se vra¢a zadnji element.Traºi x i bri²e ga iz liste li.Reverzira (obr¢e) £lanove liste li na mjestu.Sortira (slaºe) £lanove liste li na mjestu.cmpfunc() je funkcija za usporedbu.,>>> matrica = [[1 , 2, 3], [2, 3, 1]]>>> matrica [1]>>> matrica [0][2],[2, 3, 1]32.4 Rje£nikPreslikavanje (engl. mapping) je skup objekata indeksiranih s pomo¢u gotovo slobodnih vrijednostikoje se zovu klju£evi (engl. keys). Tako nastali objekti su promjenljivi, a za razliku od nizova, nisuporedani.<strong>Python</strong> nudi jednu vrstu preslikavanja, rje£nik (engl. dictionary). Knjiºni£ki i ekstenzijski modulipruºaju jo² vrsta preslikavanja, a druge moºe na£initi korisnik sâm. Klju£evi u rje£niku mogu bitirazli£itih tipova, ali moraju biti jednozna£ni (engl. hashable). Vrijednosti u rje£niku su takožer objektii to mogu biti razli£itih tipova. £lan u rje£niku je par kju£/vrijednost (engl. key/value). O rje£niku semoºe razmi²ljati kao o asocijativnom polju.Eksplicitno stvaranje rje£nika provodi se nizom parova klju£:vrijednost odvojenih zarezima, koji sesmje²taju unutar viti£astih zagrada. Dopu²ten je i zarez nakon zadnjeg £lana. Ako se klju£ pojavljujevi²e od jednom u rje£niku, samo se jedan od £lanova s tim klju£em sprema, jer klju£ mora biti jedincat.Drugim rije£ima, rje£nici ne dozvoljavaju duplikate klju£eva. Prazan se rje£nik ozna£uje parom praznihviti£astih zagrada. Evo nekih rje£nika:{'x':42, 'y':3.14, 'z':7} # Rjecnik s tri clana i string kljucevima{1: 2, 3:4} # Rjecnik s dva clana i cjelobrojnim kljucevima{ } # Prazan rjecnikTvorbu rje£nika mogu¢e je izvesti i s pomo¢u ugražene funkcije dict(). Na primjer:>>> dict([['a',12],['b',54]]){'a': 12, 'b': 54}>>> dict(a='zagreb', d='ogulin', e='Osijek'){'a': 'zagreb', 'e': 'Osijek', 'd': 'ogulin'}>>> dict([[12,'akumulator'],['baterija',4.5]]){'baterija': 4.5, 12: 'akumulator'}dict( ) bez argumenata stvara i vra¢a prazan rje£nik. Ako se klju£ pojavljuje vi²e nego jednom upopisu (argumentima funkcije dict), samo ¢e se posljednji £lan s tim kju£em zadrºati u rezultiraju¢emrje£niku.2.4.1 Ugražene metode rje£nikaNa sli£an na£in, s pomo¢u tablice 2.8 mogu se u primjerima provjeriti ugražene metode koje olak²avajurad s rje£nicima.


2.5. Skup 232.5 SkupTablica 2.8: Metode i operacije tipova preslikavanja (rje£nika)£lan/metodaOpisdi[k] Vra¢a £lan od di s klju£em k .di[k] = x Postavlja di[k] na x.del di[k] Bri²e di[k]iz di .di.clear()Bri²e sve £lanove iz di.di.copy()Vra¢a kopiju od di.di.has-key(k)Vra¢a 1 ako di ima klju£ k , a 0 ina£e.di.items()Vra¢a listu od (key ,value) parova.di.keys())Vra¢a listu od vrijednosti klju£eva.di.update(b) Dodaje sve objekte iz rje£nika b u di .di.values() Vra¢a listu svih vrijednosti spremljenih u di .di.get(k [,v]) Vra¢a di[k] ako naže; ina£e vra¢a v .Vra¢a di[k] ako naže; vra¢a v i postavljadi.setdefault(k[, v])di.popitem()di[k]=v .Vra¢a slu£ajne (key ,value) parove kaon-terce iz di.Od <strong>Python</strong> ver. 2.4, postoji ugraženi tip (iako takožer postoji i modul s imenom 'sets') s dvije varijante- obi£an i zamrznuti skup. Skup je neporedan niz jedincatih (neponavljaju¢ih) elemenata. Elementimoraju biti jednozna£ni, engl. hashable. Zamrznuti skupovi su jednozna£ni, pa mogu biti elementidrugih skupova, dok obi£ni skupovi to ne mogu biti.Operacijaset/frozenset([iterabilno=None])Set/ImmutableSet([iterabilno=None])len(selem in s / not in sfor elem ins: processelem...s1.issubset(s2)s1.issuperset(s2)s.add(elem)s.remove(elem))Tablica 2.9: Glavne operacije skupovaRezultat[koristi se za ugražene tipove] tvorba obi£nihili zamrznutih skupova iz iterabilnog niza, npr.set([5,2,7]), set("zdravo")[koristi se za set modul] tvorba obi£nih ilinepromjenljivih skupova iz iterabilnog niza,npr. Set([5,2,7])kardinalni broj skupa sIstinito ako element elem pripada / ne pripadaskupu sIterira na elementima skupa sIstinito ako je svaki element u s1 u s2Istinito ako je svaki element u s2 u s1Dodaje element elem u skup sBri²e element elem u skupu s. PodiºeKeyError iznimku ako se element ne pronaže


24 Tipovi podatakas.clear()Operacijas1.intersection(s2) ilis1&s2s1.union(s2) ili s1|s2s1.symmetric_difference(s2)ili sl∧s2s.copy()s.update(iterabilni nizRezultatBri²e sve elemente iz skupa s (ne vrijedi zanepromjenljive skupove!)Vra¢a novi skup s elementima zajedni£kim us1 i s2Vra¢a novi skup s elementima koji su i u s1 iu s2.Vra¢a novi skup s elementima koji su ili us1,ili u s2, ali ne na oba mjestaVra¢a kopiju skupa sDodaje sve vrijednosti iz iterabilnog niza uskup s


POGLAVLJE 3Izrazi, operatori i operacije3.1 Varijable<strong>Python</strong> pristupa podacima s pomo¢u referenci. Jedna takva referenca je varijabla, tj. imenovani prostoru memoriji koji £uva adresu nekog objekta ili literala. Referenca takožer postoji i na atribut (vrijednost)nekog objekta. Varijabla ili druga vrsta reference nemaju svoj vlastiti tip, za razliku od podatka nakojeg pokazuju, kojeg referenciraju tj. £iju adresu pohranjuju. Budu¢i da je adresa jedinstvena usmislu broja okteta, svaka referenca moºe povezati objekte razli£itih tipova, ²to zna£i da je dinami£na,da se moºe mijenjati prilikom izvr²enja programa. U jednom trenutku varijabla moºe pokazivati nacjelobrojni podatak, a ve¢ u sljede¢em na realni, kompleksni ili neki sloºeni tip.U <strong>Python</strong>u nema deklaracija. Postojanje varijable ovisi o naredbi koja povezuje (eng. binding)varijablu i podatak; drugim rije£ima, naredbi koja imenuje neki objekt, bilo kojeg tipa. Mogu¢e jeodvezati (eng. unbinding) varijablu resetiranjem njenog imena, tako da vi²e ne sadrºi referencu na tajobjekt. Naredba del odvezuje reference.Povezivanje reference koja je ve¢ povezana poznato je kao re-povezivanje (eng. rebinding). Repovezivanjeili odvezivanje reference nema nikakv u£inak na objekt s koji je referenca bila povezana,osim ²to objekt nestaje ako vi²e ne postoji nikakva referenca koja se na njega odnosi. Odvezani objektisami ¢e nestati iz memorije. Za to se brine poseban <strong>Python</strong> modul, ugražen u interpreter. Takvoautomatsko £i²¢enje objekata bez referenci zove se sakupljanje sme¢a (engl. garbage collecting).Varijabla se moºe imenovati bilo kojim identikatorom, osim onih 30 koji su rezervirani kao <strong>Python</strong>klju£ne rije£i. Pritom identikator ima i neka svoja pravila: ne smije imati zabranjene simbole u sebi,ne smije po£injati brojem i sl. Varijabla moºe biti globalna ili lokalna. Globalna varijabla je dohvatljivas vi²e razina, a lokalna uglavnom u funkciji u kojoj se koristi.3.2 Naredbe pridruºivanjaNaredbe pridruºivanja mogu biti obi£ne ili pro²irene. Obi£no pridruºivanje varijabli (npr. name=value)je na£in stvaranja nove varijable ili re-povezivanja postoje¢e varijable na novu vrijednost (tj. promjenavrijednosti). Obi£na pridruºba na atribut objekta (npr. obj.attr=value) je zahtjev objektu obj dastvori ili re-poveºe atribut attr. Obi£na pridruºba za £lan u nekom nizu ili preslikavanju (listi ilirje£niku) (npr. obj[key] = value) je zahtjev spremniku obj da stvori ili re-poveºe £lan s indeksomkey. Takva pridruºba uklju£uje indeksiranje niza.Pro²irena pridruºba (npr. name+=value) ne stvara nove reference, nego samo re-povezuje varijablu.Postoje¢i objekt re-povezuje sebe ili jedan od svojih atributa ili £lanovas novom vrijedno²¢u.Taj se zahtjev uspje²no izvr²ava ili se podiºe iznimka, kojom se javlja neka vrsta pogre²ke. Iznimka25


26 Izrazi, operatori i operacije(engl. exception) je na£in na koji <strong>Python</strong> rje²ava pogre²ke bilo kojeg tipa. Ako se na primjer, repovezivanjemvarijable s aritmeti£kim sadrºajem dogodi dijeljenje s nulom, <strong>Python</strong> ¢e podi¢i iznimkuZeroDivisionError. Pythen dakako, ima ugražene naredbe za dohva¢anje i obrade iznimki.3.2.1 Obi£na pridruºbaNaredba obi£ne pridruºbe u svom najjednostavnijem obliku ima sintaksu:cilj = izrazCilj ili odredi²te (engl.target) je poznat kao lijeve strana pridruºbe, a izraz (engl. expression) jedesna strana. Izraz moºe biti obi£na varijabla ili vi²e varijabli povezanih operatorima, poziv funkcije ilimno²tvo drugih kombinacija s mežusobno povezanim objektima. Kad se naredba pridruºbe izvr²ava,<strong>Python</strong> izra£unava izraz desne strane, te povezuje vrijednost izraza s ciljem na lijevoj strani. Ovopovezivanje ne ovisi o tipu izra£unate vrijednosti desne strane, jer se pridruºba ionako dogaža narazini referenca, adresa objekata, a ne njihova sadrºaja. Cilj moºe biti varijabla/identikator, atribut,indeksirani £lan niza ili kri²ka (engl. slicing) .Detalji povezivanja ovise o vrsti ili tipu cilja:• Identikator je ime varijable: pridruºba na identikator povezuje sadrºaj varijable s tim imenom,upisom adrese pod ime identikatora.• Referenca atributa ima sintaksu obj.name. Pritom je obj identikator koji ozna£ava objekt, aname atributivno ime objekta. Pridruºba na referencu atributa traºi da objekt obj poveºe svojatribut zvan name s izra£unatom ili pozvanom vrijedno²¢u desne strane.• Indeksiranje ima sintaksu obj[expr]. Pritom je obj objekt, a expr je izraz koji indeksira mjestou nizu. Objekt moºe biti bilo kojeg tipa. Pridruºba na indeksiranje traºi da spremnik obj poveºesvoj £lan koji je izabran pomo¢u vrijednosti expr, takožer poznate i kao indeksni klju£ £lana sizra£unatom ili pozvanom vrijedno²¢u desne strane.• Kri²ka (eng. slicing) ima sintaksu obj[start:stop] ili obj[start:stop:korak]. Pritom jeObj objekt, a start, stop i korak su izrazi koji koji indeksiraju dio niza objekata. (Dopu-²teno je izostavljanje £lanova, pa je obj[:stop:] sintaksno ispravna kri²ka, ekvivalentna sobj[None:stop:None]). Pridruºba traºi od niza objekata obj da se poveºu ili odveºu neki odnjegovih £lanova.U jednostavnoj pridruºbi moºe biti vi²e ciljeva i znakova jednakosti (=). Na primjer:a = b = c = 0povezuje varijable a, b, i c s vrijednosti 0. Svaki cilj se povezuje s jednim objektom koji vra¢a izraz,isto kao kad bi se nekoliko jednostavnih naredbi izvr²avale jedna za drugom.Cilj u jednostavnoj pridruºbi moºe imati dvije ili vi²e referenci odvojenih zarezima, proizvoljnoograženih lu£nim ili kutnim zagradama. Na primjer:a, b, c = xOvo zahtijeva da x bude niz od tri £lana, te povezuje a s prvim £lanom, b s drugim, te c s tre¢im.Ova vrsta pridruºbe zove se raspakiravaju¢a pridruºba i pritom izraz s desne strane mora biti niz sto£nim brojem £lanova koliko ima i referenci u cilju, jer se ina£e podigne iznimka. Svaka referenca ucilju je jednozna£no povezana s odgovaraju¢im £lanom u nizu. Raspakiravaju¢a pridruºba takožer moºeizmjenjivati reference. Na primjer:a, b = b, a


3.2. Naredbe pridruºivanja 27Ovaj izraz re-povezuje a da se pridruºi na ono ²to je u b bilo povezano, i obratno.Primjer 3.1 Program ra£una n-ti Fibonnaccijev broj za une²eni prirodni broj n.,% ovdje dolazi izvorni kod Matlab programan= input (" Inesite prirodni broj n:")pret , tren =1 ,1 # asociranje vrijednosti varijablama prethodnik , trenutnifor i in range (0,n -1): #i element niza 0 ,1 ,... ,n -1tren , pret = pret +tren , tren # pridruzivanje vrijednosti varijablama,print "\n %d-ti Fibonnaccijev broj je %d" %(n, tren )% ovdje dolazi rjeÜenje koje program daje4293.2.2 Pro²irena pridruºbaPro²irena pridruºba razlikuje se od obi£ne pridruºbe u tomu, ²to se umjesto znaka jednakosti ( =)izmežu cilja i izraza s desne strane koristi pro²ireni operator, tj. binarni operator nakon kojeg slijedi =.Operatori pro²irene pridruºbe su: + =,− =, ∗ =, / =, // =, % =, ∗∗ =, | =, >>=, = yx = x >> yx


28 Izrazi, operatori i operacijenaredba del specicira zahtjev objektu da odveºe neke (ili sve) svoje atribute ili £lanove. Objektmoºe odbiti odvezati neke (ili sve) atribute ili £lanove, podiºu¢i iznimku ako se poku²ava nedopu²tenoodvezivanje. Odvezivanje (ili brisanje) kri²ke obi£no ima jednak u£inak kao pridruºba praznog niza tojkri²ki.3.2.4 Bool-ove vrijednostiPoslije <strong>Python</strong>a ver. 2.3 postoji eksplicitna verzija Bool-ove (engl. boolean) vrijednosti za <strong>Python</strong>. Boolovevrijednosti True i False postaju tip (podklasa od int). U ranijim <strong>Python</strong> verzijama ozna£avalesu se s '1 ' i '0'. Svaka podat£ana vrijednost u <strong>Python</strong>u ima vrijednost istine: istinito ili laºno, ovisio tomu je li ta vrijednost razli£ita ili jednaka nuli. U tipu string nuli odgovara prazan string "", kodn-terca prazan n-terac (), kod rje£nika prazan rje£nik {} i sl. <strong>Python</strong> takožer ima nekoliko ugraženihfunkcija koje vra¢aju Bool-ove vrijednosti kao rezultate.Na£injene promjene u novim verzijama <strong>Python</strong>a bile su prakti£ne, jer je lak²e govoriti o funkcijamai izrazima koje "vra¢anje True ili False" nego govoriti o izrazima razli£itim ili jednakim nuli. Ovepromjene takožer omogu¢uju pisanje £i²¢eg kôda, npr. kada se ºeli vratiti vrijednost istine pi²e sereturn True, umjesto neprikladnog return 1).3.3 Operatori i operacijeIzraz je dio programskog kôda koji <strong>Python</strong> interpreter moºe izvr²iti kako bi proizveo neku vrijednost.Najjednostavniji izrazi su literali i identikatori (varijable). Sloºeniji izrazi grade se tako da se jednostavniizrazi povezuju operatorima. Tablica 3.2 opisuje operatore po prioritetima, od vi²ih prema niºima.Operatori koji su zajedno imaju jednak prioritet. Stupac A ispisuje asocijativnost (djelovanje s obziromna stranu) operatora, koja moºe biti L (s lijeva na desno), D (s desna na lijevo) ili NA (neasocijativna).Na primjer, operator '


3.3. Operatori i operacije 29Operator Opis Ax+y, x-y Zbajanje, oduzimanje Lxy, xy Lijevi pomak, desni pomak Lx&y Bitwise I (AND) Lx ∧ y Bitwise eksluzivni ILI (XOR) Lx|y Bitwise ILI (OR) Lx < y, x y, x >=y, x y, x! = y, x == yUsporedbeNAx is y, x is not y Provjera identiteta NAx in y, x not in y Provjera £lanstva NAnot x Bool-ov NE (NOT) NAx and y Bool-ov I (AND) Lx or y Bool-ov ILI (OR) Llambda arg,...: izrazAnonimna jednostavnafunkcijaNAOperatori usporedbe mogu se nizati, £ime se implicira logi£na I (and) funkcija. Na primjer:a < b


30 Izrazi, operatori i operacije3.3.1 Numeri£ke i aritmeti£ke operacije<strong>Python</strong> nudi uobi£ajene numeri£ke operacije, kako se vidi u tablici 3.3. Svi su brojevi samo£itaju¢i(engl. readonly) objekti, pa bilo koja numeri£ka operacija na brojnom objektu, uvijek proizvodi novibrojni objekt. Objekt kompleksnog broja z takožer ima samo£itaju¢e (atribute z.real i z.imag.Poku²aj repovezivanja ovih atributa na kompleksnom objektu podiºe iznimku. Treba primjetiti da +ili - znak nekog broja, kao i isti znakovi koji pridruºuju realni literal imaginarnom, kako bi se na£iniokompleksan broj, nisu dijelovi sintakse literala. Iz tog razloga se na primjer, -2 ** 2 izra£unava kao-4, jer potenciranje ima vi²i prioritet od znaka minusa, pa se cijeli izraz prevodi kao -(2 ** 2), a nekao (-2) ** 2.Tablica 3.3: Numeri£ke operacijeOperacijaOpisx + yZbrajanjex − yOduzimanjex ∗ yMnoºenjex/yDijeljenjex ∗ ∗y Potenciranje (x ∧ y)x%y Modulo funkcija (x mod y )−xUnarni minus+x Unarni plusUgražena divmod funkcija uzima dva argumenta i vra¢a par £iji su £lanovi kvocijent i ostatak, ²to jejednostavnije nego koristiti operator // za cjelobrojno dijeljenje i % za ostatak (tablica 3.4). Ugraženapow(a,b) funkcija vra¢a isti rezultat kao i a**b. Poziv funkcije pow() s tri argumenta, pow(a,b,c)vra¢a isti rezultat kao i (a**b)%c, ali brºe.Tablica 3.4: Ugražene aritmeti£ke funkcijeFunkcijaOpisabs(x)Apsolutna vrijednostdivmod(x,y) Vra¢a (int(x / y ), x % y )pow(x,y [,modulo]) Vra¢a (x ∗ ∗y)x%moduloround(x,[n])Zaokruºuje na najbliºi vi²ekratnik od 10 −n(samo za za realne brojeve)3.3.2 Prisilna i eksplicitna pretvorbaArithmeti£ke operacije i usporedbe mogu se primijeniti izmežu bilo koja dva broja. Ako se tipovi operanadarazlikuju, primjenjuje se prisila: <strong>Python</strong> prepravlja operande tako da one manjeg tipa pretvarau ve¢i. Poredani od najmanjeg do najve¢eg, tipovi brojeva su sljede¢i: cijeli brojevi, duga£ki cijelibrojevi, decimalni (realni, s pomi£nim zarezom) brojevi i kompleksni brojevi.Eksplicitna pretvorba moºe se primijeniti tako da se numeri£ki argument preda ºeljenoj ugraženojfunkciji: int, long, float te complex. U tom slu£aju int i long ¢e odbaciti decimalni dio svogargumenta i zadrºati samo cijeli, npr. int (9.8) je 9. Konverzija pak kompleksnog broja na bilo kojidrugi tip broja, odbacuje imaginarni dio. Za tvorbu kompleksnog broja mogu¢e je pozvati ugraženufunkciju complex s dva argumenta, koji predstavljaju realni i imaginarni dio.Funkcije Int i long takožer se mogu pozvati s dva argumenta: prvi je niz znakova za pretvorbu, adrugi baza (radix), tj. cijeli broj izmežu 2 i 36 kao baza za pretvorbu (npr. int('1101',2) vra¢a 13,vrijedost '1101' u bazi 2).


3.4. Operacije na nizovima 313.3.3 UsporedbaSvi objekti, uklju£uju¢i brojeve, mogu se usporeživati s obzirom na jednakost (==) i nejednakost (!=).Usporedbe koje zahtijevaju poredak (=) mogu se koristiti izmežu bilo koja dva broja osimkompleksnih. Svi takvi operatori vra¢aju Bool-ove vrijednosti (True ili False). Operatori usporedbe(tzv. odnosni operatori) prikazani su u tablici 3.5.Tablica 3.5: Operatori usporedbeOperatorOpisx < yManje negox > yVe¢e negox == yJednakox != y Nije jednako (isto kao )x >= yVe¢e nego ili jednakox


32 Izrazi, operatori i operacijene i vi²e. Indeks n moºe takožer biti -1, -2,..., sve do -L (isklju£no), ali ne i manji. Negativni nozna£ava iste £lanove u S kao ²to £ini L+n. Drugim rije£ima, S[-1] je posljednji element od S, S[-2] jepretposljednji, itd. Na primjer:x = [1,2,3,4]x[1] # 2x[-1] # 4Kori²tenje indeksa ve¢eg ili jednakog duljini niza L ili manjeg od -L, podiºe (izaziva) iznimku.Pridruºba £lanu niza s nepostoje¢im indeksom ima isti u£inak.3.4.1 Kri²ka (eng. slicing) nizaPodniz S moºe se ozna£iti s pomo¢u kri²ke, kori²tenjem sintakse S[i:j], gdje su i i j cijeli brojevi.S[i:j] je podniz S od i-tog £lana do j-tog £lana, ali ne uklju£uju¢i j-ti £lan. Treba primjetiti kako u<strong>Python</strong>u svi dosezi uklju£uju donju, a isklju£uju gornju granicu. Kri²ka moºe biti prazan podniz ako jej manje od i ili ako je i ve¢e ili jednako L, duljini niza S. Ako je j jednako nuli, i se moºe izostaviti, aako se ide do konca niza (L) onda se i j smije izostaviti. Cijeli niz S moºe se dakle indeksirati sa S[:].Bilo koji ili oba indeksa smiju biti manji od nule. Negativni indeks ozna£uje mjesto u nizu s obziromna kraj niza. Evo nekih primjera:x = [1, 2, 3, 4]x[1:3] # [2, 3] - ne zaboraviti da prvi £lan niza ima indeks jednak 0x[1:] # [2, 3, 4]x[:2] # [1, 2]Kri²ka takožer moºe koristiti pro²irenu sintaksu S[i,j,k], gdje je k - korak indeksa.Liste mogu mijenjati svoje £lanove pridruºbom izraza indeksiranom £lanu. Na primjer:x = [1, 2, 3, 4]x[1] = 42 # x je sada [1, 42, 3, 4]Drugi na£in promjene objekata liste li je kori²tenjem kri²ke od likao cilja (lijeva strana) uz naredbupridruºbe desne strane. Desna strana pritom takožer mora biti lista. Kri²ka s lijeve strane i lista sdesne mogu biti bilo koje duljine, ²to zna£i da pridruºivanje kri²ke moºe dodavati £lanove liste ili ihbrisati. Na primjer:x = [1, 2, 3, 4]x[1:3] = [22, 23, 44] # x je sada [1, 22, 33, 44, 4]x[1:4] = [2, 3] # x se vratio na [1, 2, 3, 4]Evo nekih vaºnih posebnih slu£ajeva:• Koriste¢i praznu listu [ ] kao izraz s desne strane, bri²e se ciljna kri²ka iz liste li s lijeve strane.Drugim rije£ima, li[i:j] = [ ] ima isti u£inak kao i del li[i:j].• Koriste¢i praznu kri²ku liste li kao cilj s lijeve strane pridruºbe ubacuju se £lanovi liste s desnestrane na primjerenu poziciju u li. Drugim rije£ima, li[i:i] = ['a','b'] ubacuje £lanove 'a'i 'b' nakon £lana i u listi li.• Koriste¢i kri²ku koja pokriva cijeli objekt liste li[:], kao cilj s lijeve strane, potpuno se zamjenjujesadrºaj liste li.£lan ili dio (kri²ka) liste moºe se izbrisati naredbom del. Na primjer:x = [1, 2, 3, 4, 5]del x[1] # x je sada [1, 3, 4, 5]del x[1:3] # x je sada [1, 5]


3.5. Naredba Print 333.4.2 Stacionarne operacije na listi i rje£nikuZa liste su denirane stacionarne (in-line) verzije operatora + i *, koji se koriste u pro²irenim naredbamapridruºbe. Pro²irena naredba pridruºbe li +=li_1 ima u£inak dodavanja £lana iz liste li_1 na krajliste li, dok li *= n ima u£inak dodavanja n broja kopija liste li na kraj li.Metoda popitem() moºe se koristiti za destruktivnu iteraciju rje£nika, tj. iterativnim dohva¢anjem£lana bri²e se njegov klju£ i vrijednost u rje£niku. Pritom i item() i popitem() vra¢aju rje£ni£ke £lanovekao parove klju£/vrijednost, ali kori²tenje funkcije popitem() upotrebljava manju koli£inu memorije.U²tede na kori²tenju memorije £ine tu metodu korisnom za petlju po dugom rje£niku.U <strong>Python</strong>u 2.2 i kasnije, izravno iteriranje na rje£niku postiºe se iterkeys() ili iteritems() metodamakoji traºe skromnu koli£inu memorije i ne uni²tavaju rje£nik po kojemu se iteracija obavlja.3.5 Naredba PrintNaredba za ispis ozna£ava se s klju£nom rije£i print nakon koje slijedi niti jedan ili vi²e izraza odvojenihzarezima. Print je prakti£an i jednostavan na£in ispisivanja vrijednosti u tekstovnom obliku. Printispisuje na zaslon ra£unala svaki izraz x kao niz znakova ²to je isto kao kad bi se prethodno pozvalafunkcija str(x) koja bi ekslicitno tip podatka, npr. broja pretvorila u string. Print implicitno izbacujerazmak izmežu izraza, i takožer implicitno uklju£uje novi red (\n) nakon posljednjeg izraza, osim uslu£aju kad iza posljednjeg izraza slijedi zarez. Evo nekih primjera naredbe print:slovo = 'c'print "daj mi ", slovo, "..." # ispisuje: daj mi c ...odgovor = 100print "Odgovor je:", odgovor # ispisuje: Odgovor je:100Odredi²te izlaza naredbe print je datoteka ili objekt sli£an datoteci koji ima vrijednost stdoutatributa u sys modulu. Obi£no je stdout pridruºen zaslonu ra£unala, ali se isto tako moºe pridruºitidrugom objektu ili izlaznoj napravi. Format ispisa moºe se preciznije kontrolirati uporabom operatora% ili drugim tehnikama obradbe nizova znakova.Takožer je mogu¢e koristiti write ili writelines metode datote£nih objekata. U <strong>Python</strong> ver. 3.0nadalje, print naredba postaje funkcija print() s pripadnim argumentima za ispis.Primjer 3.3 Primjena PRINT naredbe s formatiranjem.


POGLAVLJE 4Programsko upravljanjeProgramsko upravljanje tokom izvoženja je redoslijed po kojem se programski kôd izvr²ava. Ovo upravljanjeu <strong>Python</strong> programima, kao i u drugim programskim jezicima, temelji se na uvjetnim naredbama,petljama i pozivima funkcija.4.1 Naredba ifƒesto se neka naredba ili niz (blok) naredbi treba izvr²iti samo u slu£aju ako je neki uvjet zadovoljen.Ponekad je to izvr²avanje ovisno o nekoliko mežusobno povezanih uvjeta. <strong>Python</strong>ova kombinirananaredba if, koja koristi pro²irenja elif ili else zaklju£ak, sluºi za takvo uvjetno izvr²avanje naredbi.Sintaksa izgleda ovako:if uvjet(i):naredba(e)elif uvjet(i):naredba(e)elif uvjet(i):naredba(e)...elseuvjet(i):naredba(e)gdje uvjet(i) predstavlja jedan ili vi²e uvjetnih izraza povezanih odnosnim (relacijskim) operatorima.Pro²irenja naredbe 'if ' s 'elif ' i 'else' su dopu²tene u slu£aju ispitivanja vi²e razli£itih uvjeta.'Elif' je kratica od 'else-if', ²to zna£i 'ina£e-ako', £ime se prvo ispitivanje uvjeta pro²iruje na idu¢e.Ako niti jedan od uvjeta nije zadovoljen, onda se izvode naredbe iza 'else' dijela, ako on postoji.Treba primjetiti kako, za razliku od nekih jezika, <strong>Python</strong> nema naredbu switch, pa se morajukoristiti if, elif ili else za sve uvjetne obrade. Evo tipi£ne naredbe if:if x < 0: print "x je negativan"elif x % 2: print "x je pozitivan i neparan"else: print "x je paran i nije ne-negativan"Kada u 'ako' ili 'ina£e' odlomku ima vi²e naredbi (tj. programsko grananje se odnosi na £itav bloknaredbi), naredbe se pi²u na zasebnim linijama koje su uvu£ene, pomaknute udesno od linije po£etka.Blok naredbi zavr²ava kada se pozicioniranje linije vrati na ono od po£etka odlomka (ili jo² vi²e ulijevood toga). Kada postoji samo jedna jednostavna naredba, kao u gornjem primjeru, onda se ona pi²e na35


36 Programsko upravljanjeistoj naredbenoj liniji neposredno iza dvoto£ja (':') kojim se zavr²ava jedan ili vi²e uvjetnih ispitivanja.Dakako, mogu¢e je isto napisati i u idu¢em retku, ali se onda mora koristiti uvlaka. Mnogi koji rade u<strong>Python</strong>u smatraju stil odvojenih linija £itljivijim od onog u drugim programskim jezicima:if x < 0print "x je negativan"elif x % 2:print "x je pozitivan i neparan"else:print "x is paran i ne-negativan"Za uvjet u if ili elif odlomku moºe se koristiti bilo koji <strong>Python</strong>-ov izraz. Pritom se vrijednostizraza promatra u Bool-ovom kontekstu, gdje se svaka vrijednost uzima kao istinita, ili neistinita. Svakibroj koji nije nula ili niz znakova koji nije prazan, isto kao i n-terac, lista ili rje£nik, izra£unava sekao istinito (True). Nula (bilo kojeg brojevnog tipa), None i prazni stringovi, n-terci, liste i rje£nici,izra£unavaju se kao neistina (False). Kada se pak ºeli ispitati vrijednost x-a u Bool-ovom kontekstu,preporu£uje se sljede¢i stil kodiranja:if x:To je naj£i²¢i i 'naj_<strong>Python</strong>-skiji' oblik. To je elegantnije i ljep²e nego koristiti konstrukcije kao:if x is True:if x == True:if bool(x) :ili sli£no.Postoji osnovna razlika izmežu izjave da izraz "vra¢a True" (²to zna£i da izraz vra¢a vrijednostkao Bool-ov rezultat) i izjave da se izraz "izra£unava kao istinit" (²to zna£i da izraz vra¢a bilo kakavrezultat koji je istinit, razli£it od nule ili praznog, u Bool-ovom kontekstu). Kad se ispituje neki izraz uupravlja£koj naredbi, onda se razmi²lja o ovom drugom uvjetu, a ne prvom. Ako se izraz za if odlomakizra£una kao istinit, naredbe koje slijede if odlomak ¢e se izvr²iti i cijela naredba if zavr²ava. Akose izraz za if odlomak izra£una kao neistinit, onda se izvr²avaju izrazi za idu¢e elif odlomke, ako sunjihovi uvjeti ispunjeni. Za prvu elseif klauzulu za koju je uvjet istinit, izvr²avaju se sve narede kojeje slijede i £itava naredba if time zavr²ava. U protivnom, ako niti jedan elif odlomak nije izvr²en, jeruvjeti nisu bili zadovoljeni, onda se izvr²avaju naredbe odlomka else, dakako, ako on postoji.4.2 Naredba whileNaredba while u <strong>Python</strong>u izvr²ava naredbu ili blok naredbi niti jedan, jedan ili vi²e puta, ovisno oispunjenju upravljanog uvjetnog izraza. Ovo je sintaksa za naredbu while:while izraz:naredba(e)While naredba takožer moºe uklju£ivati klauzulu else i naredbe break.Tipi£na uporaba naredbe while:count = 0while x > 0:x = x // 2 # cjelobrojno dijeljenjecount += 1print "Aproksimacija log2 je", count


4.3. Naredba for 37Prvo se izra£una izraz poznat kao uvjet petlje (eng. loop condition). Ako uvjet nije istinit (false),naredba while zavr²ava i niti jedna od naredbi u tijelu petlje se ne izvr²ava. Ako je pak uvjet petljezadovoljen, naredba ili naredbe od kojih se sastoji tijela petlje se izvr²avaju. Kada tijelo petlje zavr²i sizvr²avanjem, uvjet se ponovno izra£unava, da se vidi treba li se izvr²iti nova iteracija. Ovaj se procesnastavlja sve dok uvjet petlje ne postane neistinit, nakon £ega while naredba zavr²ava. Tijelo petljetreba sadrºavati kôd koji ¢e u nekom trenutku u£initi petljin uvjet laºnim, ili petlja nikada ne¢e zavr²iti,osim ako se ne podigne iznimka ili tijelo petlje ne izvr²i naredbu break. Petlja koja je napisana u tijelufunkcije takožer zavr²ava ako se naredba return izvr²i unutar tijela petlje, jer u tom slu£aju cijelafunkcija zavr²ava.4.3 Naredba forNaredba for u <strong>Python</strong>u ostvaruje takožer iterativno izvr²avanje naredbe ili bloka naredbi, a upravljase preko iteracijskog izraza. Sintaksa za naredbu for je:for cilj in nizu:naredba(e)Treba primjetiti da je klju£na rije£ in dio sintakse naredbe for. Ona nije povezana s operatoromin koji se koristi pri ispitivanju £lanova u nizovima. Naredba for takožer moºe uklju£ivati i odlomakelse i naredbu break.Tipi£na primjer uporabe naredbe for je:for znak in "dobar dan":print "slovo: ", znak, "..."²to ¢e kao rezultat dati:slovo: d ...slovo: o ...slovo: b ...slovo: a ...slovo: r ...slovo: ...slovo: d ...slovo: a ...slovo: n ...Iteracijski niz u ovom slu£aju je string, pa varijabla znak u svakom prolazu, iteraciji, poprima vrijednostpojedinog £lana tog niza, u ovom slu£aju pojedina£nog slova. U ovom primjeru izvr²ava se samojedna naredba, naredba print, koja ispisuje sadrºaj upravlja£ke varijable s pripadnim formatiranjem('slovo:' ispred i '...' iza sadrºaja).Iteracijski niz moºe biti bilo koji <strong>Python</strong>ov izraz koji se moºe iskoristiti kao argument ugraženojfunkciji iter, koja vra¢a iteratorski objekt. Cilj pridruºbe iteracijske varijable je obi£no identikatorkoji imenuje varijablu petlje, a naredba for slijedno re-povezuje ovu varijablu na svaki £lan po reduunutar iteratora. Naredba ili naredbe od kojih se sastoji tijelo petlje izvr²avaju se jedna po jednaza svaki £lan unutar iteratora (osim ako petlja zavr²i uslijed podizanja iznimke ili izvr²enja naredbebreak ili return). Cilj s vi²e identikatora je takožer dopu²ten, kao kad se radi o pridruºbi prilikomraspakiravanja. U tom slu£aju, iteratorovi £lanovi moraju biti nizovi, svaki iste duljine jednake brojuidentikatora unutar cilja. Na primjer, ako je d rje£nik, ovo je uobi£ajeni na£in dohva¢anja £lana urje£niku d:for key, value in d.items():# dohvatiti samo istinite (pune) kljuceve i vrijednostiif not key or not value: del d[key]


38 Programsko upravljanjeMetoda items() vra¢a popis parova klju£/vrijednost, pa stoga for petlja koristi dva identikatorau cilju da se svaki £lan razpakira u par klju£/vrijednost. Ako iterator sadrºi promjenljiv objekt unutarsamoga sebe, onda se taj objekt ne smije mijenjati dok se for petlja obavlja. Na primjer, predhodniprimjer ne moºe koristiti iteritems() umjesto items. Naime, iteritems() vra¢a iterator £iji jesadrºani objekt d, pa tijelo petlje ne moºe mijenjati d (sa del d[key]). S druge strane, items() vra¢alistu, tako da d nije sadrºani objekt, pa tijelo petlje moºe mijenjati d.Upravlja£ka varijabla moºe se repovezati u tijelu petlje, ali se ponovno repovezuje na slijede¢i £lanu iteratoru sa sljede¢om iteracijom petlje. Tijelo petlje uop¢e se ne izvr²ava ako iterator ne oslobažanikakve £lanove. U tom slu£aju, upravlja£ka varijabla se ne povezuje ili odvezuje na niti jedan na£inpomo¢u naredbe for. Mežutim, ako iterator oslobaža barem jedan £lan, kad se naredba petlje zavr²i,upravlja£ka varijabla ostaje povezana na posljednju vrijednost na koju ju je naredba petlje povezala.Zato je sljede¢i kôd ispravan, dok god neki-niz nije prazan.for x in neki-niz:obradi(x)print "Posljednji obradjeni £lan je: ",x4.4 IteratoriMetode items(), keys() i values() vra¢aju njihove rezultantne liste bilo kojim redoslijedom. Akose pozove vi²e od jedne od ovih metoda bez bilo kakve izmjene na rje£niku, redoslijed rezultata jeidenti£an za sve. Metode iteritems(), iterkeys()i itervalues(), koje su uvedene u <strong>Python</strong>u odina£ice 2.2, vra¢aju iteratore ekvivalentne tim listama. Iterator zauzima manje memorije od liste, alinije dozvoljena promjena rje£nika dok se iterira na jednom od njegovih iteratora. Iteriranje na listivra¢enoj sa items(), keys() ili values() dolazi bez takvih restrikcija. Iteriranje direktno na rje£nikuD je isto kao iteriranje na D.iterkeys().MetodaD.iteritems( )D.iterkeys( )D.itervalues( )Tablica 4.1: Metode rje£ni£kog objektaOpisVra¢a iterator za sve £lanove (key/valueparove) u DVra¢a iterator za sve klju£eve u DVra¢a iterator za sve vrijednosti u DIterator je bilo koji objekt i takav da se moºe pozivati sa i.next() bez argumenata. Naredbai.next() vra¢a sljede¢i £lan iteratora i ili, kada iterator i vi²e nema £lanova, podiºe StopIterationiznimku. Ve¢ina je iteratora izgražena eksplicitnim ili implicitnim pozivima ugražene funkcije iter.Naredba for implicitno poziva iter da bi dobila iterator. Sljede¢a naredba:for x in clanovi:naredba(e)je ekvivalentna s:_temporary_iterator = iter(clanovi)while True:try: x = _temporary_iterator.next ( )except StopIteration: breaknaredba(e)


4.5. Funkcije range i xrange 39Ako iter(clanovi) vra¢a iterator i tako da naredba i.next nikada ne podigne StopIterationiznimku(beskona£an iterator), petlja for x in clanovi: nikada ne zavr²ava (osim kad naredbe u tijelu petljesadrºavaju prikladne break ili return naredbe ili iznimke). iter(clanovi) poziva posebnu metoduc._iter_() da se dobije i vrati iterator na clanovi.Zahvaljuju¢i iteratorima, naredba for se moºe koristiti na spremniku (kontejneru) koji nije nizznakova, poput rje£nika, sve dok god je kontejner iterabilan (tj. denira _iter_ posebnu metodu takoda funkcija iter moºe prihvatiti kontejner kao argument i vratiti iterator na taj kontejner). Ugraženefunkcije koje su prije zahtjevale argumentni niz sad prihva¢aju bilo koji iterabilni objekt.4.5 Funkcije range i xrangeVrlo £est slu£aj u programiranju je ponavljanje petlje preko niza cijelih brojeva. Za tu svrhu <strong>Python</strong>pruºa ugražene funkcije range i xrange koje generiraju i vra¢aju nizove cjelih brojeva.Najjednostavniji na£in da se zavrti petlja od n puta u <strong>Python</strong>u je:for i in xrange(n):naredba(e)range(x) vra¢a popis ili listu £iji £lanovi su sljedni cijeli brojevi od 0 (uklju£eno) do x (isklju£eno).Funkcija range(x,y) vra¢a popis £iji £lanovi su su sljedni cijeli brojevi od x (uklju£eno) do y (isklju-£eno). Ako je x ve¢i ili jednak y, onda je rezultat prazna lista. Funkcija range(x,y,step) vra¢a popiscijelih brojeva od x (uklju£eno) do y (isklju£eno), tako da je razlika izmežu svaka dva susjedna £lana upopisu step. Ako je korak(eng. step) manji od 0, range odbrojava od x do y. Funkcija range vra¢aprazan popis kada je x ve¢i ili jednak y, a korak je ve¢i od 0, ili kada je x manji ili jednak y i korak jemanji od 0. Ako je korak jednak 0, onda range podiºe iznimku. Dok range vra¢a standardni objektliste koja se moºe koristiti za bilo koju svrhu, xrange vra¢a objekt za posebne svrhe, posebno namijenjenkori²tenju u iteracijama kao naredba for pokazana ranije. Xrange uzima manje memorije odrange-a za ovu speci£nu namjenu. Stavljaju¢i na stranu potro²nju memorije, range se moºe koristitiu iste svrhe kao i xrange.4.6 Saºete listeƒesta svrha for petlje je provjeravanje svakog £lana unutar niza i tvorba nove liste dodaju¢i rezultateizraza izra£unatog na jednom ili svim £lanovima koji se provjeravaju. Oblik izraza, zvan saºeta lista(eng. list comprehension) omogu¢uje to£no i neposredno izvr²avanje ove zada¢e. Kako je saºeta listaizraz (a ne blok naredbi), moºe se ga koristiti izravno (npr. kao stvarni argument u funkciji poziva,zatim u naredbi return ili kao podizraz za neki drugi izraz). Saºeta lista ima sljede¢u sintaksu:[izraz for cilj in iter-clanovi lc-odlomci]gdje su cilj i iter-clanovi identi£ni kao i u obi£noj for naredbi. Izraz se moºe ograditi i okruglim,oblim zagradama, pa ¢e u tom slu£aju predstavljati n-terac, a ne listu. lc-odlomci je niz od nula ilivi²e odlomaka, od kojih je svaki sli£an obliku:for cilj in iter-clanoviif izrazIzraz unutar svake if klauzule ima istu sintaksu kao izraz u obi£noj if naredbi.Saºeta lista je ekvivalentna petlji for koja gradi istu listu ponavljaju¢im pozivima append metoderezultantne liste. Na primjer:result1 = [x+1 for x in neki_niz]jednak je kao sljede¢a for petlja:


40 Programsko upravljanjeresult2 = []for x in neki_nizresult2.append (x+1)Saºeta lista koji koristi if odlomak izgleda ovako:result3 = [x+1 for x in neki_niz if x


POGLAVLJE 5IznimkePi²u¢i program, korisnik (programer) moºe na£initi tri vrste pogre²aka: logi£ke pogre²ke, sintakti£kepogre²ke, te pogre²ke u radu (eng. run-time errors)nkoje se pojavljuju tijekom izvoženja programa.Logi£ka pogre²ka poput neispravnog algoritma, uzrokuje neto£ne rezultate, ali ne sprije£ava izvoženjeprograma. Ovakve se pogre²ke te²ko mogu uo£iti.Sintakti£ka pogre²ka kr²i jedno od <strong>Python</strong>ovih gramati£kih pravila i sprije£ava izvoženje programa.Ove je pogre²ke lako popraviti.Pogre²ka u radu je pogre²ka kod izvr²enja programa koja se dogaža dok je program u nekoj operaciji.Neki £esti uzroci takvih pogre²aka u radu su neprimjereni ulazni podaci, arithmeti£ke pogre²ke,neispravne vrste objekata, nizovi indeksa izvan dometa, nepostoje¢i klju£evi rje£nika, nepravilnoispisana imena atributa, neinicijalizirane varijable, te problemi vezani uz operacijski sustav.Iako to ne pomaºe u slu£aju logi£kih pogre²aka, <strong>Python</strong> podiºe iznimku (engl. exception) pri otkrivanjusintakti£kih pogre²aka ili pogre²aka tijekom izvoženja programa. Interpreter zaustavlja programte ispisuje dijagnosti£ku poruku o pogre²ci, zvanu "traceback", koja ukazuje na vrstu iznimke te pokazujepribliºno mjesto pogre²ke. Sintaksne pogre²ke su naj£e²¢e pogre²ke u pisanju programa, a nanjih upozorava <strong>Python</strong> prilikom izvoženja programa oznakom strijelice na mjestu na kojem se pogre²kajavlja. To mjesto ne mora doista biti ono na kojem se pogre²ka nalazi, nego je obi£no ono na kojem seprvi put pogre²ka manifestira. To£no lociranje pogre²aka nije jednostavno.>>> while True print Pozdrav svima'File "", line 1, in ?while True print 'Pozdrav svima'^SyntaxError: invalid syntaxKada je program sintaksno dobro napisan, postoji mogu¢nost da se pogre²ke jave prilikom izvoženjaprograma. Iznimka je na£in na koji <strong>Python</strong> dohva¢a i pogre²ke tog tipa.5.1 Vrste iznimki<strong>Python</strong> organizira iznimke po hijerarhijskom stablu. Tablica 5.1 ispisuje i opisuje sve ugražene iznimke.Sve vrste iznimki su <strong>Python</strong> klase, objekti. Na vrhu stabla iznimki je Exception, iz kojega su izvedenesve druge ugražene iznimke. Exception je roditelj ili temelj dvaju nasljednika: SystemExit i41


42 IznimkeStandardError. Funkcija sys.exit() generira iznimku SystemExit koja se moºe dohvatiti kod eksplicitnogzatvaranja programa. (SystemExit je iznimka ali ne i pogre²ka). StandardError je roditelj svihdrugih iznimki. Ovakav hijerarhijski ustroj omogu¢uje otkrivanje i obradu skupnih, a ne samo individualnihiznimki. Na primjer, ako postoji skupina iznimki koje obražuju matemati£ke izra£une, onda semoºe prvo dohvatiti samo ArithmeticError iznimka, a ne i sva njezina djeca (FloatingPointError,OverflowError i ZeroDivisionError) pojedina£no, uz uvjet da se ºeli na isti na£in raditi sa svimiznimkama.IznimkaExceptionSystemExitStandardErrorArithmeticErrorFloatingPointErrorOverflowErrorZeroDivisionErrorAssertionErrorAttributeErrorEnvironmentErrorIOErrorTablica 5.1: Ugražene iznimkeOpisKorijen svih iznimkiPodiºe se sa sys.exit() funkcijom. Ako se neobražuje ova iznimka, onda <strong>Python</strong> interpreterzavr²ava program bez ispisa putanje zavr²etka(engl. traceback). Ako se pozove sys.exit(),<strong>Python</strong> prevodi poziv u iznimku i izvodipotporu iznimci (eng. exception handler) kojise nalazi u finally odlomku od try naredbe.Osnova svih ugraženih iznimki osimSystemExit.Roditelj za iznimke koje <strong>Python</strong> podiºe zarazli£ite aritmeti£ke pogre²ke.Podiºe se za pogre²ke u operacijama spomi£nom decimalnom to£kom.Podiºe se kad je rezultat aritmeti£ke operacijeprevelik da bi se mogao prikazati. Ovaiznimka ne moºe se pojaviti za duge cijelebrojeve (eng. long integers). U njihovomslu£aju <strong>Python</strong> podiºe MemoryError.Podiºe se kad je drugi argument obi£nog ilimodularnog dijeljenja jednak nuli.Podiºe se kad je pogre²ka u assert naredbi.Podiºe se kad je atributna referenca ilipridruºba pogre²na. Ako objekt ne podrºavaatributnu referencu ili pridruºbu, onda <strong>Python</strong>podiºe TypeError iznimku.Roditelj za iznimke koje se pojavljuju izvan<strong>Python</strong>-a.Podiºe se kad je ulazno/izlazna operacija (kao²to je print naredba, open() funkcijski pozivili metoda u radu s datotekom) pogre²na, naprimjer, za U/I razloge: "file not found"(datoteka nije pronažena) ili "disk full"(disk je pun).


5.1. Vrste iznimki 43IznimkaOSErrorWindowsErrorEOFErrorImportErrorKeyboardInterruptLookupErrorIndexErrorKeyErrorMemoryErrorNameErrorUnboundLocalErrorRuntimeErrorOpisPodiºe se kad se pojavi pogre²ka povezana soperacijskim sustavom (izvan <strong>Python</strong>-a).Obi£no se ovoj iznimci pridruºuje numeri£kikôd pogre²ke, kao ²to je u os modulu iznimkaos.error.Podiºe se kad se pojavi pogre²ka povezana sWindows-operacijskim sustavom.Podiºe se kad input() ili raw_input() otkrijekonac datoteke (EOF) bez £itanja ikakvogpodatka. (treba primjetiti da le-objektread() i readline() metoda vra¢a prazanstring kad se otkrije EOF.)Podiºe se kad import grije²i na¢i modul ili kadfrom-import grije²i na¢i ime.Podiºe se kad korisnik pritisne tipku prekida(interrupt key koja je obi£no Ctrl-C ili Del).<strong>Python</strong> redovito provjerava takve prekidetijekom izvoženja programa. <strong>Python</strong> takožepodiºe ovu iznimku ako korisnik utipka prekidza vrijeme input() ili raw_input() naredbekoja £eka korisnikov unos.Roditelj za iznimke koje <strong>Python</strong> podiºe kadaje indeks rje£ni£kog klju£a ili indeks niza(stringa, liste ili n-terca) nevaljao.Podiºe se kad je indeks niza izvan dosega. Akoindeks nije cijeli broj, onda <strong>Python</strong> podiºeTypeError iznimku.Podiºe se kad <strong>Python</strong> ne moºe na¢i rje£ni£kiklju£.Podiºe se kad operacija prelazi raspoloºivumemoriju, ali program se jo² moºe spasitibrisanjem nekih obekata. Interpreter ne moºeuvijek uspje²no ispraviti ovu pogre²ku, papodiºe iznimku i ispisuje slijed.Podiºe se kad <strong>Python</strong> ne moºe prona¢i lokalnoili globalno ime. Argument iznimke je stringkoji ozna£uje izgubljeno ime.Podiºe se kad se referencira lokalna varijabla ufunkciji ili metodi, ali ne postoji vrijednostpridruºena toj varijabli.Podiºe se kada <strong>Python</strong> otkrije generi£kupogre²ku koja ne pripada niti jednoj drugojkategoriji. Argument iznimke je string kojipokazuje ²to je neispravno. <strong>Python</strong> rijetkopodiºe ovu sveobuhvatnu iznimku.


44 IznimkeIznimkaNotImplementedErrorSyntaxErrorTabErrorIndentationErrorSystemErrorTypeErrorValueErrorUnicodeErrorOpisPodiºe se kad se pozove metoda koja se jo² nijena£inila. Apstraktna metoda u korisnikovojtemeljnoj klasi moºe takožer podignuti ovuiznimku, ako se od izvedene klase zahtijeva daprebri²e ili prepuni (engl. override) metodu.Podiºe se kad <strong>Python</strong> interpreter otkrijesintaksnu pogre²ku u interaktivnom iliskriptnom na£inu rada. Ova iznimka se moºepojaviti u import ili exec naredbi, te ueval() ili input() pozivima funkcija, kad seincijalno £ita skripta ili se £ita standardni ulaz.Podiºe se kad se koristi -tt opcija unaredbenoj liniji sa programom kojinekonzistentno koristi tabulatore i praznamjesta.Podiºe se kad program prekida <strong>Python</strong>ovapravila uvla£enja (engl. indentation) izvornogprogramskog teksta.Podiºe se kad <strong>Python</strong> interpreter otkrijenutarnju pogre²ku koja nije toliko ozbiljna dazaustavi izvr²avanje interpretera. Argumentiznimke je string koji pokazuje gdje je do²lo dopogre²ke, na razini sistemskih (najniºih)operacija.Podiºe se kad se ugražena operacija ilifunkcija primjeni na objekt neprikladnog tipa.Argument iznimke je string koji pokazujedetalje o nepodudaranju tipova podataka.Podiºe se kad se ugraženoj operaciji ilifunkcija proslijedi argument koji ima ispravantip, ali ne i ispravnu vrijednost. To su slu£ajikoji se ne mogu opisati preciznijom iznimkom,kakva je na primjer IndexError.Podiºe se kad se pojavi pogre²ka u Unicodekodiranju ili dekodiranju.Evo nekih primjera £estih pogre²aka u programu koji podiºu iznimke:>>> 10 * (1/0)Traceback (most recent call last):File "", line 1, in ?ZeroDivisionError: integer division or modulo by zero>>> 4 + spam*3Traceback (most recent call last):File "", line 1, in ?NameError: name 'spam' is not defined>>> '2' + 2Traceback (most recent call last):File "", line 1, in ?TypeError: cannot concatenate 'str' and 'int' objectsPosljednja linija poruke o pogre²ki govori ²to se dogodilo. Budu¢i da postoji vi²e vrsta iznimaka,njihov tip se nalazi ispisan u poruci (npr. ZeroDivisionError, NameError and TypeError). Svaka <strong>Python</strong>


5.2. Rad s iznimkama 45ugražena iznimka podiºu true pri pojavi pogre²ke njenog tipa. Ostatak ispisane linije poruke pruºadetaljniji opis pogre²ke (TypeError), a dio prije imena iznimke govori o kontekstu u kojem se pogre²kadogodila. Taj kontekst je u obliku slijeda (Traceback) obavijesti, od posljednjeg mjesta, rekurzivnoprema po£etku mogu¢e pogre²ke.5.2 Rad s iznimkamaU <strong>Python</strong>u je mogu¢e pisati programe koji ¢e raditi (dohva¢ati i obraživati) promatrane iznimke, ²tose vidi na sljede¢em primjeru:>>> while True:... try:... x = int(raw_input("Unesite broj: "))... break... except ValueError:... print "Oops! To nije dobar broj. Probajte ponovo..."Pri tome Try radi po sljede¢em na£elu:• ako se tokom izvr²avanja ne pojavi iznimka, except linija se preska£e i try zavr²ava• ako se iznimka pojavi tijekom izvr²avanja try-a, i ako odgovara iznimci navedenoj u except liniji,onda se ona izvr²ava• ako se iznimka pojavi, a ne odgovara except liniji, provjeravaju se druge iznimke u try izrazu.Ako njih nema, program zavr²ava i pokazuje poruku koja je gore navedena.Pri tomu try moºe imati vi²e od jedne except linije (uvjeta), koji dohva¢aju neke druge iznimke.Pri tome se najvi²e izvr²ava jedna od njih, i to samo za iznimke navedene u tom djelu except linije, aline za druge. Except linija moºe imati vi²e iznimki, deniranih unutar n-terca, npr:... except (RuntimeError, TypeError, NameError):... passTry...except izraz moºe sadrºavati naredbu else koja se izvr²ava ako u try bloku nije dohva¢enaniti jedna iznimka.for arg in sys.argv[1:]:try:f = open(arg, 'r')except IOError:print 'cannot open', argelse:print arg, 'has', len(f.readlines()), 'lines'f.close()Taj se na£in koristi umjesto pisanja dodatnih linija u try-u, jer se tako izbjegava mogu¢nost uporabeiznimke koja nije navedena u try bloku. Iznimke mogu imati pridruºene vrijednosti, argumente,koji ovise o tipu iznimke. Except izraz moºe denirati varijablu nakon imena iznimke, koja je s instancomiznimke vezana s argumentima u instance.args. Umjesto kori²tenja instance.args dobro jeproslijediti jedinstveni argument iznimke i vezati ga s atributom poruke.>>> try:... raise Exception('miki', 'riki')... except Exception, inst:... print type(inst) # instance iznimke


46 Iznimke... print inst.args # argumenti pohranjeni u .args... print inst # __str__ dozvoljava ispis args... x, y = inst # __getitem__ dozvoljava da se args otpakiraju... print 'x =', x... print 'y =', y('miki', 'riki')('miki', 'riki')x = mikiy = rikiAko iznimka ima argument, on se ispisuje kao zadnji dio poruke o pogre²ci('detail'). Programi zarad s iznimkama mogu raditi i s funkcijama, koje se unutar njih pozivaju.>>> def nemoguce_dijeljenje():... x = 1/0...>>> try:... nemoguce_dijeljenje()... except ZeroDivisionError, detail:... print 'Run time pogreska u dijeljenju:', detail...Ovo je Run time pogreska u dijeljenju: integer division or modulo by zero.5.3 Obradba iznimkiKada <strong>Python</strong> podigne iznimku, ona se mora dohvatiti (uhvatiti) i obraditi, ina£e ¢e <strong>Python</strong> nasilnozavr²iti izvoženje programa. Obradba iznimki prisiljava programera na razmi²ljanje o tome ²to moºepo¢i krivo unutar programa i ²to se moºe u£initi u vezi toga. Nije prakti£no (i skoro je nemogu¢e) imatina umu sve ²to moºe po¢i krivo. Umjesto toga treba traºiti stanja koja se (govore¢i op¢enito) moguponovno vratiti, koriste¢i korekcijski blok kôda, koji se zove 'obrada iznimke' (engl. exception handler).Taj kôd moºe automatski popraviti stanje bez korisni£ke interakcije, upitati korisnika za dodatne iliprihvatljive podatke za popravak problema, ili u nekim okolnostima zatvoriti program sa sys.exit().(Dakako, cijeli je smisao iznimki u tome da se takve fatalne situacije izbjegnu). <strong>Python</strong>ova naredbatry detektira i obražuje iznimke. Ona je vi²eslojna naredba kao if ili while, te slijedi pravila uvlake.Try takožer mijenja uobi£ajeno upravljanje tijeka programa. (Upravljanje tokom programa je izvr²niniz naredbi koje £ine program).try:try_blockexcept ex:except_block<strong>Python</strong> pokre¢e kôd u bloku try dok ga ne zavr²i uspje²no ili se pojavi iznimka. Ako zavr²i uspje²no,<strong>Python</strong> preska£e blok except, te se izvr²enje nastavlja na naredbi koja slijedi iza njega. Ako se pojaviiznimka, <strong>Python</strong> preska£e ostatak naredbi bloka try i ispituje vrijednost ex u odlomku except kako bise ustanovilo je li vrsta podignute iznimke odgovara vrsti koja je opisana sa ex.Ako iznimka odgovara ex, <strong>Python</strong> pokre¢e blok except, te se upravljanje tokom programa prebacujena naredbu koja slijedi blok except. Ako iznimka ne odgovara ex, iznimka se pro²iruje na bilo kojeuklju£ene try naredbe, koje bi mogle imati odlomak except u kojem bi se iznimka mogla obraditi. Akoni jedna od obliºnjih except klauzula ne obražuje podignutu iznimku, onda <strong>Python</strong> zatvara program teispisuje poruku o pogre²ci.


5.3. Obradba iznimki 475.3.1 Ignoriranje iznimkeZa ignoriranje iznimke koristi se naredba pass unutar odlomka except.try:try_blockexcept ex:passpa ako se dogodi iznimka, <strong>Python</strong> je ignorira i upravljanje tokom programa prelazi na prvu naredbunakon pass naredbe.5.3.2 Pronalaºenje argumenta iznimkeKada se dogod iznimka, ona moºe imati i pridruºenu vrijednost takožer poznatu i kao argument iznimke.Vrijednost i tip argumenta ovise o tipu iznimke. Kod ve¢ine iznimki, argument je n-terac sastavljen odjednog string £lana koji upu¢uje na uzrok pogre²ke. Kod pogre²aka operacijskog sustava tipa IOError,argument sadrºi i dodatne atribute, kao ²to su broj pogre²ke ili ime datoteke. U tom slu£aju moºese koristiti funkcija dir() da bi se ispisao popis atributnih argumenta. Za pronalaºenje vrijednostiargumenta, treba se specicirati varijabla nakon imena iznimke u odlomku except.try:try_blockexcept ex, target:except_blockpa ako se dogodi iznimka, <strong>Python</strong> ¢e pridruºiti argument iznimke varijabli target.5.3.3 Obradba svih iznimkiDa bi se obuhvatilo sve iznimke, treba se specicirati odlomak except bez imena iznimke ili argumenta.Odlomak except koji na ovaj na£in obuhva¢a sve iznimke je op¢enito slabo rje²enje, jer obuhva¢a sveiznimke, a ne samo one koje su bitne, a osim toga, moºe prikriti stvarne pogre²ke korisni£kog programa.try:try_blockexcept:except_blockgdje except_block prihva¢a i obražuje sve iznimke.5.3.4 Pokretanje programskog koda bez prisustva iznimkeMogu¢e je takožer dodati odlomak uz else naredbu povezanu s odlomkom try kako bi se pokrenuoniz naredbi u slu£aju da odlomak try ne uzrokuje iznimku. Pritom odlomak nakon else mora slijeditiposljednji odlomak except (ako ih ima vi²e).try:try_blockexcept [...]:except_blockelse:else_block<strong>Python</strong> pokre¢e else_block jedino u slu£aju kad try_block ne uzrokuje iznimku.


48 Iznimke5.3.5 Obradba vi²e iznimkiMogu¢e je koristiti jedan except odlomak da bi se obuhvatilo vi²e tipova iznimki ili se moºe koristitivi²e except odlomaka kojima se obražuju pojedine iznimke.try:try_blockexcept (ex1, ex2, ...) [, target]:except_blockOdlomak except obuhva¢a bilo koju od popisanih iznimki (ex1, ex2, ...) te pokre¢e isti except_blockza sve njih. Target je dopustiva varijabla koja uzima argument iznimke.5.3.6 Pokretanje obaveznog kôda za £i²¢enjeNaredba try-finally moºe se koristiti za pokretanje programskog kôda bez obzira je li <strong>Python</strong> podigaoiznimku ili nije. Za razliku od odlomka except , odlomak finally ne dohva¢a iznimke, nego deniraakcije £i²¢enja koje se moraju obaviti u svakom slu£aju, bez obzira na postojanje pogre²ke. Odlomcifinally i except ne mogu se pojaviti zajedno u istom try odlomku. Programeri obi£no postavenaredbu try-finally unutar naredbe try-except kako bi obradili iznimke koje su podignute u naredbitry-finally. Isto tako, odlomak else ne moºe se dodati uz naredbu try-finally.try:try_blockfinally:finally_block<strong>Python</strong> pokre¢e kôd unutar finally_block-a nakon ²to ga pokrene u try_block-u. <strong>Python</strong> ¢epokrenuti finally_block bez obzira kako se try_block izvr²i: bilo normalno, bilo putem iznimkeili putem naredbe tipa break ili return. Ako se iznimka dogodi unutar try_block-a, <strong>Python</strong> ¢epresko£iti ostatak try_block-a, te pokrenuti finally_block, a onda ponovno podignuti iznimku kakobi se dohvatila naredbom try-except vi²e razine.5.3.7 Eksplicitno podizanje iznimkeNaredba raise se moºe upotrijebiti da bi se podigla ºeljena iznimka. Za eksplicitno podizanje iznimketreba utipkati:raise exiliraise ex, argiliraise ex, (arg1, arg2,...)Argument iznimke moºe biti jedna vrijednost, argument ili n-terac vrijednosti (arg1, arg2, ...).Ako je izostavljen, onda je pretpostavljena vrijednost argumenta None.


5.4. Korisni£ki denirane iznimke 495.4 Korisni£ki denirane iznimkeU <strong>Python</strong>u je mogu¢e stvarati korisni£ke iznimke tako da se deniraju nove klase iznimaka. Takveiznimke bi trebale direktno ili indirektno dolaziti iz klase ugraženih iznimaka, na primjer:>>> class MojBad(Exception):... def __init__(self, value):... self.value = value... def __str__(self):... return repr(self.value)...>>> try:... raise MojBad(2*2)... except MojBad, e:... print 'Moja se iznimka dogodila, value:', e.value...Moja se iznimka dogodila, value: 45.4.1 Tvorba iznimkiIznimke mogu biti stringovi, klase ili instance objekata. Iznimke u obliku stringova su zastarjele, iako ih<strong>Python</strong> jo² uvijek podrºava zbog kompatibilnosti. Korisni£ki denirane iznimke mogu se stvoriti koriste¢inaredbu class. Preporu£uje se kao temeljnu klasu uzeti <strong>Python</strong>ovu korijensku iznimku Exception.S korisni£ki deniranim iznimkama radi se na isti na£in kao i s ugraženim iznimkama. Uz except ielse, postoji i na£in da se denira iznimka koja ¢e se uvijek ispisati na kraju programa, bez obzira dalije ba² nju program traºio ili neku drugu. To je finally clause i denira se kao:>>> def dijeli(x, y):... try:... rez = x / y... except ZeroDivisionError:... print "Djeljenje s nulom!"... else:... print "Rezultat je", rez... finally:... print "Ispisujem zadnju iznimku"...>>> dijeli(2, 1)result is 2Ispisujem zadnju iznimku>>> dijeli(2, 0)division by zero!Ispisujem zadnju iznimku>>> dijeli("2", "1")Ispisujem zadnju iznimkuTraceback (most recent call last):File "", line 1, in ?File "", line 3, in divideTypeError: unsupported operand type(s) for /: 'str' and 'str'Kao ²to se vidi na primjeru, finally clause se ispisuje pri svakoj operaciji sa funkcijom djeli().TypeError pozvan kod dijeljenja dva stringa (dijeli("2","1")) nije pozivan od strane iznimaka,teje stoga ponovo pozvan nakon ²to se zadnja iznimka izvr²ila. Sve iznimke se mogu pozvati naredbomraise exception[,value], gdje value daje detalje o iznimci koja je pozvana.


50 Iznimke5.4.2 Dijagnosti£ko pridruºivanjePridruºivanje (eng. assertion) je alat za ispravljanje pogre²aka koji se koristi za ispis dijagnosti£kihpodataka dok program radi. <strong>Python</strong> naredba assert sadrºi bool-ov izraz koji ozna£ava pogre²ku, akoje false (neistina). Izraz je uvijek jednak jedinici, ako je istinit u trenutku kad se provjerava. Akoje izraz izra£unat kao neistina (false), onda <strong>Python</strong> podiºe AssertionError iznimku, koja se moºedohvatiti i obraditi kao bilo koja druga iznimka. Sintaksa je:assert expr [,arg]expr je izraz koji se provjerava, a moºe biti true ili false. Ako je expr jednak false, onda <strong>Python</strong>podiºe AssertionError iznimku s dopu²tenim argumentom arg. Ako je pak izraz expr jednak true,onda assert ne poduzima ni²ta.


POGLAVLJE 6FunkcijeVe¢ina naredbi tipi£nog <strong>Python</strong> programa organizirana je preko funkcija. Funkcija je skupina naredbikoje se izvr²avaju po pozivu. <strong>Python</strong> pruºa mnogo ugraženih funkcija i dopu²ta programerima deniranjevlastitih funkcija. Zahtjev za izvr²enje funkcije zove se funkcijski poziv (engl. function call).Kad se funkcija pozove, moºe primiti argumente koji speciciraju vrstu podataka s kojima funkcijaradi (obražuje ih). U <strong>Python</strong>u funkcija uvijek vra¢a rezultantnu vrijednost, koja moºe biti None ilivrijednost koja predstavlja rezultat nekog izra£una, izvr²enog u tijelu funkcije. U <strong>Python</strong>u su funkcijeobjekti, pa se sa njima upravlja isto kao i s drugim objektima. Tako se neka funkcija moºe proslijeditikao argument u pozivu neke druge funkcije. Sli£no tomu, funkcija moºe vratiti drugu funkciju kao rezultatobradbe, izvr²enja svog programskog kôda. Kao i svaki drugi objekt, funkcija moºe biti povezanas nekom varijablom, nekim £lanom unutar niza (polja, liste) ili atributom objekta. Funkcije takožermogu biti klju£evi u rje£niku.6.1 Naredba 'def'Funkcija se denira s pomo¢u klju£ne rije£i def. Def je naredba sa sljede¢om sintaksom:def funkcijsko_ime(parametri):naredba(e)funkcijsko_ime je identikator. To je varijabla koja se povezuje (ili re-povezuje) s funkcijskimobjektom prilikom izvr²enja naredbe def. parameteri je dopu²tena, slobodna lista identikatora, kojise zovu formalni parametri ili samo parametri, a koji se koriste kod poziva funkcija za pridruºivanjestvarnim vrijednostima koji se navode kao argumenti. U najjednostavnijem slu£aju, funkcija nema nikakvihformalnih parametara, ²to zna£i da kod poziva funkcija ne uzima nikakve argumente. U ovomslu£aju, denicija funkcije ima prazne zagrade koje slijede iza imena funkcije tj. funkcijsko_ime().Ako funkcija prihva¢a argumente, onda parametri sadrºe jedan ili vi²e identkatora, odvojenih zarezima.U ovom slu£aju, svaki poziv fukcije pridruºuje stvarne vrijednosti, argumente, s parametrima speciciranimau deniciji funkcije. Parametri su lokalne varijable funkcije, te svaki poziv funkcije povezuje tevarijable s odgovaraju¢im stvarnim vrijednostima koje pozivatelj navodi kao argumente. Niz naredbikoji nije prazan, poznatiji kao tijelo funkcije (engl. function body), ne izvr²ava se kada i naredba def.Ono se izvr²ava kasnije, svaki put kada se funkcija poziva. Tijelo funkcije moºe imati jednu ili vi²eponavljanja return naredbe, ali moºe postojati i bez nje. Evo primjera jednostavne funkcije koja vra¢advostruku vrijednost od one koju primi:def double(x):return x*251


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


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:


56 Funkcijedef zbroj(*br):rez = 0for x in br: rez += xreturn rezprint zbroj(*d.values( ))Dakako, argumenti oblika *niz ili **rj mogu se prenositi i kad se poziva funkcija koja ne koristisli£ne oblike u svojim formalnim parametrima.6.5.3 Prostor imenaFormalni parametri funkcije zajedno s bilo kakvim varijable koje su povezane (pridruºbom ili nekomdrugom povezuju¢om naredbom) u funkcijskom tijelu, tvore lokalni prostor imena funkcije (eng. localnamespace), takožer poznat i kao lokalni doseg (eng. local scope). Svaka od ovih varijabli zove se lokalnavarijabla funkcije. Varijable koje nisu lokalne zovu se globalne varijable. Ako lokalna varijabla unutarfunkcije ima isto ime kao i globalna varijabla, kada god se to ime spomene u tijelu funkcije, koristise lokalna, a ne globalna varijabla. Za ovakav pristup kaºe se da lokalna varijabla sakriva globalnuvarijablu istog imena kroz cijelo tijelo funkcije.6.5.4 Naredba 'global'Kako je prethodno opisano, bilo koja varijabla koja je povezana unutar tijela funkcije je lokalna varijablafunkcije. Ako pak funkcija treba re-povezati neke od svojih globalnih varijabli, prva naredba funkcijemora biti:global identifikatorigdje su identifikatori jedan ili vi²e identikatora odvojenih zarezima. Identikatori popisani uglobal naredbi odnose se na globalne varijable koje funkcija treba re-povezati. Na primjer, _count semoºe ubaciti u funkciju koriste¢i klju£nu rije£ global i globalnu varijablu, kako slijedi:_count = 0def counter( ):global _count_count += 1return _countBez global naredbe, funkcija counter() bi podigla UnboundLocalError iznimku, jer bi _count bioneinicijalizirana (nepovezana) lokalna varijabla. Takožer, iako naredba global omogu¢uje ovakvu vrstuprogramiranja, to ipak nije niti elegantno niti preporu£ljivo. Naredba global nije potrebna ako tijelofunkcije jednostavno koristi globalnu varijablu, uklju£uju¢i mijenjanje objekta povezanog na varijablu,dakako ako je objekt promjenljiv. Naredba global treba se koristiti samo onda kada tijelo funkcijere-povezuje globalnu varijablu. Stvar je stila, a i preporuke, da se naredba global ne koristi osim kadje to apsolutno nuºno.6.6 Ugnjeºžene funkcijeNaredba def unutar tijela funkcije denira ugnjeºženu funkciju (eng. nested function), a funkcija £ijetijelo uklju£uje def je poznata kao vanjska funkcija (eng. outer function) s obzirom na ugnjeºženu.Kôd unutar tijela ugnjeºžene funkcije moºe pristupiti (ali ne i re-povezati) lokalne varijable vanjskefunkcije, takožer poznate i kao slobodne varijable ugnjeºžene funkcije.Najjednostavniji na£in da se dopusti ugnjeºženoj funkciji pristup vanjskim vrijednostima nije oslanjatise na ugnjeºžene dosege varijabli ili upotreba global naredbe, nego prijenos vanjskih vrijednosti


6.6. Ugnjeºžene funkcije 57preko funkcijskih parametara/argumenata ugnjeºdene funkcije. Vrijednost argumenta moºe se povezatikada se ugnjeºžena funkcija denira s pretpostavljenom vrijednosti za izabrani argument. Na primjer:def postotak_1(a, b, c):def pc(x, ukupno=a+b+c): return (x*100.0) / ukupnoprint "Postotci su: ", pc(a), pc(b), pc(c)Isti program s upotrebom ugnjeºženih dosega izgledao bi ovako:def postotak_2(a, b, c):def pc(x): return (x*100.0) / (a+b+c)print "Postotci su: ", pc(a), pc(b), pc(c)U ovom slu£aju, postotak_1 ima malu prednost: izra£un a+b+c dogaža se samo jednom, dok kodpostotak_2 nutarnja funkcija pc ponavlja izra£un tri puta. Mežutim, ako vanjska funkcija re-povezujesvoje lokalne varijable izmežu poziva ugnjeºžene funkcije, ponavljanje izra£una bi mogla biti i prednost.To zna£i da se preporu£uje znanje oba pristupa, te izbor najprikladnijeg u danoj situaciji.Ugnjeºžena funkcija koja pristupa vrijednostima s vanjskih lokalnih varijabla poznata kao je zatvorenafunkcija ili closure. Sljede¢i primjer pokazuje kako izgraditi closure bez ugnjeºženih dosega(koriste¢i pretpostavljenu vrijednost):def make_adder_1(augend):def add(addend, _augend=augend): return addend+_augendreturn addIsta funkcija kori²tenjem ugnjeºženih dosega izgleda ovako:def make_adder_2(augend):def add(addend): return addend+augendreturn addClosures su iznimke u op¢em pravilu, jer su objektno-orjentirani mehanizmi najbolji na£in povezivanjapodataka i kôda zajedno. Kada se trebaju konstruirati pozivni objekti, s nekim parametrimau vremenu konstrukcije objekta, closures mogu biti ekasnije i jednostavnije od klasa. Na primjer,rezultat make_adder_1(7) je funkcija koja prihva¢a jedan argument i dodaje 7 na taj argument (rezultatmake_adder_2(7) se pona²a na isti na£in). Closure je "tvornica" za bilo kojeg £lana obiteljifunkcija koji se razlikuju po nekim parametrima, te moºe pomo¢i u izbjegavanju dvostrukog pisanjaprogramskog kôda.


POGLAVLJE 7<strong>Python</strong> - objektni jezik<strong>Python</strong> je programski jezik temeljen na objektima. Za razliku od nekih drugih, takožer objektnoorijentiranih,jezika, <strong>Python</strong> ne uvjetuje kori²tenje isklju£ivo objektno-orijentirane paradigme. <strong>Python</strong>takožer podrºava proceduralno (strukturalno) programiranje s modulima i funkcijama, tako da jemogu¢e izabrati najprikladniju paradigmu programiranja za svaki dio programa. Op¢enito, objektnoorijentiranaparadigma najbolja je kada se ºele skupiti podaci i funkcije u prakti£ne pakete. Isto takomoºe biti korisna kada se ºele koristiti neki od <strong>Python</strong>ovih objektno-orijentiranih mehanizama, kao npr.nasliježivanje. Proceduralna paradigma, koja je bazirana na modulima i funkcijama, obi£no je jednostavnijai prikladnija u slu£ajima kada nikakve prednosti objektno-orijentiranog programiranja nisupotrebne. Novi stil objektnog modela postaje standard u novim verzijama <strong>Python</strong>a, pa se preporu£ujekoristiti ga za programiranje.7.1 Klase i instanceKlasa ili razred je <strong>Python</strong> objekt s nekoliko zna£ajki:• Objekt klase moºe se pozivati kao da je funkcija. Poziv stvara novi objekt, poznat kao instancaklase, za koju se zna kojoj klasi pripada.• Klasa ima po volji imenovane atribute koji se mogu povezivati i referirati.• Vrijednosti atributa klase mogu biti podat£ani objekti ili funkcijski objekti.• Atributi klase koji su povezani na funkcije poznati su kao metode klase.• Metoda moºe imati posebno ime denirano od <strong>Python</strong>a s dvije podcrte ('__') ispred i iza imena.<strong>Python</strong> upotrebljava takve posebne metode za neke operacije koje se izvr²avaju na instancamaklase.• Klasa moºe podatke i metode naslijediti od drugih klasa, pa potraga nekog atributa koji nijeunutar same klase prenosi se na druge objekte, roditelje klase.• Instanca klase je <strong>Python</strong> objekt s po volji imenovanim atributima koji se mogu povezivati ireferirati.• <strong>Python</strong> klase su objekti, pa se s njima postupa kao i s drugim objektima. Tako se klasa moºeprenijeti kao argument u pozivu funkcij, a funkcija moºe vratiti klasu kao rezultat poziva. Klasa,kao i bilo koji drugi objekt, moºe biti povezana na varijablu (lokalnu lili globalnu), £lan niza iliatribut objekta. Klase takožer mogu biti i klju£evi u rije£niku.59


60 <strong>Python</strong> - objektni jezik7.2 Naredba 'class'Naredba class je naj£e²¢i na£in stvaranja objekta klase, i to s ovakvom sintaksom:class ime\_klase[(klase\_roditelji)]:naredba(e)String ime_klase je identikator. To je varijabla koja postaje povezana (ili re-povezana) s objektomklase nakon ²to naredba class zavr²i s izvr²avanjem. klase_roditelji je po volji zarezima odvojenniz izraza (obi£no stringovnih identikatora) £ije su vrijednosti objekti klasa. Ove su klase poznatepod razli£itim imenima u razli£itim jezicima - govori se o baznim klasama, superklasama ili roditeljimaklase koja se stvara. Za klasu koja se stvara kaºe se da 'naslježuje oblik', 'po£inje od', 'produºava se'ili 'podklasira' od svoje bazne, roditeljske klase. Ova klasa takožer je poznata kao izravna podklasa ilipotomak svojih baznih klasa. Podklasna veza izmežu klasa je prijelazna: ako je C1 podklasa od C2, aC2 podklasa od C3, onda je C1 podklasa od C3. Ugražena funkcija issubclass(C1,C2) prihva¢a dvaargumenta koji su objekti klase: vra¢a True ako je C1 podklasa od C2; u suprotnom vra¢a False. Svakaklasa je zapravo podklasa od same sebe, tako da issubclass(C, C) vra¢a True za bilo koju klasu C.Sintaksa naredbe class ima malu, nezgodnu razliku od sintakse naredbe def. U naredbidef, zagradesu obvezatne izmežu imena funkcije i dvoto£ke. Da se denira funkcija bez formalnih parametara, morase koristiti naredba kao:def ime( ):naredba(e)U naredbi class zagrade su obvezatne ako klasa ima jednu li vi²e roditeljskih klasa, ali su zabranjeneako ih klasa nema. Tako se za denaciju klase bez roditeljskih klasa mora koristiti naredba ovakvesintakse:class ime:naredba(e)Niz naredbi koji nije prazan, a koji slijedi naredbu class poznat je kao tijelo klase. Tijelo klaseizvr²ava se odmah, kao dio procesa izvr²enja naredbe class. Dok se tijelo ne izvr²i, novi objekt klasene postoji i identikator ime nije jo² povezan (ili re-povezan). Kona£no, valja primijetiti da naredbaclass ne stvara nove instance klase, nego denira skup atributa koji se dijele izmežu svih instanci kojese iz klase stvore.7.3 Tijelo klaseTijelo klase je mjesto gdje se speciciraju atributi klase; ovi atributi mogu biti podat£ani ili funkcijskiobjekti.7.3.1 Atributi klasnog objektaAtribut objekta klase obi£no se denira povezivanjem neke vrijednosti (npr. literala) na identikatorunutar tijela klase. Na primjer:class C1:x = 23print C1.x # ispisuje se: 23Objekt klase C1 ima atribut s imenom x, povezan na vrijednost cjelobrojnog literala 23, a C1.x seodnosi, referencira na taj atribut. Mogu¢e je takožer povezati ili odvezati atribute klase izvan tijelaklase. Na primjer:


7.3. Tijelo klase 61class C2:passC2.x = 23print C2.x # ispisuje se: 23Ipak, program je £itljiviji ako se poveºu, tj. stvore, atributi klase s naredbama unutar tijela klase.Bilo koji atributi klase implicitno se dijele svim instancama klase kad se te instance stvore. Naredbaclass implicitno denira neke vlastite, posebne atribute klase. Atribut __name__ je ime klase,stringovni identikator kori²ten u naredbi class. Atribut __bases__ je n-terac objekata klase koji sudani kao roditeljske klase u naredbi class (ili prazan n-terac, ako nema zadanih roditeljskih, baznihklasa). Na primjer, za ve¢ stvorenu klasu C1 vrijedi:print C1.__name__, C1.__bases__ # ispisuje se: C1, ( )Klasa takožer ima atribut __dict__, ²to je rje£ni£ki objekt kojeg klasa koristi za potporu (popis)svih svojih ostalih atributa. Za svaki objekt klase C, bilo koji objekt x i za bilo kakav identikator S(osim __name__, __bases__ i __dict__) vrijedi:C.S=x je ekvivalentan s C.__dict__['S']=x.Na primjer, za poznatu klasu C1:C1.y = 45C1.__dict__['z'] = 67print C1.x, C1.y, C1.z # ispisuje se: 23, 45, 67Pritom nema razlike izmežu atributa klase koji su stvoreni unutar tijela klase, izvan tijela klasezadavanjem atributa ili izvan tijela klase eksplicitnim povezivanjem sa C.__dict__.U naredbama koje su izravno u tijelu klase, reference na atribute klase moraju koristiti puno, a nejednostavno ime kvantikatora. Na primjer:class C3:x = 23def f1(self):print C3.x# mora se koristiti C3.x, a ne samo xTreba primijetiti da reference atributa (npr. izraz kao C.S) imaju bogatiju semantiku nego jednostavnopovezivanje atributa.7.3.2 Denicija funkcije unutar tijela klaseVe¢ina tijela klasa uklju£uju naredbu def, jer su funkcije (u ovom kontekstu se zovu metode) vaºniatributi za objekte klase. Uz to, metoda denirana unutar tijela klase uvijek ima obvezatan prviparametar, koji se dogovorno imenuje kao self, a odnosi se na instancu u kojoj se metoda poziva.Parametar self igra posebnu ulogu u pozivima metode. Evo primjera klase koja uklju£uje denicijumetode:class C4:def pozdrav(self):print "Zdravo"Klasa moºe denirati takožer nekoliko posebnih metoda (metoda sa imenima koja imaju dvijepodcrte ispred i iza imena), a koje se odnose na posebne operacije.


62 <strong>Python</strong> - objektni jezik7.3.3 Varijable speci£ne za klasuKada naredba u tijelu klase (ili u metodi unutar tijela) koristi identikator koji po£inje s dvije podcrte(ali ne zavr²ava podcrtama) - __ident, <strong>Python</strong> compiler implicitno mijenja identikator u _classname__ident,gdje je classname ime klase. Ovo dopu²ta klasi kori²tenje privatnih imena za atribute, metode, globalnevarijable i druge svrhe, bez rizika njihovog slu£ajnog dupliciranja negdje drugdje. Dogovorno, sviidentikatori koji po£inju jednom podcrtom takožer se namijenjeni kao privatni, za doseg koji ih povezuje,bez obzira je li doseg unutar klase ili nije. <strong>Python</strong> compiler ne prisiljava dogovore oko privatnostivarijabli i metoda, to je ostavljeno programerima u <strong>Python</strong>u.7.3.4 Dokumentacijski stringAko je prva naredba u tijelu klase literal niza znakova (string), onda compiler povezuje taj niz znakovakao atribut dokumentacijskog stringa za tu klasu. Ovaj se atribut zove __doc__ te je poznat kaodokumentiranje klase. Ima isto svojstvo kao ve¢ opisan po£etni komentar ili pomo¢ (engl. help) udeniciji funkcije.7.4 Instanca klaseNeka je zadana klasa ZiroRacun ovako:class ZiroRacun:"Jednostavna klasa"tip_racuna = "Ziro"def _ _init_ _(self,ime,racun):"Inicijalizacije nove klase"self.osoba = nameself.novac = racundef polog(self,iznos):"Dodaje iznosu na ra£unu"self.novac = self.novac + iznosdef povuci(self,iznos):"Oduzima od iznosa na ra£unu"self.novac = self.novac - iznosdef provjeri(self):"Vraca iznos na racunu"return self.novacInstance klase stvaraju se pozivom class objekta. Tada se istodobno stvara nova instanca i poziva__init__() metoda te klase (ako je u njoj denirana). Na primjer:# Neka se klasa zove ZiroRacuna = ZiroRacun("Mario", 1000.00)# Stvara instancu 'a' i poziva ZiroRacun.__init__(a,"Mario", 1000.00)b = ZiroRacun("Bill", 100000000000L)# Stvara instancu 'b' i poziva ZiroRacun.__init__(b,"Bill", 100000000000L)Jednom na£injeni, atributi i metode novo nastale instance dohvatljivi su kori²tenjem 'to£ka' (.)operatora:a.polog(100.00)b.povuci(sys.maxint)i = a.imeprint a.tip_racuna# Poziva ZiroRacun.deposit(a,100.00)# Poziva ZiroRacun.povuci(b,sys.maxint)# Dohvaca a.ime# Ispisuje tip_racuna


7.4. Instanca klase 63Interno, svaka instanca se stvara koriste¢i rje£nik koji je dohvatljiv kao instanca __dict__ atributa.Ovaj rje£nik sadrºi informaciju koja je jedinstvena za svaku instancu. Na primjer:>>> print a.__dict__{'novac': 1000.0, 'osoba': 'Mario'}>>> print b.__dict__{'novac': 100000000000L, 'osoba': 'Bill'}Kad god se atributi instance promijene, ove promjene nastaju u njihovom lokalnom rje£niku instance.Unutar metoda deniranih u klasi, atributi se mijenjaju kroz pridruºbu self varijabli. Mežutim, noviatributi mogu se dodati nekoj instanci u bilo kojem trenutku, kao na primjer:a.jmbg = 123456# dodaje atribut 'jmbg' u a.__dict__Iako se pridruºba atributima uvjek provodi na lokalnom rje£niku neke instance, pristup atributuponekad je vrlo sloºen. Kad god se pristupa atributu, <strong>Python</strong> interpreter (compiler) prvo pretraºujerje£nik instance. Ako ne naže traºeno, onda se pretraºuje rje£nik objekta klase koja se koristila zastvaranje instance. Ako ni to nije urodilo plodom, onda se provodi pretraºivanje roditeljskih klasa (akoih klasa ima). Ako i to propadne, kona£ni poku²aj traºenja atributa je pozivom __getattr__() metodete klase (ako je denirana). Na koncu, ako ni to ne uspije, onda se podiºe AttributeError iznimka.Kako je pokazano, da bi se stvorila instanca klase, treba se (poput poziva funkcije) pozvati objektklase. Svaki poziv vra¢a novi objekt instance te klase: jedna_instanca = C5(). Ugražena funkcijaisinstance(Obj,C) s objektom klase kao argumentom C vra¢a True ako je objekt Obj instanca klaseC ili bilo koje podklase od C. U protivnom isinstance vra¢a False.7.4.1 __init__Kada klasa ima ili naslježuje metodu __init__, poziv objektu klase implicitno izvr²ava __init__ nanovoj instanci kako bi se obavila inicijalizacija koja je potrebna instanci. Argumenti koji se predajuputem poziva moraju odgovarati formalnim parametrima __init__ metode. Na primjer, u sljede¢ojklasi:class C6:def __init__(self,n):self.x = nEvo kako stvoriti jednu instancu klase C6:jedna_instanca = C6(42)Kako je pokazano u C6 klasi, metoda __init__ obi£no sadrºi naredbe koje povezuju atribute instance.Metoda __init__ ne smije vra¢ati nikakvu vrijednost osim vrijednosti None, jer svaka drugavra¢ena vrijednost uzrokuje TypeError iznimku. Glavna svrha __init__ je povezivanje, tj. stvaranjeatributa novostvorene instance. Atributi instance takožer se mogu povezivati ili re-povezivati i izvan__init__ metode. Programski kod bit ¢e £itljiviji ako se svi atributi klasne instance inicijalno poveºunaredbama u metodi __init__.7.4.2 Atributi objekta instanceJednom kada se stvori instanca, moºe se pristupiti njenim atributima (podacima i metodama) koriste¢i'to£ka' (.) operator. Na primjer:i4=C4();i4.pozdrav( ) # ispisuje se: Zdravoprint jedna_instanca.x # ispisuje se: 42


64 <strong>Python</strong> - objektni jezikObjektu instance moºe se dodati neki atribut povezivanjem neke vrijednosti na referencu atributa.Na primjer:class C7: passz = C7( )z.x = 23print z.x # ispisuje se: 23Objekt instance z sada ima atribut koji se zove x, povezan na vrijednost 23, i z.x se odnosi na tajatribut. To povezivanje atributa omogu¢uje takožer posebna metoda __setattr__. Stvaranje instanceimplicitno denira dva atributa instance. Za svaku instancu z, z.__class__ je klasa objekta kojemuz pripada, a z.__dict__ je rje£nik koji z koristi za £uvanje svih svojih ostalih atributa. Na primjer, zainstancu z koja je upravo stvorena:print z.__class__.__name__, z.__dict__# ispisuje se: C7, {'x':23}Oba ova atributa mogu se re-povezati (ali ne odvezati), iako je ovo rijetko nuºno. Za bilo koji objektinstance z, bilo koji objekt x, i bilo koji identikator S (osim __class__ i __dict__), z.S=x jeekvivalentan s z.__dict__['S']=x (osim ako __setattr__ posebna metoda presretne poku²aj povezivanja).Na primjer, za poznatu stvarenu instancu z:z.y = 45z.__dict__['z'] = 67print z.x, z.y, z.z # ispisuje: 23, 45, 67Nema razlike u atributima instance stvorenima s funkcijom __init__, zadavanjem preko atributaili po eksplicitnom povezivanju sa z.__dict__.7.4.3 Tvorni£ka funkcijaPostoji potreba stvaranja instance razli£itih klasa ovisno o nekim uvjetima ili izbjegavanje stvaranjanove instance ako je postoje¢a jo² uvijek dostupna. Te bi se potrebe mogle rije²iti tako da __init__vrati speci£an objekt, ali to nije mogu¢e jer <strong>Python</strong> podiºe iznimku kad __init__ vrati bilo kojuvrijednost osim None. Najbolji na£in implementacije eksibilnog stvaranja objekata je koriste¢i obi£nufunkciju, a ne pozivanjem objekta klase izravno. Funkcija koja se koristi u ovu svrhu zove se tvorni£kafunkcija.Pozivanje tvorni£ke funkcije je eksibilno rje²enje, jer takva funkcija moºe vra¢ati postoje¢u instancukoja se moºe ponovno koristiti ili stvoriti novu instancu pozivanjem odgovaraju¢e klase. Recimo dapostoje dvije sli£ne klase (Posebna i obicna) i da se treba generirati jedna od njih, ovisno o argumentu.Sljede¢a tvorni£ka funkcija Prikladna to omogu¢uje:class Posebna:def metoda(self): print "posebna"class Obicna:def metoda(self): print "obicna"def Prikladna(obicnaje=1):if obicnaje: return Obicna( )else: return Posebna( )i1 = Prikladna(obicnaje=0)i1.metoda( ) # ispisuje se: "posebna", kako je traºeno


7.5. Naslježivanje 657.4.4 Brojanje referenci i brisanje instanceSve instance imaju brojilo referenci. Ako brojilo referenci postane jednako nuli, instanca se bri²e. Iakopostoji vi²e na£ina kako izbrisati referencu, program naj£e²¢e koristi del naredbu za brisanje referencena objekt. Ako brisanje neke refernce u£ini da se brojilo referenci objekta smanji na nulu, program ¢epozvati __del__() metodu. <strong>Python</strong>-ov 'skuplja£ sme¢a' bri²e iz memorije sve instance koje su ostalebez referenci i na taj na£in oslobaža memorijski prostor drugim objektima.7.5 NaslježivanjeNaslježivanje je mehanizam stvaranja novih klasa koje specijaliziraju ili mijenjaju pona²anje postoje¢eklase. Originalna klasa zove se temeljna, roditeljska klasa (bazna, eng. base class) ili nadklasa, superklasa(engl. superclass). Nova klasa se zove izvedena klasa ili podklasa (eng. subclass). Kada se klasastvara putem naslježivanja, ona naslježuje atribute denirane u njenim roditeljskim klasama. Mežutim,izvedena klasa moºe redenirati bilo koji od ovih atributa i dodati nove vlastite atribute. Naslježivanjese specicira s listom imena roditeljskih klasa koje se odvajaju zarezom u class naredbi. Na primjer:class A:varA = 42def method1(self):print "Class A : method1"class B:varB = 37def method1(self):print "Class B : method1"def method2(self):print "Class B : method2"class C(A,B): # Naslježuje se od A i BvarC = 3.3def method3(self):print "Class C : method3"class D: passclass E(C,D): passAko se traºi atribut deniran u temeljnoj klasi, onda se koristi algoritam u dubinu (eng. depth-rstsearch) za pretraºivanje i to u temeljnim klasama kako su navedene u poretku prilikom denicije klase.Na primjer, u klasi E u prethodnom primjeru, temeljne klase se pretraºuju redoslijedom C, A, B, D. Uslu£aju da vi²estruke temeljne klase deniraju isti simbol, uzet ¢e se prvi simbol kojeg procs traºenjanaže. Na primjer:c = C()c.method3()c.method1()c.varB# Create a 'C'# Invoke C.method3(c)# Invoke A.method1(c)# Access B.varBAko izvedena klasa denira atribut s istim imenom kao atribut u temeljnoj klasi, onda ¢e instanceod izvedene klase koristiti atribute izvedene, a ne roditeljske klase. Ako se ipak ºeli koristiti originalniatribut, onda se mora napisati puno ime do tog atributa, tj. ime_roditeljske_klase.atribut, kaona primjer:


66 <strong>Python</strong> - objektni jezikclass D(A):def method1(self):print "Class D : method1"A.method1(self)# poziva roditeljsku metoduJedna posljedica ove £injenice nalazi se u inicijalizaciji klasnih instanci. Kad se instanca stvara, ondase ne poziva metoda __init__() roditeljskih klasa. To zna£i, da je u izvedenoj klasi nuºno na£initiispravnu inicijalizaciju roditeljske klase, ako je to potrebno. Na primjer:class D(A):def __init__(self, args1):# Inicijalizacija roditeljske klaseA.__init__(self)# Initialize myself...Sli£ni koraci mogu takožer biti nuºni kad se deniraju akcije £i²¢enja (brisanja objekata) u __del__()metodi. Kada se koristi referenca atributa C.ime na objekt klase, i 'ime' nije klju£ u C.__dict__,potraga se implicitno prosliježuje na svaki objekt klase koji je u C.__bases__, po redoslijedu navoženja.C-ove roditeljske klase mogu imati i vlastite roditeljske klase. U ovom slu£aju, potraga rekurzivnoproslježuje navi²e, po drvetu nasliježa, zaustavljaju¢i se kada je 'ime' naženo. Potraga je po dubini,²to zna£i da pregledava pretke svake roditeljske klase od C prije pregleda sljede¢e roditeljske klase odC. Slijedi primjer:class Roditeljska_1:def neka_metoda(self): print "Roditeljska_1"class Roditeljska_2(Roditeljska_1): passclass Base3:def neka_metoda(self): print "Roditeljska_3"class Izvedena(Roditeljska_2, Roditeljska_3): passinst1 = Izvedena( )inst1.neka_metoda( ) # ispisuje se: "Roditeljska_1"U ovom slu£aju potraga za metodom zapo£inje u klasi Izvedena. Ako tamo nije pronažena, potragase nastavlja na Roditeljska_2. Ako ni tamo atribut nije nažen, potraga ide na pretka Roditeljska_2,tj. na Roditeljska_1, gdje je atribut napokon nažen. Tako se pretraga zaustavlja na toj to£ki i nikadane uzima u obzir Roditeljska_3, gdje bi se taj atribut takožer na²ao.7.5.1 Premo²¢uju¢i atributiPotraga za atributom, kako je obja²njeno, ide navi²e po drvetu nasliježa (prema precima), te se zaustavljakada je atribut pronažen. Potoma£ke klase pregledavaju se prije predaka, ²to zna£i da kadapodklasa denira atribut s istim imenom kao i onaj na superklasi, pretraga nalazi deniciju na podklasii tu se zaustavlja. Ovo je poznato kao premo²¢ivanje (engl. overriding) denicije u superklasi kojeobavlja podklasa:class B:a = 23b = 45def f(self): print "metoda f u klasi B"def g(self): print "metoda g u klasi B"class C(B):b = 67


7.5. Naslježivanje 67c = 89d = 123def g(self): print "metoda g u klasi C"def h(self): print "metoda h u klasi C"U ovom kodu, klasa C premo²¢uje atribute b i g od njene superklase B.7.5.2 Posluºivanje metoda superklaseKada podklasa C premosti metodu f svoje superklase B, tijelo C.f £esto ºeli predati neki dio svojeoperacije implementaciji metode superklase. Ovo se moºe napraviti koriste¢i nepovezanu metodu, kakoslijedi:class Gornja:def pozdrav(self, ime): print "Zdravo ", imeclass Donja(Gornja):def pozdrav(self, ime):print "Dobro do²li",Gornja.pozdrav(self, ime)x = Donja( )x.pozdrav('Miki')Predaja superklasi, u tijelu Donja.pozdrav, koristi nepovezanu metodu dobivenu referencom atributaGornja.pozdrav na superklasi, i zato prenosi sve atribute normalno, uklju£uju¢i self. Predajaili posluºivanje implementaciji superklase je glavna korist nepovezanih metoda.7.5.3 Vi²eobli£jeVi²eobli£je ili polimorzam, (eng. polymorphism) ili dinami£ko povezivanje potpuno se otkriva krozproces traºenja nekog atributa, prethodno opisano u naslježivanju objekata. Kad god se metodi pristupasa obj.method(), prvo se metoda locira traºenjem __dict__ atributa instance, pa instancine klasnedenicije, pa roditeljskih klasa. To traºenje uvijek ide u tom redoslijedu. Prvi uspje²ni pronalazakkoristi se kao traºena metoda.7.5.4 Skrivanje informacije (engl. information hiding)Pretpostavlja se da su svi atributi javni (engl. public). To zna£i da su svi atributi klasne instancedohvatljivi bez ikakvog ograni£enja. To takožer povla£i da sve ²to je denirano u temeljnoj, roditeljskojklasi naslježuje se i dohvatljivo je u izvedenoj klasi. Takvo pona²anje je £esto nepoºeljno u objektuorjentiranim primjenama, jer to otkriva nutarnju strukturu objekta i moºe voditi koniktima prostoraimena izmežu objekata deniranih u izvedenoj klasi i onih deniranih u roditeljskoj klasi. Da bi serije²io ovaj probleem, uvedeno je da sva imena u klasi koja po£inju s dvostrukom donjom crtom (__) ,kao ²to je __Moj, pretvara se u oblik _Classname __Moj. To pruºa rje²enje za klasu da ona ima privatneatribute, budu¢i da privatna imena u izvedenoj klasi ne¢e kolidirati s imenima u temeljnoj klasi jer suimena klasa nuºno razli£ita, a dolaze ispred imena atributa. Na primjer:class A:def __init__(self):self.__X = 3# Pretvara se u self._A__Xclass B(A):def __init__(self):


68 <strong>Python</strong> - objektni jezikA.__init__(self)self.__X = 37# Pretvara se u self._B__XIako ovakva shema daje iluziju sakrivanja podataka, ne postoji stvarni mehanizam da bi se sprije£iopristup "privatnim" atributima neke klase. To zna£i da, ako su poznati klasa i njen atribut, onda seoni mogu dohvatiti s gore opisanim punim imenom iz bilo koje instance.7.5.5 Operatorsko punjenjeKorisni£ki objekti mogu se pro²iriti s novim operatorima, dodaju¢i posebne metode da zajedno rade sasvim <strong>Python</strong>-ovim ugraženim operatorima. Na primjer, sljede¢a klasa nadopunja kompleksne brojeve sastandardnim matemati£kim operatorima i prisilnim tipovima kako bi se ostvarilo mije²anje kompleksnihbrojeva s cijelim i realnim brojevima.class Complex:def __init__(self,real,imag=0):self.real = float(real)self.imag = float(imag)def __repr__(self):return "Complex(%s,%s)" % (self.real, self.imag)def __str__(self):return "(%g+%gj)" % (self.real, self.imag)# self + otherdef __add__(self,drugi):return Complex(self.real + drugi.real, self.imag + drugi.imag)# self - otherdef __sub__(self,drugi):return Complex(self.real - drugi.real, self.imag - drugi.imag)# -selfdef __neg__(self):return Complex(-self.real, -self.imag)# drugi + selfdef __radd__(self,drugi):return Complex.__add__(drugi,self)# other - selfdef __rsub__(self,drugi):return Complex.__sub__(drugi,self)# Prisilno pretvori ostale numeri£ke tipove u kompleksnidef __coerce__(self, drugi):if isinstance(drugi, Complex):return self,drugitry: # Provjeriti ako se moºe pretvoriti u floatreturn self, Complex(float(drugi))except ValueError:passU ovom primjeru, postoji nekoliko zanimljivih detalja:1. Prvo, normalno pona²anje od __repr__() je stvaranje stringa koji ¢e se izvr²iti kako bi se ponovnona£inio objekt. U ovom slu£aju stvara se string oblika "Complex(r,i)". U drugom slu£aju, metoda__str__() stvara string koji je namijenjen za lijepi formatirani izlaz (to je string koji ¢e se ispisatis pomo¢u print naredbe).2. Drugo, da bi se radilo s operatorima u kojima se kompleksni brojevi pojavljuju i na lijevoj i nadesnoj strani operatora, moraju se koristiti __op__() i __rop__() metode.


7.6. Testovi pripadnosti klasa i tipova 693. Kona£no, __coerce__ metoda koristi se u dohva¢anju operacija koje uklju£uju mije²ane tipovepodataka. U ovom slu£aju, drugi numeri£ki tipovi pretvaraju se u kompleksne brojeve tako da semogu koristiti u metodama kompleksne aritmetike.7.6 Testovi pripadnosti klasa i tipovaTrenuta£no, postoji odijeljenost izmežu tipova i klasa. To konkretno zna£i, da se ugraženi tipovi poputlista i rje£nika ne mogu specijalizirati naslježivanjem, jer ono za njih ne postoji. Isto tako niti klase nemogu denirati nove tipove. Ustvari, sve klasne denicije imaju tip ClassType, dok sve klasne instanceimaju tip InstanceType. Zbog toga je izraztype(a) == type(b)istinit, za bilo koja dva objekta koja su instance klase (£ak i ako su stvorena iz razli£itih klasa).Provjera pripadnosti klasi provodi se upotrebom ugražene funkcije isinstance(obj,cname). Ovafunkcija vra¢a istinu, ako objekt obj pripada klasi cname ili bilo kojoj klasi izvedenoj iz cname. Naprimjer:class A: passclass B(A): passclass C: passa = A()b = B()c = C()# Instanca od 'A'# Instanca od 'B'# Instanca od 'C'print isinstance(a,A)print isinstance(b,A)print isinstance(b,C)# Vra¢a True# Vra¢a True, B je izveden iz A# Vra¢a False, C nije izveden iz ASli£no, ugražena funkcija issubclass(A ,B ) vra¢a istinu ako je A podklasa klase B. Na primjer:issubclass(B,A)issubclass(C,A)# Vra¢a True# Vra¢a FalseFunkcija isinstance() moºe se koristiti za izvr²avanje provjere tipa s obzirom na bilo koji ugraženitip:import typesisinstance(3, types.IntType)isinstance(3, types.FloatType)# Vra¢a True# Vra¢a FalseOvo je preporu£en na£in provjere tipa mežu ugraženim tipovima, jer ¢e razlika izmežu tipova i klasamoºda i²£eznuti u budu¢im ina£icama <strong>Python</strong>-a.


POGLAVLJE 8Moduli i paketiPodaci (varijable), funkcije, klase i objekti skupljaju se u module. Vi²e modula zajedno £ini paket.Moduli i paketi predstavljaju <strong>Python</strong> knjiºnicu (engl. library).8.1 ModulU modul je mogu¢e uklju£iti bilo koju valjanu datoteku s <strong>Python</strong> kôdom, te pozvati ga s naredbomimport. Na primjer, neka je sljede¢i kôd spremljen u datoteku 'primjer.py':# datoteka: primjer.pya = 37# Varijabladef A:# Funkcijaprint "Ja sam u A"class K:# Klasadef B(self):print "Ja sam u K.B"b = K()# Tvorba instancePozvati u memoriju ovakav kôd kao modul, postiºe se naredbom import primjer. Prvi put kad seimport koristi da se modul u£ita u memoriju, dogažaju se tri stvari:1. Modul stvara novi prostor imena koji sluºi svim objektima deniranim u pripadnoj izvornojdatoteci. Ovaj prostor imena dohva¢a se ako funkcije i metode denirane unutar modula koristenaredbu global.2. Modul izvr²ava kôd koji je sadrºan unutar novonastalog prostora imena.3. Modul izvr²ava ime unutar pozivatelja, koje se odnosi na prostor imena modula. Ovo ime podudarase s imenom modula.import primjerprint primjer.aprimjer.A()c = primjer.K()...# U£itava u memoriju i izvodi modul 'primjer'# Dohva¢a izvodi neki £lan (varijablu) modula 'primjer'# Dohva¢a i izvodi funkciju iz modula# Dohva¢a i izvodi klasu iz modula, tvorba objektaU£itavanje, uvoz (eng. import) vi²estrukih modula izvodi se tako da se iza naredbe import dopi²uimena modula, odijeljena zarezom, na primjer ovako:71


72 Moduli i paketiimport socket, os, regexModuli se mogu u£itati (importirati) koriste¢i alternativna imena, i to upotrebom poveznice as. Naprimjer:import os as sustavimport socket as mreza, thread as nitsustav.chdir("..")mreza.gethostname()Naredba from koristi se za speci£ne denicije unutar modula s trenuta£nim prostoru imena. Ovanaredba predstavlja pro²irenje naredbe import gdje se uz novo stvoreni prostora imena, stvara i referencana jedan ili vi²e objekata deniranih untar modula:from socket import gethostname# Stavlja gethostname u trenuta£ni prostor imenaprint gethostname()socket.gethostname()# Koristi se bez imena modula# Pogre²ka imena (NameError: socket)Naredba from takožer prihva¢a zarezom odvojena imena objekata. Zvjezdica (engl. asterisk , *) jesveobuhvatni (engl. wildcard) znak koji se koristi za u£itanje svih denicija u modulu, osim onih kojepo£inju s podvu£enom crtom (_). Na primjer:from socket import gethostname, socketfrom socket import *# Puni sve definicije u trenuta£ni prostor imenaModuli se mogu preciznije upravljati skupom imena koji se u£ita s from module import * definiranjemliste __all__. Na primjer:# module: primjer.py__all__ = [ 'K', 'primjer' ] # To su sva ona imena koja ¢e se uvu¢i sa *Nadalje, poveznica as moºe se koristiti za promjenu imena objekata koji se u£itaju s naredbomfrom. Na primjer:from socket import gethostname as ime_hostah = ime_hosta()Naredba import moºe se pojaviti na bilo kojem mjestu u programu. Mežutim, kôd u svakommodulu izvodi se samo jednom, bez obzira kako £esto se naredba import izvr²ava. Idu¢e importnaredbe jednostavno stvaraju referencu na prostor imena modula koji je stvoren s po£etnom importnaredbom. U varijabli sys.modules moºe se na¢i rje£nik koji sadrºi imena svih trenuta£no napunjenihmodula. On preslikavaa imena modula na njihove objekte. Sadrºaj rje£nika se koristi za odreživanje jeli import napunio svjeºu kopiju modula ili se isti modul poziva drugi put.Naredba from module import * moºe se koristiti samo na vrhu modula. Drugim rije£ima, nijedopu²teno koristiti ovaj oblik import naredbe unutar tijela funkcije, zbog njegove interakcije s pravilimafunkcijskog dosega (engl. scoping rules). Svaki modul denira variablu __name__ koja sadrºiime modula. Programi mogu ispitivati ovu varijablu i pritom odrediti modul u kojem se programskenaredbe izvr²avaju. Najvi²i (tzv. top-level) modul interpretera zove se __main__. Programi zadanina naredbenoj liniji ili une²eni interaktivno, uvijek se izvode unutar tog __main__ modula. Ponekadprogram moºe promijeniti ovo pona²anje, ovisno o tomu je li uvu£en iz modula ili je izveden u __main__okoli²u. To se moºe posti¢i na ovaj na£in:


8.1. Modul 73# provjera je li se vrti kao programif __name__ == '__main__':# DaNaredbeelse:# ne, uvucen je kao modulNaredbe8.1.1 Traºenje modulaKad se moduli u£itavaju, interpreter traºi listu imenika, foldera u sys.path.sys.path moºe izgledati ovako:Tipi£na vrijednost['', '/usr/local/lib/python2.5','/usr/local/lib/python2.5/lib-tk','/usr/local/lib/python2.5/lib-dynload','/usr/local/lib/python2.5/site-packages']Prazan string odnosi se na trenuta£ni imenik, folder. Novi imenici dodaju se u put traºenja vrlojednostavno - dodavanjem £lana (stringa puta) u ovu listu.8.1.2 U£itavanje modula i compilacijaDo sada su moduli prikazani kao datoteke koje sadrºe <strong>Python</strong> kôd. Mežutim, moduli u£itani s naredbomimport mogu pripadati nekoj od £etiri op¢e kategorije:• Programi pisani u <strong>Python</strong>u (.py datoteke)• C ili C++ pro²irenja koja su compilirana u zajedni£kim (shared) knjiºnicama ili DLL-ovima.• Paketi koji sadrºe skupove modula• Ugraženi moduli pisane u C-u i povezani s <strong>Python</strong> interpreteromKad se na primjer, traºi modul primjer, interpreter pretraºuje svaki od direktorija u sys.path zasljede¢e datoteke (navedene po redoslijedu pretraºivanja):1. Imenik ili folder primjer koji je deniran u paketu2. primjer.so, primjermodule.so, primjermodule.sl, ili primjermodule.dll (compilirana pro-²irenja)3. primjer.pyo (samo ako je -O ili -OO opcija kori²tena)4. primjer.pyc5. primjer.pyZa .py datoteke, kad se modul prvi put u£ita, on se prevede, compilira u mežukôd (eng. bytecode)i zapisuje na disk u datoteku s pro²irenjem .pyc. U idu¢im u£itanjima, interpreter puni ovaj prireženimežukôd, osim ako ne dože do promjene originalne .py datoteke (pa se .pyc datoteka mora regenerirati.Datoteke koje zavr²avaju na .pyo koriste se u svezi s interpreterskom -O opcijom. Ove datoteke sadrºemežukôd s izba£enim brojevima linija i drugim informacijama potrebnim za traºenje pogre²aka (eng.debugging). Kao rezultat toga, kôd je ne²to manji i dopu²ta interpretoru ne²to brºe izvoženje. U slu£aju-OO opcije svi dokumentacijski stringovi se takožer izbacuju iz datoteka. Ovo brisanje dokumentacijskihstringova pojavljuje se samo kad se .pyo datoteke stvaraju, a ne kad se pune. Ako niti jedna od ovih


74 Moduli i paketidatoteka ne postoji u niti jednom imeniku (folderu) u sys.path, onda interpreter provjerava da li imeodgovara imenu nekog ugraženog modula. Ako ni ono ne postoji, onda se podiºe ImportError iznimka.Compilacija datoteka u .pyc i .pyo datoteke dogaža se samo u sprezi s naredbom import. Programiizvedeni preko naredbene linije ili preko standardnog ulaza ne proizvode takve datoteke. Naredbaimport u traºenju datoteka razlikuje mala i velika slova u njihovom imenu. Kod operacijskih sustavakoji ne podrºavaju tu razliku, potrebno je o tomu voditi ra£una.8.1.3 Ponovno punjenje modulaUgražena funkcija reload() koristi se za ponovno punjenje i izvr²avanje kôda sadrºanog unutar modulakoji je prethodno u£itan s naredbom import. Ona prima objekt modula kao pojedina£ni argument. Naprimjer:import primjer... neki kôd ...reload(primjer)# Ponovno puni modul 'primjer'Sve operacije uklju£ene u modul ¢e se nakon izvoženja naredbe reload() izvesti iz novo u£itanogkôda. Mežutim, reload() ne¢e retroaktivno obnoviti objekte koji su nastali iz starog modula. To zna£ida je mogu¢e istodobno postojanje referenci na objekte i u staroj i u novoj verziji modula. Nadalje,compilirane ekstenzije pisane u C ili C++ ne mogu se ponovono puniti naredbom reload(). Kaoop¢e pravilo, treba izbjegavati ponovno punjenje modula, osim za vrijeme razvitka programa i traºenjapogre²ki u njemu.8.2 PaketiPaketi dopu²taju da se vi²e modula skupi zajedno pod jednim zajedni£kim imenom. Ova tehnikapomaºe u razlu£ivanju sukoba u prostoru imena modula koji se koriste u razli£itim primjenama. Paketse denira stvaranjem imenika, foldera (engl. directory, folder) s istim imenom kao paket i stvaranjem__init__.py datoteke u tom imeniku. Mogu¢e je nakon toga dodavati druge izvorne datoteke (tekstovnedatoteke s <strong>Python</strong> kôdom), compilirana pro²irenja ili podpakete u istom imeniku. Na primjer, paket semoºe ovako organizirati:Graphics/__init__.pyPrimitive/__init__.pylinije.pyispuna.pytekstovi.py...Graph2d/__init__.pyplot2d.py...Graph3d/__init__.pyplot3d.py...Formati/__init__.pygif.pypng.py


8.2. Paketi 75tiff.pyjpeg.pyNaredba import koristi se za punjenje modula iz paketa na nekoliko na£ina:import Graphics.Primitive.ispunaOvo u£itava podmodul Graphics.Primitive.ispuna. Sadrºaj tog modula mora se eksplicitnoimenovati, kao na primjer: Graphics.Primitive.ispune.crtaj(img,x,y,color).Drugi na£in:from Graphics.Primitive import ispunau£itava podmodul ispuna i £ini ga raspoloºivim i bez paketnog preksa, na primjer: ispuna.crtaj(img,x,y,color).Tre¢i na£in:from Graphics.Primitive.ispuna import crtajOva naredba u£itava podmodul ispuna i £ini crtaj funkciju direktno primjenljivom, primjerice:crtaj(img,x,y,color). Kad god se neki dio paketa u£ita, importira, kôd u datoteci __init__.py setad izvr²i. U najmanjem slu£aju ova datoteka moºe biti i prazna, ali takožer moºe sadrºavati kôd kojimse izvode inicijalizacije koje su speci£ne za paket. Sve nažene datoteke u __init__.py za vrijemeu£itavanja, automatski se izvr²avaju. Tako ¢e naredba import Graphics.Primitive.ispuna izvr²iti__init__.py datoteke i u Graphics imeniku i u Primitive imeniku.Jedan poseban problem s paketima je obradba ovakve naredbe:from Graphics.Primitive import *šeljeni cilj ove naredbe je u£itati sve module pridruºene u paketu s trenuta£nim prostorom imena.Mežutim, s obzirom da dogovori oko imena datoteka (pogotovo u smislu razlikovanja velikih i malihslova) variraju od sustava do sustava, <strong>Python</strong> ne moºe to£no odrediti koje module to£no treba uklju£iti.Kao rezultat, ova naredba samo u£itava sve reference koje su denirane u __init__.py datoteci uPrimitive imeniku. Ovo se pona²anje moºe promijeniti deniranjem liste __all__ koja sadrºi svaimena modula pridruºena s paketom.Takva lista treba biti denirana unutar paketa u __init__.py datoteci, kao na primjer:# Graphics/Primitive/__init__.py__all__ = ["linije", "tekstovi", "ispuna",...]Ako korisnik pokrene naredbu from Graphics.Primitive import * onda se svi navedeni podmoduliu£itaju, kako se i o£ekuje. U£itavanje samo imena paketa ne¢e automatski u£itati sve podmodulekoji se nalaze u paketu. Na primjer, sljede¢i kôd ne¢e raditi:import GraphicsGraphics.Primitive.fill.floodfill(img,x,y,color)# Pogre²no!Mežutim, budu¢i da importGraphics naredba izvr²ava __init__.py datoteku u Graphics imeniku,mogu¢e ju je promijeniti tako da se automatski u£itaju svi podmoduli:# Graphics/__init__.pyimport Primitive, Graph2d, Graph3d# Graphics/Primitive/__init__.pyimport linije, tekstovi, ispuna ...


76 Moduli i paketiNa ovaj na£in importGraphics naredba u£itava sve podmodule i £ini ih raspoloºivima za pozive koriste¢injihova potpuna imena. Moduli koji su sadrºani unutar istog imenika (foldera) paketa, mogu referenciratijedan drugog bez navoženja punog imena paketa. Na primjer, modul Graphics.Primitive.ispunamoºe u£itati Graphics.Primitive.linije modul jednostavno koriste¢i naredbu import linije. Mežutim,ako je modul smje²ten u drugom imeniku, onda se mora koristiti puno ime paketa. Na primjer,ako plot2d iz modula Graphics.Graph2d traºi upotrebu linije iz modula Graphics.Primitive, morase koristiti puna staza imena: from Graphics.Primitive import linije. Ako je potrebno, modulmoºe ispitati svoju __name__ varijablu kako bi na²ao potpunu stazu svog imena. Na primjer, sljede¢ikôd u£itava modul iz sestrinskog podpaketa znaju¢i samo ime tog podpaketa (a ne i najvi²e ime s vrhapaketa):# Graphics/Graph2d/plot2d.py# Odrežuje ime paketa, gdje je smje²ten moj paketimport stringbase_package = string.join(string.split(__name__,'.')[:-2],'.')# Import the ../Primitive/ispuna.py moduleexec "from %s.Primitive import ispuna" % (base_package,)Kona£no, kad <strong>Python</strong> u£itava paket, on denira posebnu varjablu __path__ koja sadrºi listu imenikakoji se pretraºuju, kad se se traºe paketni podmoduli. (Varijabla __path__ je posebna ina£ica sys.pathvarijable.) __path__ je dohvatljiv za kôd sadrºan u datoteci __init__.py i inicijalno sadrºi jedan £lans imenom foldera (imenika) paketa. Ako je potrebno, paket moºe dodati dodatne imenike u __path__listu da bi se promijenila staza koja se koristi u traºenju podmodula.


POGLAVLJE 9Ulaz i izlazPod pojmom ulaz/izlaza razmatraju se mogu¢i argumenti naredbene linije, varijable okoline, rad sdatotekama, naredba (ili funkcija) 'print', te o£uvanje programskih objekta.9.1 ƒitanje naredbene linije i varijable okoli²aKad interpreter zapo£ne s radom, argumenti naredbene linije spremaju se u listu sys.argv. Prvi elementliste je ime programa koji se pokre¢e. Idu¢i elementi su mogu¢i argumenti unes²eni na naredbenojliniji iza imena programa koji se izvodi. Sljede¢i program pokazuje kako pristupiti takvim argumentimanaredbene linije:# printopt.py# Print all of the command-line optionsimport sysfor i in range(len(sys.argv)):print "sys.argv[%d] = %s" % (i, sys.argv[i])Izvoženjem programa dobije se sljede¢e:% python printopt.py foo bar -psys.argv[0] = printopt.pysys.argv[1] = foosys.argv[2] = barsys.argv[3] = -p%Varijable okoli²a dohva¢aju se u rje£niku os.environ. Na primjer:import ospath = os.environ["PATH"]user = os.environ["USER"]editor = os.environ["EDITOR"]... etc ...Promjena varijabli okoli²a provodi se postavljanjem os.environ varijable. Druga je mogu¢nostpozivom funkcije os.putenv() function. Na primjer:os.environ["FOO"] = "BAR"os.putenv("FOO","BAR")77


78 Ulaz i izlaz9.2 DatotekeUgražena funkcija open(name [,mode ]) otvara i stvara datoteke, kao ²to sljedi:f = open('foo')f = open('foo','w')# Otvara 'foo' za citanje# Otvara za pisanjeNa£ini otvaranja datoteke (engl. le) su 'r' za £itanje (eng. read), 'w' za pisanje (engl. write), ili 'a'za dodavanje sadrºaja u ve¢ postoje¢u datoteku (eng. append). Binarni podatci spremaju se u datotekus oznakom 'b', pa vrijedi 'rb' kao na£in £itanja binarnih podataka, a 'wb' kao na£in spremanja inarnihpodataka. To je opcionalno u UNIX-u, ali nuºno na Windows-ima, gdje se treba uklju£iti kako bi sepostigla prenosivost s jednog sustava na drugi. Uz to, datoteka se moºe otvoriti za aºuriranje (eng.update) koriste¢i znak (+) character, pa vrijedi 'r+' ili 'w+'. U slu£aju otvaranja datoteke za aºuriranje,mogu¢e je izvr²iti i ulaz i izlaz podataka, dok god svaka izlazna operacija sprema iz memorije (engl.flush) svoje podatke u datoteku, prije bilo koje ulazne operacije. Ako je datoteka otvorena sa ' w+'onda se na po£etku njena duljina pretvara u nulu (bri²e se sadrºaj). open() vra¢a objekt datoteke (eng.file object) koji podrºava methode prikazane u tablici 9.1:Tablica 9.1: Metode s datotekamaMetodeOpisf.read([n])£ita najvi²e n okteta (engl. bytes)f.readline([n])£ita jednu ulaznu liniju do najvi²e n znakova.Ako se n iizostavi, onda £ita cijelu liniju.f.readlines()£ita sve linije i vra¢a listu.f.xreadlines()Returns an opaque sequence object whereeach iteration reads a new line from the le.f.write(s) Upisuje u datoteku string s .f.writelines(l ) Upisuje u datoteku sve stringove iz liste l .f.close()Zatvara datoteku.f.tell()Vra¢a trenuta£no kazalo (brojilo znakova)datoteke.f.seek(offset [, where ]) Traºi novu poziciju u datoteci.f.isatty()Vra¢a 1 ako je f interactivni terminal.f.flush()Sprema (eng. ushes) izlazni mem. bufer udatoteku.f.truncate([size]) Skra¢uje datoteku na najvi²e size okteta.f.fileno()Vra¢a cjelobrojni identikator datoteke.f.readinto(buffer,nbytes)U£itava nbytes podataka iz memorijskog buerobjekta.Metoda read() vra¢a £itavu datoteku kao jedan string, osim ako je zadan jedan proizvoljan parametarlength kojim se odreºuje maksimalna duljina u£itanih okteta. Metoda readline() vr¢a sljede¢uliniju ulaza, uklju£uju¢i i znak zavr²etka linije (eng. newline terminator); metoda readlines() vra¢asve ulazne linije kao listu stringova. Metoda readline() dodatno prhva¢a makismalnu duljinu linije n.Ako je linija duºa od n okteta, frunkcija vra¢a samo n u£itanih okteta. Ostatak podataka na liniji se nebri²e, ve¢ se u£itava u idu¢im £itanjima. Obje metode: readline() i readlines() ovise o operacijskomsustavu te obražuju na razli£ite na£ine zavr²etke linija (na primjer, 'n' u odnosu na 'rn'). Metoda xreadlines()vra¢a poseban objekt koji omogu¢uje u£itavanje linija datoteke iteracijskimpostupkom, umjesto cjelokupnog u£itavanja linija odjednom u memoriju, kao ²to to radireadlines() metoda. Na primjer:


9.3. Standardni ulaz, izlaz i pogre²ka (engl. Input, Output, Error) 79for line in f.xreadlines():# Naciniti nesto s linijom...Metoda write() upisuje string u datoteku, a metoda writelines()upisuje listu stringova u datoteku.U svim ovim slu£ajima, string moºe sadrºavati binarne podatke, uklju£uju¢i umetnute nullznakove. Metoda seek()koristi se za direktan pristup nekom mjestu u datoteci, deniranom zadanimoffset parametrom, koji se nadovezuje na vrijednost parametra where. Ako je where jednak 0 (²toje pretpostavljena vrijednost), seek() pretpostavlja da je vrijednost offset relativna s obzirom napo£etak datoteke; ako je vrijednost parametra where jednaka 1, pozicija se ra£una relativno s obziromna trenuta£nu poziciju, a ako je jednaka 2, pomak se ra£una od kraja datoteke. Metoda fileno() vra¢acjelobrojno kazalo datoteke i ponekad se koristi u ulazno/izlaznim operacijama niske razine u stanovitimknjiºni£kim modulima. Na strojevima koji podrºavaju velike datoteke (ve¢e od 2 GB) metode seek()itell() koriste duge cijele brojeve (long integers). Objekti datoteke ima takožer atribute prikazane usljede¢oj tablici 9.2:f.closedf.modef.namef.softspaceAtributiTablica 9.2: Atributi datotekaOpisBoolova vrijednost koja pokazuje stanjedatoteke:0 ako je datoteka otvorena, a 1 ako jezatvorena.Ulazno/izlazni mod (I/O) za datoteku.Ime datoteke, ako je otvorena s open(). Ina£e,atribut predstavlja string koji pokazuje izvornikod datoteke.Boolova vrijednost koja pokazuje da li sepraznina treba ispisivati ispred drugevrijednosti kad se koristi print naredba.9.3 Standardni ulaz, izlaz i pogre²ka (engl. Input, Output, Error)<strong>Python</strong> interpreter raspolaºe s tri standardna objekta datoteka, poznata kao standard input, standardoutput i standard error, koji se nalaze u sys modulu i pozivaju sa sys.stdin, sys.stdout i sys.stderr. Stdinje objekt datoteke, koji odgovara tijeku (engl. stream) ulaznih znakova koji dolaze od interpretera.Stdout je objekt datoteke koja prima izlaz kojeg proizvodi naredba print. Stderr je datoteka kojaprima poruke o pogre²kama. Naj£e²¢e je stdin preslikan tj. odgovara korisni£koj tipkovnici, dok sustdout i stderr preslikavaju na ispis na zaslon ra£unala. Metode opisane u prethodnom odlomku, moguse korisititi i za izvoženje sirovog ulaza/izlaza (eng. I/O) u komunikaciji s korisnikom. Na primjer,sljede¢a funkcija £ita ulaznu liniju sa standardnog ulaza:def gets():text = ""while 1:c = sys.stdin.read(1)text = text + cif c == '\n': breakreturn textAlternativno, ugražena funkcija raw_input(prompt) moºe £itati liniju teksta sa standardnog ulazastdin:s = raw_input("type something : ")print "You typed '%s'" % (s,)


9.5. Otpornost 81form = """\Dragi %(ime)s,Molim Vas vratite mi moj %(vlasnistvo)s ili mi platite $%(iznos)0.2f Eura."""print form % { 'ime': 'gosp. Miki','vlasnistvo': 'bicikl','iznos': 150,}S po²tovanjem,<strong>Python</strong> MlažiZa ovakve obrasce koji imaju puno linija i £lanova koji se trebaju zamijeniti, puno je jasnije napisatijednu print naredbu s popisom £lanova u rje£niku, nego svaki tekst pisati pojedina£no.9.5 Otpornost£esto je potrebno spremiti objekt u datoteku i poslije ga iz datoteke pro£itati. Jedan na£in je da se na£ininiz funkcija za spremanje objekta u datoteku i isto tako funkcije za £itanje. Tu mogu nastati razli£itipristupi, ovisno o sklonostima i razmi²ljanju programera. Jedan ugraženi pristup ovom problemu jeserijalizacija objekta koja se postiºe upotrebom pickle i shelve modula. Modul pickle serijaliziraobjekt u tok okteta (eng. stream of bytes) koje se mogu zapisati u datoteku. Na primjer, sljede¢i kôdzapisuje objekt u datoteku:import pickleobject = someObject()f = open(filename,'w')pickle.dump(object, f) # Sprema objektPonovno obnavljanje objekta postiºe se sljede£im kôdom:import picklef = open(filename,'r')object = pickle.load(f) # Obnavlja objektModul shelve je sli£an, ali objekte sprema u bazu podataka sli£nu rje£niku:import shelveobject = someObject()dbase = shelve.open(filename)dbase['key'] = object...object = dbase['key']dbase.close()# Otvara bazu# Sprema objekt u bazu# Vra¢a objekt iz baze# Zatvara bazuU oba slu£aja, samo se serijalizirani objekti mogu spremiti u datoteku. Ve¢ina <strong>Python</strong> objekatase moºe serijalizirati, ali objekti posebne vrste, kao ²to su na primjer datoteke, ne mogu se spremati iobnavljati na ovaj na£in.


Literatura[1] Wesley J. Chun, Core <strong>Python</strong> Programming, Prentice-Hall, Inc., 2001.[2] Alex Martelli, <strong>Python</strong> in a Nutshell, O'Reilly, 2003.[3] David M Beazley , <strong>Python</strong> Essential Reference, New Riders Publishing , 2001.[4] Rashi Gupta, Making Use of <strong>Python</strong>, Wiley Publishing, Inc., 2002.[5] Allen B. Downey; Jerey Elkner; Chris Meyers, How to Think Like a Computer Scientist,Green Tea Press, 2005.[6] David Ascher; Alex Martelli; Ravenscroft, <strong>Python</strong> Cookbook, O'Reilly, 2005.[7] Magnus Lie Hetland, Beginning <strong>Python</strong>: From Novice to Professional, Apress, 2005.[8] Dave Brueck; Stephen Tanner, <strong>Python</strong> 2.1 Bible, Hungry Minds, 2001.[9] Chris Vehily, <strong>Python</strong>: Visual QuickStart Guide, Peachpit Press, 2001.[10] Brad Dayley, <strong>Python</strong> Phrasebook: Essential Code and Commands, Sams, 2006.83

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!