mario essert, domagoj Ševerdija, ivan vazler -...

84
Mario Essert, Domagoj Ševerdija, Ivan Vazler Digitalni udžbenik Python - osnove - Odjel za matematiku Sveučilišta Josipa Jurja Strossmayera Osijek, 2007.

Upload: ngonhan

Post on 15-Feb-2018

236 views

Category:

Documents


5 download

TRANSCRIPT

Page 1: Mario Essert, Domagoj Ševerdija, Ivan Vazler - programiranjeprogramiranje.yolasite.com/resources/glavni_py.pdf · Python - osnove - Odjel za matematiku Sveučilišta Josipa Jurja

Mario Essert, Domagoj Ševerdija, Ivan Vazler

Digitalni udžbenik

Python- osnove -

Odjel za matematikuSveučilišta Josipa Jurja Strossmayera

Osijek, 2007.

Page 2: Mario Essert, Domagoj Ševerdija, Ivan Vazler - programiranjeprogramiranje.yolasite.com/resources/glavni_py.pdf · Python - osnove - Odjel za matematiku Sveučilišta Josipa Jurja
Page 3: Mario Essert, Domagoj Ševerdija, Ivan Vazler - programiranjeprogramiranje.yolasite.com/resources/glavni_py.pdf · Python - osnove - Odjel za matematiku Sveučilišta Josipa Jurja

Sadržaj

Sadržaj 3

1 Python interpreter 71.1 Jezične značajke . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71.2 Izvođenje Python programa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81.3 Naš prvi Python program . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

2 Tipovi podataka 112.1 Brojevi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142.2 Nizovi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

2.2.1 Stringovi - nizovi alfanumeričkih znakova . . . . . . . . . . . . . . . . . . . . . . 152.2.2 N-terac . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172.2.3 Lista . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

2.3 Temeljne operacije i metode s nizovima . . . . . . . . . . . . . . . . . . . . . . . . . . . 182.3.1 Ugrađene metode string-ova . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192.3.2 Ugrađene metode listi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

2.4 Rječnik . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222.4.1 Ugrađene metode rječnika . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22

2.5 Skup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23

3 Izrazi, operatori i operacije 253.1 Varijable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253.2 Naredbe pridruživanja . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

3.2.1 Obična pridružba . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263.2.2 Proširena pridružba . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273.2.3 Naredba del . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273.2.4 Bool -ove vrijednosti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27

3.3 Operatori i operacije . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283.3.1 Numeričke i aritmetičke operacije . . . . . . . . . . . . . . . . . . . . . . . . . . . 293.3.2 Prisilna i eksplicitna pretvorba . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293.3.3 Usporedba . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303.3.4 Operacije na bitovima cijelih brojeva . . . . . . . . . . . . . . . . . . . . . . . . . 30

3.4 Operacije na nizovima . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303.4.1 Kriška (eng. slicing) niza . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313.4.2 Stacionarne operacije na listi i rječniku . . . . . . . . . . . . . . . . . . . . . . . 32

3.5 Naredba Print . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32

4 Programsko upravljanje 334.1 Naredba if . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334.2 Naredba while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 344.3 Naredba for . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35

3

Page 4: Mario Essert, Domagoj Ševerdija, Ivan Vazler - programiranjeprogramiranje.yolasite.com/resources/glavni_py.pdf · Python - osnove - Odjel za matematiku Sveučilišta Josipa Jurja

4.4 Iteratori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364.5 Funkcije range i xrange . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 374.6 Sažete liste . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 374.7 Naredba break . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38

5 Iznimke 395.1 Vrste iznimki . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395.2 Rad s iznimkama . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 425.3 Obradba iznimki . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43

5.3.1 Ignoriranje iznimke . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 445.3.2 Pronalaženje argumenta iznimke . . . . . . . . . . . . . . . . . . . . . . . . . . . 445.3.3 Obradba svih iznimki . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 445.3.4 Pokretanje programskog koda bez prisustva iznimke . . . . . . . . . . . . . . . . 455.3.5 Obradba više iznimki . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 455.3.6 Pokretanje obaveznog kôda za čišćenje . . . . . . . . . . . . . . . . . . . . . . . . 455.3.7 Eksplicitno podizanje iznimke . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45

5.4 Korisnički definirane iznimke . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 465.4.1 Tvorba iznimki . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 465.4.2 Dodjelivalo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47

6 Funkcije 496.1 Naredba def . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 496.2 Parametri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 506.3 Atributi funkcijskih objekata . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 516.4 Naredba Return . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 526.5 Pozivanje funkcija . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52

6.5.1 Prenošenje argumenata . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 526.5.2 Vrste argumenata . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 536.5.3 Prostori za imena . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53

6.6 Globalna naredba . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 546.7 Ugnježđene funkcije . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54

7 Python - objektni jezik 577.1 Klasične klase i instance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 577.2 Naredba class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 587.3 Tijelo klase . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58

7.3.1 Atributi objekata klase . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 587.3.2 Definicije funkcija unutar tijela klase . . . . . . . . . . . . . . . . . . . . . . . . . 597.3.3 Varijable specifične za klasu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 607.3.4 Dokumentacijski string . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60

7.4 Instance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 607.4.1 __init__ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 617.4.2 Atributi objekata instance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 617.4.3 Tvornička funkcija . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 627.4.4 Brojanje referenci i uništenje instance . . . . . . . . . . . . . . . . . . . . . . . . 62

7.5 Reference atributa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 627.6 Metode povezivanja i odvezivanja . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63

7.6.1 Detalji nepovezanih metoda . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 647.7 Nasljeđivanje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64

7.7.1 Premošćujući (engl. overriding) atributi . . . . . . . . . . . . . . . . . . . . . . . 667.7.2 Posluživanje metoda superklase . . . . . . . . . . . . . . . . . . . . . . . . . . . . 667.7.3 "Brisanje" atributa klasa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 677.7.4 Višeobličje (eng. polymorphism) . . . . . . . . . . . . . . . . . . . . . . . . . . . 67

Page 5: Mario Essert, Domagoj Ševerdija, Ivan Vazler - programiranjeprogramiranje.yolasite.com/resources/glavni_py.pdf · Python - osnove - Odjel za matematiku Sveučilišta Josipa Jurja

5

7.7.5 Skrivanje informacije (engl. information hiding) . . . . . . . . . . . . . . . . . . . 677.7.6 Operatorsko punjenje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67

7.8 Testovi pripadnosti klasa i tipova . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68

8 Moduli i paketi 718.1 Moduli . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71

8.1.1 Modulski put traženja (engl. Search Path) . . . . . . . . . . . . . . . . . . . . . . 738.1.2 Učitavanje, punjenje (engl. import) modula i compilacija . . . . . . . . . . . . . 738.1.3 Ponovno punjenje modula (engl. reloading) . . . . . . . . . . . . . . . . . . . . . 74

8.2 Paketi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74

9 Ulaz i izlaz 779.1 Čitanje opcija i varijabli okoliša . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 779.2 Datoteke (engl. files) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 789.3 Standardni ulaz, izlaz i pogreška (engl. Input, Output, Error) . . . . . . . . . . . . . . . 799.4 Naredba print . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 809.5 Otpornost . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81

Literatura 83

Indeks 84

Page 6: Mario Essert, Domagoj Ševerdija, Ivan Vazler - programiranjeprogramiranje.yolasite.com/resources/glavni_py.pdf · Python - osnove - Odjel za matematiku Sveučilišta Josipa Jurja
Page 7: Mario Essert, Domagoj Ševerdija, Ivan Vazler - programiranjeprogramiranje.yolasite.com/resources/glavni_py.pdf · Python - osnove - Odjel za matematiku Sveučilišta Josipa Jurja

POGLAVLJE 1Python interpreter

Python je interpreterski, interaktivni, objektu orjentirani programski jezik, kojeg je 1990. godine prvirazvio Guido van Rossum. Već do konca 1998., Python je imao bazu od 300.000 korisnika, a od 2000.već su ga prihvatile ustanove kao MIT, NASA, IBM, Google, Yahoo i druge. Python 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.Python je besplatan (za akademske ustanove i neprofitnu upotrebu), open-source software, s izuzetnodobrom potporom, literaturom i dokumentacijom.

1.1 Jezične značajke

Interpretacija međukôda

Python 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 Python kôda istog je reda veličine kao u Javi iliPerlu. Python je napisan u ANSI C i raspoloživ za cijeli niz strojeva i operacijskih sustavauključujući Windows, Unix/Linux i Macintosh.

Jezik visoke razine

Osim standardnih tipova podataka (brojevi, nizovi znakova i sl.) Python ima ugrađenetipove podataka visoke razine kao što su liste, n-terci i rječnici.

Interaktivnost

Python se može izvoditi u različitim okruženjima. Za razvitak programa najlakši je interak-tivni nač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 sintaksa

7

Page 8: Mario Essert, Domagoj Ševerdija, Ivan Vazler - programiranjeprogramiranje.yolasite.com/resources/glavni_py.pdf · Python - osnove - Odjel za matematiku Sveučilišta Josipa Jurja

8 Python interpreter

Sintaksa jezika je jednostavna i očevidna. Uvlake zamjenjuju posebne znakove za definiranjeblokova kôda, pa je napisani program vrlo pregledan i jednostavan za čitanje.

Napredne značajke jezika

Python nudi sve značajke očekivane u modernom programskom jeziku: objektu orijentiranoprogramiranje s višestrukim nasljeđivanjem, dohvaćanje izuzetaka ili iznimki (engl. excep-tion), redefiniranje standardnih operatora, pretpostavljene argumente, prostore imena (engl.namespaces), module i pakete.

Proširivost

Python 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 programa

Pythonova knjižnica (engl. library), koja uključuje standardnu instalaciju, uključuje preko200 modula, što pokriva sve od funkcija operacijskog sustava do struktura podataka potreb-nih za gradnju web-servera. Glavni Python web site (www.python.org) nudi sažeti indexmnogih Python projekata i različitih drugih knjižnica.

Potpora

Python ima veliku entuzijastičku zajednicu korisnika koja se svake godine udvostručuje.

1.2 Izvođenje Python programa

Python kôd može se izvoditi na više načina:Interaktivni rad

To je najčešći način rada kod pisanja novih programa, a započinje pozivom python u Li-nux -u, odnosno dvostrukim klikom na ikonicu u Windows okruženju. U MS-DOS okruženju,Python se poziva isto kao u Unix -u/Linux -u, jedino je sistemski znak (engl. prompt) dru-gačiji. Pozivom interpetera otvara se njegova okolina, npr. pod PythonWin-om:

PythonWin 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 PythonWin’for further copyright information.>>>

ili pod Linux-om:

$ pythonPython 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 Python izvodi tu naredbu, ispisujerezultat i ponovo ispisuje prompt očekujući novu naredbu:

>>> print ’Znam zbrojiti: 1+2 =’, 1+2Znam zbrojiti: 1+2 = 3>>>

Page 9: Mario Essert, Domagoj Ševerdija, Ivan Vazler - programiranjeprogramiranje.yolasite.com/resources/glavni_py.pdf · Python - osnove - Odjel za matematiku Sveučilišta Josipa Jurja

1.3. Naš prvi Python program 9

Na ovaj način Python 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, ...), Python interpreter ispisuje ’...’ i automatski čini uvlaku za nove naredbe. UWindows okruženju postoji više grafičkih rješenja za interaktivan rad. U instalacijskompaketu s Pythonom dolazi IDLE kojeg je razvio Python-ov autor. IDLE koristi TkinterGUI framework i prenosiv je na sve Python platforme koje imaju Tkinter potporu.

Bolja rješenja od IDLE-a su PythonWin, PyScripter i novija, koja korisniku daju punografičkih rješenja za jednostavnu Python upotrebu kako u interaktivnom tako i u skriptnomradu.

Skriptni rad

Programi se spremaju u skripte s pomoću običnog text editora ili Python orjentiranog gra-fič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.py

skripta izvodi i na zaslonu se dobije rezultat: Znam zbrojiti: 1+2 = 3 jer je kôd skriptebio isti onaj utipkan u interaktivnom radu.

Umetnuti (embeded) kôd

Iako se češće unutar Pythona mogu pozivati funkcije iz drugih programa (npr. C -a za slučajprogramskog ubrzanja), moguće je Python kôd u obliku izvornih tekst naredbi izvoditi iunutar programa pisanog u drugom programskom jeziku, koristeći Python runtime API, naprimjer unutar C -programa:

#include <Python.h>. . .Py_Initialize();PyRun_SimpleString("x = a + 2*pi");

1.3 Naš prvi Python program

Neka se na početku promotri jedan primjer Python programa, kako bi se uočila svojstva i način pisanjaprogramskog kôda.

from random import rand intgotovo=False ; korak=0bro j=randint (1 , 100)whi l e not gotovo :

x=in t ( raw_input ( "Pogodi␣ z am i s l j e n i ␣ bro j : " ) )i f x==bro j :

p r i n t ’ Cestitamo ! ’gotovo=True ;

e l i f x<bro j :p r i n t ( ’ Pucaj ␣ nav i s e ! ’ )

e l s e :p r i n t ( ’ Pucaj ␣ nanize ! ’ )

korak+=1pr in t ’ Pogodak␣ i z ␣%d . ␣puta . ’ % korak

Page 10: Mario Essert, Domagoj Ševerdija, Ivan Vazler - programiranjeprogramiranje.yolasite.com/resources/glavni_py.pdf · Python - osnove - Odjel za matematiku Sveučilišta Josipa Jurja

10 Python interpreter

Prva 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 Pythonu 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 uPythonu 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).

Page 11: Mario Essert, Domagoj Ševerdija, Ivan Vazler - programiranjeprogramiranje.yolasite.com/resources/glavni_py.pdf · Python - osnove - Odjel za matematiku Sveučilišta Josipa Jurja

POGLAVLJE 2Tipovi podataka

Računalni program je algoritam zadan programskim naredbama koje se izvršavaju nad nekom vrstom ilitipom (binarno spremljenih) podataka. Sve podatčane vrijednosti u Pythonu predstavljene su objektima,pa se za Python 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) objekta

Identitet i tip objekta su nepromjenljive veličine i definiraju se stvaranjem, generiranjem, objekta. Svakiobjekt može imati jednu ili više vrijednosti, te jednu ili više metoda. Neki objekti dolaze se Pythoninterpreterom, zovemo ih ugrađeni objekti (engl. built-in objects), a druge stvara sâm korisnik prekoPython 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 znakova

Osim alfanumeričkih znakova za brojeve i stringove, Python 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 Python interpretera: sve napisano u linijeiza njega, udesno, interpreter neće obrađivati. Međaši služe i kod definicije složenih tipova, od kojih sunajčešće koriste:

[ 63, ’faks’, 8.6 ] # Listina, lista ili popis (engl. \emph{list})( 450, 320, ’600’ ) # n-terac (engl. \emph{tuple}){ ’a’:72, ’b’:1.4 } # rje\v{c}nik (engl. \emph{dictionary})

11

Page 12: Mario Essert, Domagoj Ševerdija, Ivan Vazler - programiranjeprogramiranje.yolasite.com/resources/glavni_py.pdf · Python - osnove - Odjel za matematiku Sveučilišta Josipa Jurja

12 Tipovi podataka

Tipovi 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 Python programskom jeziku

Kategorija tipapodataka Ime tipa podatka Opis

Prazno (None) NoneType ’null’ objektBrojevi IntType Cijeli broj

LongType Dugi cijeli broj

FloatTypeRealni broj s pom.zarezom

ComplexType Kompleksni brojNizovi StringType Niz znakova (string)

UnicodeType Unicode (string)ListType Listina, popis ili listaTupleType n-teracXRangeType Vraćeno iz xrange()BufferType Vraćeno iz buffer()

Preslikavanje DictType RječnikKlase, razredi ClassType Definicija klase

Instanca klase, objekt InstanceTypeStvaranje instanceklase

Datoteka FileTypeDatoteka - podaci namediju

Moduli ModuleType Modul (skup objekata)Objekti koji sepozivaju BuiltinFunctionType Ugrađene funkcije

BuiltinMethodType Ugrađene metodeClassType Objekt klaseFunctionType Korisnička funkcijaInstanceType Instanca klase, objekt

MethodTypeOgraničena (bound)metoda

UnboundMethodTypeNeograničena metodaklase

Nutarnji tipovi CodeType Byte-compilirani kôdFrameType Izvedbeni okvirTracebackType Složaj slijeda izuzetakaSliceType Tip kriške (odlomka)EllipsisType Prošireni odlomci ()

Python program pristupa vrijednostima objekata preko identiteta, adresnih referenci. Referenca jebroj koje se odnosi na neku specifičnu lokaciju u memoriji na kojoj je spremljena vrijednost objekta.Vrijednost objekta često se još zove atribut objekta. Atributi složenih tipova (npr. liste, stringa ilirječnika) često se zovu članovi (engl. items).

Referenca objekta sprema se u memorijsku lokaciju koja se zove varijabla. Varijabla može pokazivatina spremljeni literal, na isti način kao i na objekt koji ima više vrijendosti i/ili više metoda. Jedna iliviše Python programskih naredbi može se spremiti u funkciju. Razlikuju se ugrađene (engl. built-in)i korisničke funkcije. Korisničke funkcije definira korisnik, a ugrađene dolaze s Python interpreterom.Dakako, funkcija je objekt. Funkcija u objektu zove se metoda, a dohvaća se sa obj.fun(), gdje je obj

Page 13: Mario Essert, Domagoj Ševerdija, Ivan Vazler - programiranjeprogramiranje.yolasite.com/resources/glavni_py.pdf · Python - osnove - Odjel za matematiku Sveučilišta Josipa Jurja

Tipovi podataka 13

ime objekta, a fun()je ime funkcije. Unutar okruglih zagrada mogu doći i argumenti, odnosno parametrifunkcije. Funkcija može imati ulazne argumente i vraćati izlazne vrijednosti.

Na primjer, provjera tipa nekog objekta ostvaruje se pozivom ugrađene funkcije type():

>>> type("Zanimljivi Python svijet!") # string literal<type ’str’>>>> type(512) # numericki literal<type ’int’>>>> k=2.178 # varijabla k>>> type(k)<type ’float’>>>> type ({ ’a’:72, ’b’:1.4 })<type ’dict’>>>> z=2+3j # varijabla z>>> type(z)<type ’complex’>

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 funkcija

Pojedinačni podatak ili funkcija iz modula dohvaća se naredbom ’from ... import ... ’ :

from math import sin, cos # ucitavaju se samo sin i cos funkcije

Dohvać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.745705212177

Dohvać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 cetiri podatka>>> print x[3] # dohva\’{c}anje treceg podatka16

Vrijednost reference može se doznati pozivom funkcije id(). Pridruživanjem objekata referenca seponavlja, tj. objekti se ne dupliciraju.

>>> a=123>>> id(a)3695888>>> b=a # pridruzba 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>>> print ’id(a)=’,id(a),’ id(b)=’,id(b) # ne pokazuju isto!id(a)= 3695876 id(b)= 3695888

Page 14: Mario Essert, Domagoj Ševerdija, Ivan Vazler - programiranjeprogramiranje.yolasite.com/resources/glavni_py.pdf · Python - osnove - Odjel za matematiku Sveučilišta Josipa Jurja

14 Tipovi podataka

Izraz (engl.expression) je kombinacija vrijednosti (literala), varijabli i operatora. Vrijednost izraču-natog izraza ispisuje se na zaslon računala korištenjem naredbe print:

>>> print ’gruba aproksimacija pi = ’, 22./7gruba aproksimacija pi = 3.14285714286

Programske naredbe Pythona temelje se na pridruživanju (objekata referencama), upravljanju ti-jekom programa (if, else,...), programskim petljama (for, while, ...) i pozivima funkcija i klasa.Funkcije obuhvaćaju jednu ili više naredbi. Postoji velik broj ugrađenih (built-in) funkcija, a ostalestvara korisnik. Funkcije, zajedno s podacima, grupiraju se u klase. Funkcije definirane unutar klasa,zovu se metode.

Identifikator je ime objekta, tj. ime varijable, funkcije, klase i sl. Identifikatori ne smiju koristitineku od 30 ključnih riječi Python-a (tablica 2.2), jer su one pridružene osnovnim Python naredbama.

Tablica 2.2: Python ključne riječi

and del for is raiseassert elif from lambda returnbreak else global not tryclass except if or while

continue exec import pass withdef finally in print yield

2.1 Brojevi

Ugrađeni brojevni objekti u Pythonu podržavaju cijele brojeve (obične i dugačke), brojeve s pomičnimzarezom (realne brojeve) i kompleksne brojeve. Objekti brojeva u Pythonu su nepromjenljivi (immu-table) 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 a1234

Literali cijelih brojeva mogu biti decimalni, oktetni, ili heksadecimalni. Decimalni literal je pred-stavljen nizom 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 brojevi

Bilo 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:

1L, 23L, 99999333493L #Dugacki decimalni cijeli brojevi01L, 027L, 01351033136165L #Dugacki oktetni cijeli brojevi0x1L, 0x17L, 0x17486CBC75L #Dugacki heksadec. cijeli brojevi

Page 15: Mario Essert, Domagoj Ševerdija, Ivan Vazler - programiranjeprogramiranje.yolasite.com/resources/glavni_py.pdf · Python - osnove - Odjel za matematiku Sveučilišta Josipa Jurja

2.2. Nizovi 15

Razlika 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...93053328527589376L

Realni 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

Pythonova 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 imaginarni

dio. 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.0e0j

Znak 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 Python je izabraobaš znak j).

Treba primijetiti da brojevni literali ne uključuju predznak: ako postoji + ili - ispred broja, ondasu to posebni operatori.

2.2 Nizovi

Niz je spremnik (engl. container) članova (engl. items) koji se indeksiraju ili dohvaćaju ne-negativnimcijelim brojevima. Python pruža tri ugrađene (engl. built-in) vrste nizova za stringove (obične iUnicode), n-terace, i liste. Knjižnički i ekstenzijski moduli pružaju druge vrste nizova, a korisniktakođer može sam napisati svoje. Nizovi se mogu obrađivati na više načina.

2.2.1 Stringovi - nizovi alfanumeričkih znakova

Ugrađeni objekt string je poredan skup znakova koji se koristi za skladištenje i predstavljanje podatakana tekstovnoj bazi. Nizovi znakova u Pythonu su nepromjenljivi (engl. immutable), što znači da senovom operaciijom na nizu znakova, uvijek proizvede novi niz, a ne modificira stari. Objekti stringaimaju ugrađeno više metoda.

Literalni niz znakova može biti pod navodnicima jednostrukim, dvostrukim ili trostrukim navodni-cima. String u navodnicima je niz od nula ili više znakova unutar identičnih znakova navodnika. Naprimjer:

’Ovo je string literal’"Ovo je novi string literal"

Dvije različite vrste navodnika imaju identičnu funkciju. Mogu se koristiti tako da apostrofiramo stringunutar stringa, što je često jednostavnije nego apostrofirati string upotrebom posebnog znaka (źa jed-nostruki ili z̈a dvostruki navodnik):

’ jel\’ me netko trazio?’ # eksplicitni navodnik u stringu" jel’ me netko trazio?" # Na ovaj nacin je citljivije

Page 16: Mario Essert, Domagoj Ševerdija, Ivan Vazler - programiranjeprogramiranje.yolasite.com/resources/glavni_py.pdf · Python - osnove - Odjel za matematiku Sveučilišta Josipa Jurja

16 Tipovi podataka

Ako 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 kraju

U 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’ znakovi

Niz 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\b Brisanje ulijevo, backspace 0x08\f Nova stranica, form feed 0x0c\n Nova linija, newline 0x0a

\r Skok u novi red, carriagereturn 0x0d

\t Tabulator, tab 0x09\v Vertikalni tabulator 0x0b

\0oooOktalna vrijednosti ooo (\0000do \0377) kako je zadano

\xhhHeksadecimalna vrijednost hh(\x00 do \xff) kako je zadano

\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ün

Više string literala bilo koje vrste napisanih u slijedu, compiler će povezati u jedan string objekt.

>>> print ’koliko’ ’je’ ’tu’ ’stringov’ u’\xe4’ ’?’kolikojetustringovä?

Page 17: Mario Essert, Domagoj Ševerdija, Ivan Vazler - programiranjeprogramiranje.yolasite.com/resources/glavni_py.pdf · Python - osnove - Odjel za matematiku Sveučilišta Josipa Jurja

2.2. Nizovi 17

2.2.2 N-terac

N-terac je nepromjenljivi niz članova. Članovi u n-tercu su bilo koji objekti, istih ili različitih tipova. N-terac se definira 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-terac

Za 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 Lista

Lista, listina ili popis je promjenljiv poredani niz članova objekata. Članovi u listi su bilo kakvi objektirazličitih tipova. Lista se definira 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:

[42, 3.14, ’zdravo’ ] # Lista s tri clana[123] # Lista s jednim clanom[’a’, [-45j, ’b’], 4.5] # ugnjezdena lista s tri clana[ ] # Prazna lista

Na 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 clanova>>> 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 ’list’>>>> type(a)<type ’str’>

Treba primjetiti kako se tvorba listi preko list() funkcije uvijek realizira nad pripadnim tipom objekta.

Page 18: Mario Essert, Domagoj Ševerdija, Ivan Vazler - programiranjeprogramiranje.yolasite.com/resources/glavni_py.pdf · Python - osnove - Odjel za matematiku Sveučilišta Josipa Jurja

18 Tipovi podataka

2.3 Temeljne operacije i metode s nizovima

Dohvać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().

Tablica 2.4: Operacije i metode nad svim nizovima

Član Opiss[i] Vraća element i u nizu ss[i:j] Vraća krišku - niz elemenata od i-tog do j-tog indeksalen(s) Vraća broj elemenata u smin(s) Vraća minimalni elemenat iz smax(s) Vraća maksimalni elemenat iz s

Promjenljivi 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

>>> 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.

Tablica 2.5: Pridružba i brisanje

Član Opiss[i] = v Pridružba članu na i-tom mjestus[i:j] = t Pridružba skupini članovadel s[i] Brisanje članadel s[i:j] Brisanje skupine članova

Evo kratkog primjera:

Page 19: Mario Essert, Domagoj Ševerdija, Ivan Vazler - programiranjeprogramiranje.yolasite.com/resources/glavni_py.pdf · Python - osnove - Odjel za matematiku Sveučilišta Josipa Jurja

2.3. Temeljne operacije i metode s nizovima 19

>>> lista=[’tko zna’,’bilje’,’siroko mu’,’polje’]>>> lista[1]=’bolje’>>> lista[’tko zna’, ’bolje’, ’siroko 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-ova

Buduć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 *’

Tablica 2.6: String metode

Page 20: Mario Essert, Domagoj Ševerdija, Ivan Vazler - programiranjeprogramiranje.yolasite.com/resources/glavni_py.pdf · Python - osnove - Odjel za matematiku Sveučilišta Josipa Jurja

20 Tipovi podataka

Metoda Opiss.capitalize() Pretvara svako slovo od s u veliko slovo.s.center(width) Centrira string u polju duljine width.s.count(sub[,start[,end]])

Broji pojavljivanja podstringa sub u stringu s.

s.encode([encoding[,errors]])

Vraća kodiranu inačicu stringa.

s.endswith(suffix[,start[,end ]])

Provjerava kraj stringa za suffix.

s.expandtabs([tabsize]) Proširuje tabulatore praznim mjestima.

s.find(sub[,start[,end]])Pronalazi prvo pojavljivanje zadanogpodstringa sub.

s.index(sub[,start[,end]])Pronalazi prvo pojavljivanje zadanogpodstringa sub uz podizanje izuzetka, ako ganema.

s.isalnum() Provjerava jesu li svi znakovi alfanumerički.s.isalpha() Provjerava jesu li svi znakovi alfabetski.s.isdigit() Provjerava jesu li svi znakovi znamenke.

s.islower()Provjerava jesu li svi znakovi pisani malimslovima.

s.isspace() Provjerava jesu li svi znakovi praznine.

s.istitle()Provjerava jeli string pisan kao naslov (prvoslovo svake riječi napisano velikim slovom).

s.isupper()Provjerava jesu li svi znakovi pisani velikimslovima.

s.join(t )Povezuje stringove u listi t koristeći s kaomeđaš.

s.ljust(width ) Lijevo poravnanje s u stringu duljine width.s.lower() Vraća s pretvoren u string s malim slovima.s.lstrip() Odstranjuje prazna mjesta ispred stringa.s.replace(old , new[,maxreplace ])

Zamjenjuje podstring old sa new.

s.rfind(sub[,start[,end]]) Nalazi zadnji pojavak podstringa sub.

s.rindex(sub[,start[,end]])Nalazi zadnji pojavak podstringa sub ili javljaizuzetak

s.rjust(width) Desno poravnanje s u stringu duljine width.s.rstrip() Odstranjuje prazna mjesta iza stringa.

s.split([sep[,maxsplit]])Dijeli string koristeći sep kao međaš.maxsplit je naveći broj dijeljenja koji će seizvršiti.

s.splitlines([keepends])Dijeli string u listu linija. Ako je keependsjednak 1, čuvaju se kontrolni znakovi novihredaka.

s.startswith(prefix[,start [,end ]])

Provjerava da li string započinje s prefix-om

s.strip()Odstranjuje prazna mjesta i ispred i izastringa.

s.swapcase()Vraća velika slova za string malih slova iobratno.

s.title() Vraća verziju stringa kao naslova.s.translate(table[,deletechars ])

Mijenja string koristeći transformacijskutablicu znakova.

s.upper() Vraća string pretvoren u velika slova.

Page 21: Mario Essert, Domagoj Ševerdija, Ivan Vazler - programiranjeprogramiranje.yolasite.com/resources/glavni_py.pdf · Python - osnove - Odjel za matematiku Sveučilišta Josipa Jurja

2.3. Temeljne operacije i metode s nizovima 21

Primjer 1 String je nepromjenljivi objekt, pa se njegova promjena moguća tek stvaranjem novog stringa.treba primjetiti kako se aritmetički znak ’+’ koristi za povezivanje stringova, dok ’1:’ označuje sve zna-kove nakon prvog.

>>> s1 = "Moj␣ san">>> s2 = ’Tv ’ + s1 [ 1 : ]>>> pr in t s2 Tvoj san

>>>

Primjer 2 Modul ’string’ sadrži mnogo funkcija. Funkcija ’find’ pronalazi podstring u zadanom stringu.Vraća poziciju nađenog podstringa

>>> import s t r i n g>>> r iba = "zubatac ">>> index = s t r i n g . f i nd ( r iba , " t " )>>> pr in t index>>>>>> s t r i n g . f i nd ( "abrakadabra" , " ra " )>>> s t r i n g . f i nd ( "abrakadabra" , " ra " ,4 )>>>

4

29

2.3.2 Ugrađene metode listi

Na 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 liste

Metoda Opisli.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 .

li.pop([i])Vraća element i i briše ga iz liste. Ako se iizostavi, onda se vraća zadnji element.

li.remove(x) Traži x i briše ga iz liste li.li.reverse()) Reverzira (obrće) članove liste li na mjestu.

li.sort([cmpfunc ])Sortira (slaže) članove liste li na mjestu.cmpfunc() je funkcija za usporedbu.

Primjer 3 Matrica je lista listi.

>>> matrica = [ [ 1 , 2 , 3 ] , [ 2 , 3 , 1 ] ]>>> matrica [ 1 ]>>> matrica [ 0 ] [ 2 ]

[ 2 , 3 , 1 ]3

Page 22: Mario Essert, Domagoj Ševerdija, Ivan Vazler - programiranjeprogramiranje.yolasite.com/resources/glavni_py.pdf · Python - osnove - Odjel za matematiku Sveučilišta Josipa Jurja

22 Tipovi podataka

2.4 Rječnik

Preslikavanje (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.

Python 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 rjecnik

Tvorbu 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čnika

Na sličan način, s pomoću tablice 2.8 mogu se u primjerima provjeriti ugrađene metode koje olakšavajurad s rječnicima.

Tablica 2.8: Metode i operacije tipova preslikavanja (rječnika)

Page 23: Mario Essert, Domagoj Ševerdija, Ivan Vazler - programiranjeprogramiranje.yolasite.com/resources/glavni_py.pdf · Python - osnove - Odjel za matematiku Sveučilišta Josipa Jurja

2.5. Skup 23

Član/metoda Opisdi[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 .

di.setdefault(k[, v])Vraća di[k] ako nađe; vraća v i postavljadi[k]=v .

di.popitem()Vraća slučajne (key ,value) parove kaon-terce iz di.

2.5 Skup

Od Python 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.

Tablica 2.9: Glavne operacije skupova

Page 24: Mario Essert, Domagoj Ševerdija, Ivan Vazler - programiranjeprogramiranje.yolasite.com/resources/glavni_py.pdf · Python - osnove - Odjel za matematiku Sveučilišta Josipa Jurja

24 Tipovi podataka

Operacija Rezultat

set/frozenset([iterabilno=None])

[koristi se za ugrađene tipove] tvorba običnihili zamrznutih skupova iz iterabilnog niza, npr.set([5,2,7]), set("zdravo")

Set/ImmutableSet([iterabilno=None])

[koristi se za set modul] tvorba običnih ilinepromjenljivih skupova iz iterabilnog niza,npr. Set([5,2,7])

len(s kardinalni broj skupa s

elem in s / not in sIstinito ako element elem pripada / ne pripadaskupu s

for elem ins: processelem...

Iterira na elementima skupa s

s1.issubset(s2) Istinito ako je svaki element u s1 u s2s1.issuperset(s2) Istinito ako je svaki element u s2 u s1s.add(elem) Dodaje element elem u skup s

s.remove(elem))Briše element elem u skupu s. PodižeKeyError iznimku ako se element ne pronađe

s.clear()Briše sve elemente iz skupa s (ne vrijedi zanepromjenljive skupove!)

s1.intersection(s2) ilis1&s2

Vraća novi skup s elementima zajedničkim us1 i s2

s1.union(s2) ili s1|s2 Vraća novi skup s elementima koji su i u s1 iu s2.

s1.symmetric_difference(s2)ili sl∧s2

Vraća novi skup s elementima koji su ili us1,ili u s2, ali ne na oba mjesta

s.copy() Vraća kopiju skupa s

s.update(iterabilni nizDodaje sve vrijednosti iz iterabilnog niza uskup s

Page 25: Mario Essert, Domagoj Ševerdija, Ivan Vazler - programiranjeprogramiranje.yolasite.com/resources/glavni_py.pdf · Python - osnove - Odjel za matematiku Sveučilišta Josipa Jurja

POGLAVLJE 3Izrazi, operatori i operacije

3.1 Varijable

Python 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 (čiju adresu pohranjuju). Budući da je adresa jedisntvena u smislubroja okteta, svaka referenca može povezivati objekte različitih tipova i mijenjati se prilikom izvršenjaprograma.

U Pythonu nema deklaracija. Postojanje varijable ovisi o naredbi koja povezuje (eng. binding)varijablu i podatak, ili, drugim riječima, koja postavlja ime koje da se odnosi na neki objekt. Mogućeje odvezati (eng. unbinding) varijablu resetiranjem njenog imena, tako da više ne sadrži referencu.Naredba del odvezuje reference.

Povezivanje reference koja je već povezana poznato je kao re-povezivanje (eng. rebinding). Re-povezivanje ili 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. Automatskočišćenje objekata bez referenci zove se sakupljanje smeća (engl. garbage collecting).

Varijabla se može imenovati bilo kojim identifikatorom, osim onih 30 koji su rezervirani kao Pythonključne riječi. Pritom identifikator 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živanja

Naredbe 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 može stvoriti nove reference. Proširene pridružbe mogusamo re-povezati varijablu, narediti objekt da re-poveže jedan od svojih atributa ili članova, ili postavitizahtjev određenom objektu da sam sebe modificira. Kad se postavi zahtjev objektu, na objektu možeizvršiti zahtjev ili podignuti iznimku, kojom se javlja neka vrsta pogreške (tablica 3.1 sadrži neke osnovneiznimke). Iznimka je način na koji Python rješava pogreške bilo kojeg tipa.

25

Page 26: Mario Essert, Domagoj Ševerdija, Ivan Vazler - programiranjeprogramiranje.yolasite.com/resources/glavni_py.pdf · Python - osnove - Odjel za matematiku Sveučilišta Josipa Jurja

26 Izrazi, operatori i operacije

Tablica 3.1: Neke osnovne ugrađene iznimke

Iznimka OpisArithmeticError Baza za aritmetičke iznimkeFloatingPointError Pogreška floating-point operacijeOverflowError Aritmetički prelivZeroDivisionError Dijeljenje ili modulo operacija s 0IndentationError Pogreška uvlakeSyntaxError Pogreška sintakseRuntimeError Pogreške u izvođenju programa

3.2.1 Obična pridružba

Naredba obične pridružbe u svom najjednostavnijem obliku ima sintaksu:

cilj = izraz

Cilj ili odredište (engl.target) je poznat kao lijeve strana pridružbe, a izraz (engl. expression) jedesna strana. Kad se naredba pridružbe izvršava, Python izračunava izraz desne strane, te povezujevrijednost izraza s ciljem na lijevoj strani. Ovo povezivanje ne ovisi o tipu vrijednosti. Budući daPython ne pravi velike razlike između pozivnih i nepozivnih objekata, za razliku od nekih drugih jezika,cilju su moguće pridružbe funkcija, metoda, tipova i drugih pozivnika. Cilj, na lijevoj strani, može bitivarijabli/identifikator, atribut, indeksirani član niza ili kriška (engl. slicing) .

Detalji povezivanja ipak ovise o tipu cilja:

• Identifikator je ime varijable: pridružba na identifikator povezuje varijablu s tim imenom.

• Referenca atributa ima sintaksu obj.name. Pritom je obj identifikator koji označava objekt, aname atributivno ime objekta. Pridružba na referencu atributa traži da objekt obj poveže svojatribut zvan name.

• 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 pita spremnik obj da povežesvoj član koji je izabran pomoću vrijednosti expr, također poznate i kao indeksni ključ člana.

• 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 sa 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, proizvoljno

ograđenih lučnim ili kutnim zagradama. Na primjer:

a, b, c = x

Ovo 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:

a, b = b, a

Ovaj izraz repovezuje a da se pridruži na ono što je u b bilo povezano, i obratno.

Page 27: Mario Essert, Domagoj Ševerdija, Ivan Vazler - programiranjeprogramiranje.yolasite.com/resources/glavni_py.pdf · Python - osnove - Odjel za matematiku Sveučilišta Josipa Jurja

3.2. Naredbe pridruživanja 27

3.2.2 Proširena pridružba

Proš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: + =,− =, ∗ =, / =, // =, % =, ∗∗ =, | =, >>=, <<=, & = i ∧ =.Proširena pridružba (tablica 3.2) može imati samo jedan cilj na lijevoj strani, tj. proširena pridružbane podržava više ciljeva.

Tablica 3.2: Proširena pridružba

Operacija Ekvivalentno sax+ = y x = x + y

x− = y x = x− y

x∗ = y x = x ∗ y

x/ = y x = x/y

x ∗ ∗ = y x = x ∗ ∗yx% = y x = x%y

x& = y x = x&y

x| = y x = x|yx∧ = y x = x ∧ y

x >>= y x = x >> y

x <<= y x = x << y

3.2.3 Naredba del

Unatoč svome imenu, naredba del ne briše objekte, nego odvezuje reference. Brisanje objekta je impli-citno moguće kao posljedica, sa sakupljanjem smeća, ako ne postoji više nijedna referenca na objekt.U Pythonu (slično kao u Java programskom jeziku) postoji ugrađeni sakupljač smeća (engl. garbagecollector) koji oslobađa memorijski prostor zauzet objektima koji se ne referenciraju. To se događa nasistemskoj razini, ciklički, tijekom izvođenja programa. Naredba del se sastoji od ključne riječi del,nakon koje slijedi jedna ili više ciljnih referenci razdvojenih zarezima (,). Svaki cilj može biti varijabla,referenca atributa, indeksiranje ili kriška, baš kao za naredbe pridružbe i mora biti povezan u vrijemeizvršavanja naredbe del. Ako je cilj del-a identifikator, naredba del specificira odvezivanje varijable.Dok god je identifikator povezan s objektom, odvezivanje je dopušteno: kada se zahtijeva, onda se iizvrši. U svim drugim slučajevima, naredba del specificira zahtjev objektu da odveže neke (ili sve) svojeatribute ili članove. Objekt može odbiti odvezati neke (ili sve) atribute ili članove, podižući iznimkuako se pokušava nedopušteno odvezivanje. Odvezivanje (ili brisanje) kriške obično ima jednak učinakkao zadavanje praznog niza toj kriški.

3.2.4 Bool-ove vrijednosti

Poslije Pythona ver. 2.3 postoji eksplicitna verzija Bool -ove (engl. boolean) vrijednosti za Python. Bool -ove vrijednosti True i False postaju tip (podklasa od int). U ranijim Python verzijama označavalesu se s ’1 ’ i ’0’. Svaka podatčana vrijednost u Pythonu ima vrijednost istine: istinito ili lažno, ovisi otomu je li ta vrijednost različita ili jednaka nuli. U stringu nuli odgovara prazan string "", kod n-tercaprazan n-terac (), kod rječnika prazan rječnik i sl. Python također ima nekoliko ugrađenih funkcijakoje vraćaju Bool -ove vrijednosti kao rezultate.

Promjene su bile praktične, jer je lakše govoriti o funkcijama i izrazima koje "vraćanje True iliFalse" nego izraza različitih ili jednakih nuli. Ove promjene također omogućuju pisanje čišćeg kôda,kada se želi vratiti vrijednost istine (npr. return True umjesto return 1).

Page 28: Mario Essert, Domagoj Ševerdija, Ivan Vazler - programiranjeprogramiranje.yolasite.com/resources/glavni_py.pdf · Python - osnove - Odjel za matematiku Sveučilišta Josipa Jurja

28 Izrazi, operatori i operacije

3.3 Operatori i operacije

Izraz je fraza programskog kôda koju Python interpreter može izvršiti kako bi proizveo neku vrijednost.Najjednostavniji izrazi su literali i identifikatori (varijable). Složeniji izrazi grade se tako da se jednos-tavni izrazi povezuju operatorima. Tablica 3.3 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 ’<’ nije asocijativan, jer bi x < y se promjenom mjesta identifikatora (y < x)dobiosasvim suprotan rezultat.

Tablica 3.3: Prioritet operatora u izrazima

Operator Opis A’izraz,...’ String pretvorba NAkey:izraz,... Stvaranje rječnika NA[izraz,...] Stvaranje liste NA

(izrazr,...) Stvaranje n-terca ilijednostavne zagrade NA

f(izraz,...) Poziv funkcije Lx[index1:index2] Kriška (slicing) Lx[index] Indeksiranje (indexing) Lx.attr Referenca atributa Lx**y Eksponent (x na y potenciju) Dx Bitwise NE (NOT) NA+x, -x Unarni plus ili minus NA

x*y, x/y, x//y, x%y Množenje, dijeljenje, dijeljenjena cijeli broj, ostatak L

x+y, x-y Zbajanje, oduzimanje Lx«y, x»y 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! = y, x == y

Usporedbe NA

x 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) L

lambda arg,...: izraz Anonimna jednostavnafunkcija NA

Operatori usporedbe mogu se nizati, čime se implicira logična I (and) funkcija. Na primjer:

a < b <= c < d

ima isto značenje kao i:

a < b and b <= c and c < d

Oblik niza je mnogo čitljiviji i provjerava svaki podizraz samo jednom.

Page 29: Mario Essert, Domagoj Ševerdija, Ivan Vazler - programiranjeprogramiranje.yolasite.com/resources/glavni_py.pdf · Python - osnove - Odjel za matematiku Sveučilišta Josipa Jurja

3.3. Operatori i operacije 29

3.3.1 Numeričke i aritmetičke operacije

Python pruža uobičajene numeričke operacije, kako se vidi u tablici 3.4. Svi su brojevi samočitajući(engl. readonly) objekti, pa bilo koja numerička operacija na brojevnom objektu, uvijek proizvodi novibrojevni 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 znak + koji pridružuje decimalni literal imaginarnom broju 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.4: Numeričke operacije

Operacija Opisx + y Zbrajanjex− y Oduzimanjex ∗ y Množenjex/y Dijeljenjex ∗ ∗y Potenciranje (x ∧ y)x%y Modulo funkcija (x mod y )−x Unarni minus+x Unarni plus

Ugrađ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.5). Ugrađenapow(a,b) funkcija vraća isti rezultat kao i a**b. Sa tri argumenta, pow(a,b,c) vraća isti rezultat kaoi (a**b) % c, ali brže.

Tablica 3.5: Ugrađene aritmetičke funkcije

Funkcija Opisabs(x) Apsolutna vrijednostdivmod(x,y) Vraća (int(x / y ), x % y )pow(x,y [,modulo]) Vraća (x ∗ ∗y)x%modulo

round(x,[n])Zaokružuje na najbliži višekratnik od 10−n

(samo za za realne brojeve)

3.3.2 Prisilna i eksplicitna pretvorba

Arithmetičke operacije i usporedbe mogu se primijeniti između bilo koja dva broja. Ako se tipovioperanda razlikuju, primjenjuje se prisila: Python prepravlja operande iz manje tipa u veći. Poredaniod najmanjeg do najvećeg brojevni tipovi su sljedećei: cijeli brojevi, dugački cijeli brojevi, 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).

Page 30: Mario Essert, Domagoj Ševerdija, Ivan Vazler - programiranjeprogramiranje.yolasite.com/resources/glavni_py.pdf · Python - osnove - Odjel za matematiku Sveučilišta Josipa Jurja

30 Izrazi, operatori i operacije

3.3.3 Usporedba

Svi 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, jer se kod njih javljaju ’runtime’ iznimke. Svi takvi operatori vraćaju Bool-ove vrijednosti(True ili False), kako je pokazano u tablici 3.6.

Tablica 3.6: Operatori usporedbe

Operator Opisx < y Manje negox > y Veće negox == y Jednakox != y Nije jednako (isto kao <>)x >= y Veće nego ili jednakox <= y Manje nego ili jednako

3.3.4 Operacije na bitovima cijelih brojeva

Cijeli brojevi i dugački cijeli brojevi se mogu promatrati kao nizovi bitova i koristiti u operacijamas bitovima prikazanima u Tablici 3.7. Operatori na bitovima imaju niži prioritet nego arithmetičkioperatori. Pozitivni cijeli brojevi su prošireni neograničenim nizom bitova 0 nalijevo. Negativni cijelibrojevi su predstavljeni dvojnim komplementom, te su tako prošireni neograničenim nizom bitova 1nalijevo.

Tablica 3.7: Operacije na bitovima cijelih brojeva

Operacija Opisx « y Lijevi pomak (shift)x » y Desni pomak (shift)x & y Bitwise I (and)x | y Bitwise ILI (or)x ∧ y Bitwise EX-ILI (xor - exclusive or)∼ x Bitwise negacija

Osim pomaka (ulijevo i udesno) na bitovima se mogu izvršavati i logičke funkcije (I, ILI, NOT iEX-ILI).

3.4 Operacije na nizovima

Python podržava nekoliko operacija koje se mogu primijeniti na slijedne tipove (nizove ili sekvence),koji uključuju nizove znakova (stringove), popise ili liste (list) i n-terce (tuple). Nizovi su spremnicis članovima koji su dostupni indeksiranjem ili kriškama. Nizovi istog tipa povezuju se operatorom +.Isto tako moguće je množiti bilo koji niz S s cijelim brojem n pomoću operatora *. Rezultat S*n ili n*Sje povezivanje n kopija od S. Ako je n nula ili manje od nule, razultat je prazan niz istog tipa kao S.

U nastavku se promatraju liste, ali ista zapažanja vrijede i za stringove i n-terce. Jedina razlika ješto se, za razliku od listi, n-terci i stringovi ne mogu mijenjati.

x in S operator provjerava je li objekt x jednak bilo kojem članu u nizu S. Ako jest, vraća True, aFalse ako nije. Slično tomu, x not in S operator je isto kao not(x in S).

N-ti član niza S označuje se ili dohvaća indeksiranjem S[n]. Indeksiranje u Pythonu počinje od nule(prvi član u S je S[0]). Ako S ima L članova, indeks n smije biti 0,1,.., sve do L-1 uključno, ali nei više. Indeks n može također biti -1, -2,..., sve do -L (isključno), ali ne i manji. Negativni n

Page 31: Mario Essert, Domagoj Ševerdija, Ivan Vazler - programiranjeprogramiranje.yolasite.com/resources/glavni_py.pdf · Python - osnove - Odjel za matematiku Sveučilišta Josipa Jurja

3.4. Operacije na nizovima 31

označava iste članove u S kao što čini L+n. Drugim riječima, S [-1] je posljednji element od S, S[-2]je pretposljednje itd... Na primjer:

x = [1,2,3,4]x[1] # 2x[-1] # 4

Korištenje indeksa većeg ili jednakog L ili manjeg od -L podiže (izaziva) iznimku. Pridružba članuniza s nepostojećim indeksom ima isti učinak.

3.4.1 Kriška (eng. slicing) niza

Podniz 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 ga. Treba primjetiti kako u Pythonusvi dosezi uključuju donju i isključuju gornju granicu. Kriška može biti prazan podniz ako je j manjeod i ili ako je i veće ili jednako L, duljini niza S. Ako je j jednako nuli, i se može izostaviti, a ako seide do konca niza (L) onda se i j smije izostaviti. Cijeli niz S može se dakle indeksirati sa S[:]. Bilokoji ili oba indeksa smiju biti manji od nule. Negativni indeks označuje mjesto u nizu s obzirom na krajniza. Evo nekih primjera:

x = [1, 2, 3, 4]x[1:3] # [2, 3] - ne zaboraviti da prvi \v{c}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, 2, 3]

Drugi način promjene objekata liste L je korištenjem kriške od L kao 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 L s lijeve strane.Drugim riječima, L[i:j] = [ ] ima isti učinak kao i del L[i:j].

• Koristeći praznu krišku liste L kao cilj s lijeve strane pridružbe ubacuju se članovi liste s desnestrane na primjerenu poziciju u L. Drugim riječima, L[i:i] = [’a’,’b’] ubacuje članove ’a’ i’b’ nakon člana i u listi L.

• Koristeći krišku koja pokriva cijeli objekt liste L[:], kao cilj s lijeve strane, potpuno se zamjenjujesadržaj liste L.

Č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]

Page 32: Mario Essert, Domagoj Ševerdija, Ivan Vazler - programiranjeprogramiranje.yolasite.com/resources/glavni_py.pdf · Python - osnove - Odjel za matematiku Sveučilišta Josipa Jurja

32 Izrazi, operatori i operacije

3.4.2 Stacionarne operacije na listi i rječniku

Za liste su definirane stacionarne (in-line) verzije operatora + i *, koji se koriste u proširenim naredbamapridružbe. Proširena naredba pridružbe L+=L1 ima učinak dodavanja člana iz liste L1 na kraj liste L,dok L*=n ima učinak dodavanja n broja kopija liste L na kraj L.

Metoda popitem() se može koristiti za destruktivnu iteraciju dnevnika, tj. iterativnim dohvaća-njem člana briše se njegov ključ i vrijednost u rječniku. Pritom i item() i popitem() vraćaju dnev-ničke članove kao parove ključ/vrijednost, ali korištenje funkcije popitem() upotrebljava manju količinumemorije. Uštede na korištenju memorije čine tu metodu korisnom za petlju po dugom rječniku.

U Pythonu 2.2 i kasnije, izravno iteriranje na rječniku postiže se iterkeys() ili iteritems() me-todama koji traže skromnu količinu memorije i ne uništavaju rječnik po kojemu se iteracija obavlja.

3.5 Naredba Print

Naredba 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:100

Odrediš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.

Page 33: Mario Essert, Domagoj Ševerdija, Ivan Vazler - programiranjeprogramiranje.yolasite.com/resources/glavni_py.pdf · Python - osnove - Odjel za matematiku Sveučilišta Josipa Jurja

POGLAVLJE 4Programsko upravljanje

Programsko upravljanje tokom izvođenja je redoslijed po kojem se programski kôd izvršava. Ovo uprav-ljanje u Python 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. Pythonova kombinirananaredba if, koja koristi proširenja elif ili else služi za takvo uvjetno izvršavanje naredbi. Sintaksaza naredbu if izgleda ovako:

if uvjet(i):naredba(e)

elif uvjet(i):naredba(e)

elif uvjet(i):naredba(e)

...else uvjet(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 izvode se naredbe iza ’else’, ako postoji.

Treba primjetiti kako, razliku od nekih jezika, Python nema naredbu switch, pa se moraju koristitiif, 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 (npr. naredba se odnosi na čitav blok naredbi),naredbe su postavljene na razdvojene logičke linije nakon što linija koja sadrži ključnu riječ odlomka(poznatu kao početna linija odlomka) je pomaknuta udesno od linije početka. Blok završava kadase pozicioniranje vrati na ono od početka odlomka (ili još dalje lijevo od toga). Kada postoji jedna

33

Page 34: Mario Essert, Domagoj Ševerdija, Ivan Vazler - programiranjeprogramiranje.yolasite.com/resources/glavni_py.pdf · Python - osnove - Odjel za matematiku Sveučilišta Josipa Jurja

34 Programsko upravljanje

jednostavna naredba, kao u gornjem primjeru, onda se ona piše na istoj logičkoj liniji neposredno izadvotočja (’:’) kojim se završava jedan ili više uvjetnih ispitivanja. Dakako, moguće ju je napisati ina idućoj logičkoj liniji, ali se onda mora koristiti uvlaka. Mnogi koji rade u Pythonu smatraju stilodvojenih 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"

Kao uvjet u if ili elif odlomku može se koristiti bilo koji Python-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 ’najpython-skiji’ oblik. Nije potrebno 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 vrijednost kao

Bool-ov rezultat) i izjave da se izraz "izračunava (evaluira) kao istinit" (što znači da izraz vraća bilokakav rezultat koji je istinit u Bool-ovom kontekstu). Kad se testira izraz, brine se o ovom drugomuvjetu, a ne prvom. Ako se izraz za if odlomak izračuna kao istinit, naredbe koje slijede if odlomakse izvršavaju i cijela naredba if završava. Inače se izvršavaju izrazi za iduće elif odlomke, ako suuvjeti ispunjeni. Za prvu elseif klauzulu za koju je uvjet istinit, izvršavaju se sve narede koje jeslijede i čitava naredba if time završava. U protivnom, ako niti jedan odlomak nije bio obrađen, jeruvjeti nisu bili zadovoljeni, onda se izvršavaju naredbe odlomka else, ako postoji.

4.2 Naredba while

Naredba while u Pythonu podržava ponavljajuće izvršavanje naredbe ili bloka naredbi koji je upravljanuvjetnim izrazom. 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 += 1

print "Aproksimacija log2 je", count

Page 35: Mario Essert, Domagoj Ševerdija, Ivan Vazler - programiranjeprogramiranje.yolasite.com/resources/glavni_py.pdf · Python - osnove - Odjel za matematiku Sveučilišta Josipa Jurja

4.3. Naredba for 35

Prvo se evaluira izraz poznat kao uvjet petlje (eng. loop condition). Ako je uvjet lažan (false),naredba while završava. Ako je uvjet petlje zadovoljen, naredba ili naredbe od kojih se sastoji tijelapetlje se izvršavaju. Kada tijelo petlje završi s izvršavanjem, uvjet se ponovno evaluira, izračunava, dase vidi treba li se izvršiti nova iteracija. Ovaj se proces nastavlja sve dok uvjet petlje ne postane lažan,nakon čega while naredba završava. Tijelo petlje treba sadržavati kôd koji će u nekom trenutku učinitipetljin uvjet lažnim, ili petlja nikada neće završiti, osim ako se ne podigne iznimka ili tijelo petlje neizvrši naredbu break. Petlja koja je napisana u tijelu funkcije također završava ako se naredba returnizvrši unutar tijela petlje, jer u tom slučaju cijela funkcija završava.

4.3 Naredba for

Naredba for u Pythonu ostvaruje iterativno izvršavanje naredbi ili bloka naredbi, a upravlja se prekoiteracijskog 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 vrijed-nost pojedinog č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 Pythonov izraz koji se može iskoristiti kao argument ugrađenojfunkciji iter, koja vraća iteratorski objekt. Cilj pridružbe iteracijske varijable je obično identifikatorkoji imenuje varijablu petlje, a naredba for slijedno repovezuje 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 identifikatora 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 brojuidentifikatora 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]

Page 36: Mario Essert, Domagoj Ševerdija, Ivan Vazler - programiranjeprogramiranje.yolasite.com/resources/glavni_py.pdf · Python - osnove - Odjel za matematiku Sveučilišta Josipa Jurja

36 Programsko upravljanje

Metoda items() vraća popis parova ključ/vrijednost, pa stoga for petlja koristi dva identifikatorau 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 reovezuje 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 \v{c}lan je: ", x

4.4 Iteratori

Metode 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 Pythonu 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 dnevnikuD je isto kao iteriranje na D.iterkeys().

Tablica 4.1: Metode rječničkog objekta

Metoda Opis

D.iteritems( )Vraća iterator za sve članove (key/valueparove) u D

D.iterkeys( ) Vraća iterator za sve ključeve u DD.itervalues( ) Vraća iterator za sve vrijednosti u D

Iterator 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. Također se može dopustiti instancama klase da budu iteratori, definirajući u klasi takvumetodu next. Većina je iteratora izgrađena eksplicitnim ili implicitnim pozivima ugrađene funkcijeiter. Pozivanje generatora također vraća iterator. Naredba for implicitno poziva iter da bi dobilaiterator. 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)

Page 37: Mario Essert, Domagoj Ševerdija, Ivan Vazler - programiranjeprogramiranje.yolasite.com/resources/glavni_py.pdf · Python - osnove - Odjel za matematiku Sveučilišta Josipa Jurja

4.5. Funkcije range i xrange 37

Ako 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., definira _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 xrange

Ponavljanje petlje preko niza cijelih brojeva čest je slučaj, pa zato Python pruža ugrađene funkcijerange i xrange koje generiraju i vraćaju nizove cjelih brojeva.

Najjednostavniji način da se zavrti petlja od n puta u Pythonu 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 . range(x,y,step) vraća popis cijelihbrojeva od x (uključeno) do y (isključeno), tako da je razlika između svaka dva susjedna člana u popisustep. Ako je korak (eng. step) manji od 0, range odbrojava od x do y. Funkcija range vraća prazanpopis 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 je manjiod 0. Ako je korak jednak 0, onda range podiže iznimku. Dok range vraća standardni objekt listekoja 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 od range-aza ovu specifičnu namjenu. Stavljajući na stranu potrošnju memorije, range se može koristiti u istesvrhe 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, ako predstavlja n-terac. lc-odlomci je niz od nula ili više odlomaka, od kojih jesvaki sličan obliku:

for cilj in iter-clanoviif izraz

Izraz unutar svake if klauzule ima istu sintaksu kao izraz običnoj if naredbi.Sažeta lista je ekvivalentna petlji for koja gradi istu listu ponavljajućim pozivima append metode

rezultantne liste. Na primjer:

result1 = [x+1 for x in neki_niz]

jednak je kao sljedeća for petlja:

Page 38: Mario Essert, Domagoj Ševerdija, Ivan Vazler - programiranjeprogramiranje.yolasite.com/resources/glavni_py.pdf · Python - osnove - Odjel za matematiku Sveučilišta Josipa Jurja

38 Programsko upravljanje

result2 = [ ]for x in neki_niz

result2.append (x+1)

Sažeta liste koji koristi if odlomak izgleda ovako:

result3 = [x+1 for x in neki_niz if x<100]

a to je identično for petlji koja sadrži naredbu if:result4 = [ ] for x in prva-lista: for y in druga lista: result6.append (x+y)Kao što ovi primjeri pokazuju, redoslijed naredbi for i if u sažetoj listi jednak je kao u ekvivalentnoj

petlji, ali u sažetoj listi gnježdenje operacija ostaje implicitno.

4.7 Naredba break

Naredba break se dopušta jedino unutar tijela petlje. Kada se break izvrši, petlja završava. Ako jepetlja smještena unutar drugih petlja, break završava jedino petlju koja je smještena najdalje unutra.U praktičnom korištenju, break naredba je obično unutar nekog odlomka u naredbi unutar tijela petlje,tako da se izvršava uvjetno. Jedno uobičajeno korištenje naredbe break je u implementaciji petlje kojaodlučuje hoće li se izvršavati samo u sredini svake iteracije:

while True: # ova petlja ne bi nikad prirodno zavr\v{s}ilax = get_next( )y = preprocesses (x)if not keep_looping (x, y): breakprocess (x, y)

Page 39: Mario Essert, Domagoj Ševerdija, Ivan Vazler - programiranjeprogramiranje.yolasite.com/resources/glavni_py.pdf · Python - osnove - Odjel za matematiku Sveučilišta Josipa Jurja

POGLAVLJE 5Iznimke

Tri glavne vrste pogrešaka mogu nastati unutar programa: logičke pogreške, sintaktičke pogreške, te po-greške u radu tijekom izvođenja programa (eng. run-time errors). Logička pogreška, poput neispravnogalgoritma, uzrokuje netočne rezultate, ali ne spriječava izvođenje programa. Ovakve se pogreške teškomogu uočiti. Sintaktička pogreška krši jedno od Pythonovih gramatičkih pravila i spriječava izvođenjeprograma. Ove je pogreške lako popraviti. Pogreška u radu je pogreška kod izvršenja koja se događadok je program u nekoj operaciji. Neki česti uzroci 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, nepravilno ispisana imena atributa, neinicijalizirane varijable, te problemi vezani uz operacijskisustav. Iako to ne pomaže u slučaju logičkih pogrešaka, Python podiže iznimku (engl. exceptions)priotkrivanju sintaktičkih pogrešaka ili pogrešaka tijekom izvođenja programa. Interpreter zaustavlja pro-gram te ispisuje dijagnostičku poruku o pogrešci, zvanu "traceback", koja ukazuje na vrstu iznimke tepokazuje približno mjesto pogreške. Sintaksne pogreške su najčešće pogreške u pisanju programa,a nanjih upozorava Python prilikom izvođenja programa na način da na mjesto na kojem je greška pokazuje„strelicom“.

>>> while True print Pozdrav svima’File "<stdin>", line 1, in ?while True print ’Pozdrav svima’

^SyntaxError: invalid syntax

Kada je program sintaksno dobro napisan, postoji mogućnost da se druge pogreške jave prilikom izvo-đenja programa. Iznimka je način na koji Python dohvaća i pogreške tog tipa.

5.1 Vrste iznimki

Python organizira iznimke po hijerarhijskom stablu. Tablica 5.1 ispisuje i opisuje sve ugrađene iznimke.Sve vrste iznimki su Python klase. Na vrhu stabla iznimki je Exception, iz kojega su izvedene sve drugeugrađene iznimke. Exception je roditelj ili temelj dvaju nasljednika: SystemExit i StandardError.Funkcija sys.exit() generira iznimku SystemExit koja se može dohvatiti kod eksplicitnog zatvaranjaprograma. (SystemExit je iznimka ali ne i pogreška). StandardError je roditelj svih drugih iznimki.Ovakav hijerarhijski ustroj omogućuje otkrivanje i obradu skupnih, a ne samo individualnih iznimki. Naprimjer, ako postoji skupina iznimki koje obrađuju matematičke izračune, onda se može prvo dohvatitisamo ArithmeticError iznimka, a ne i sva njezina djeca (FloatingPointError, OverflowError iZeroDivisionError) pojedinačno, uz uvjet da se želi na isti način raditi sa svim iznimkama.

39

Page 40: Mario Essert, Domagoj Ševerdija, Ivan Vazler - programiranjeprogramiranje.yolasite.com/resources/glavni_py.pdf · Python - osnove - Odjel za matematiku Sveučilišta Josipa Jurja

40 Iznimke

Tablica 5.1: Ugrađene iznimke

Page 41: Mario Essert, Domagoj Ševerdija, Ivan Vazler - programiranjeprogramiranje.yolasite.com/resources/glavni_py.pdf · Python - osnove - Odjel za matematiku Sveučilišta Josipa Jurja

5.1. Vrste iznimki 41

Iznimka OpisException Korijen svih iznimki

SystemExit

Podiže se sa sys.exit() funkcijom. Ako se neobrađuje ova iznimka, onda Python interpreterzavršava program bez ispisa putanje završetka(engl. traceback). Ako se pozove sys.exit(),Python prevodi poziv u iznimku i izvodipotporu iznimci (eng. exception handler) kojise nalazi u finally odlomku od try naredbe.

StandardErrorOsnova svih ugrađenih iznimki osimSystemExit.

ArithmeticErrorRoditelj za iznimke koje Python podiže zarazličite aritmetičke pogreške.

FloatingPointErrorPodiže se za pogreške u operacijama spomičnom decimalnom točkom.

OverflowError

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 Python podiže MemoryError.

ZeroDivisionErrorPodiže se kad je drugi argument običnog ilimodularnog dijeljenja jednak nuli.

AssertionError Podiže se kad je pogreška u assert naredbi.

AttributeError

Podiže se kad je atributna referenca ilipridružba pogrešna. Ako objekt ne podržavaatributnu referencu ili pridružbu, onda Pythonpodiže TypeError iznimku.

EnvironmentErrorRoditelj za iznimke koje se pojavljuju izvanPython-a.

IOError

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).

OSError

Podiže se kad se pojavi pogreška povezana soperacijskim sustavom (izvan Python-a).Obično se ovoj iznimci pridružuje numeričkikôd pogreške, kao što je u os modulu iznimkaos.error.

WindowsErrorPodiže se kad se pojavi pogreška povezana sWindows-operacijskim sustavom.

EOFError

Podiže se kad input() ili raw_input() otkrijekonac datoteke (EOF) bez čitanja ikakvogpodatka. (treba primjetiti da file-objektread() i readline() metoda vraća prazanstring kad se otkrije EOF.)

ImportErrorPodiže se kad import griješi naći modul ili kadfrom-import griješi naći ime.

KeyboardInterrupt

Podiže se kad korisnik pritisne tipku prekida(interrupt key koja je obično Ctrl-C ili Del).Python redovito provjerava takve prekidetijekom izvođenja programa. Python takođepodiže ovu iznimku ako korisnik utipka prekidza vrijeme input() ili raw_input() naredbekoja čeka korisnikov unos.

LookupErrorRoditelj za iznimke koje Python podiže kadaje indeks rječničkog ključa ili indeks niza(stringa, liste ili n-terca) nevaljao.

IndexErrorPodiže se kad je indeks niza izvan dosega. Akoindeks nije cijeli broj, onda Python podižeTypeError iznimku.

KeyErrorPodiže se kad Python ne može naći rječničkiključ.

MemoryError

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.

NameErrorPodiže se kad Python ne može pronaći lokalnoili globalno ime. Argument iznimke je stringkoji označuje izgubljeno ime.

UnboundLocalErrorPodiže se kad se referencira lokalna varijabla ufunkciji ili metodi, ali ne postoji vrijednostpridružena toj varijabli.

RuntimeError

Podiže se kada Python otkrije generičkupogrešku koja ne pripada niti jednoj drugojkategoriji. Argument iznimke je string kojipokazuje što je neispravno. Python rijetkopodiže ovu sveobuhvatnu iznimku.

NotImplementedError

Podiž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.

SyntaxError

Podiže se kad Python 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.

TabError

Podiže se kad se koristi -tt opcija unaredbenoj liniji sa programom kojinekonzistentno koristi tabulatore i praznamjesta.

IndentationErrorPodiže se kad program prekida Pythonovapravila uvlačenja (engl. indentation) izvornogprogramskog teksta.

SystemError

Podiže se kad Python 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.

TypeError

Podiže se kad se ugrađena operacija ilifunkcija primjeni na objekt neprikladnog tipa.Argument iznimke je string koji pokazujedetalje o nepodudaranju tipova podataka.

ValueError

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.

UnicodeErrorPodiže se kad se pojavi pogreška u Unicodekodiranju ili dekodiranju.

Page 42: Mario Essert, Domagoj Ševerdija, Ivan Vazler - programiranjeprogramiranje.yolasite.com/resources/glavni_py.pdf · Python - osnove - Odjel za matematiku Sveučilišta Josipa Jurja

42 Iznimke

Evo nekih primjera čestih pogrešaka u programu koji podižu iznimke:

>>> 10 * (1/0)Traceback (most recent call last):File "<stdin>", line 1, in ?ZeroDivisionError: integer division or modulo by zero>>> 4 + spam*3Traceback (most recent call last):File "<stdin>", line 1, in ?NameError: name ’spam’ is not defined>>> ’2’ + 2Traceback (most recent call last):File "<stdin>", line 1, in ?TypeError: cannot concatenate ’str’ and ’int’ objects

Posljednja 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 Pythonugrađene 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 u obliku slijeda (Traceback).

5.2 Rad s iznimkama

U Pythonu je moguće pisati programe koji će raditi s određenim iznimkama, što se vidi na sljedećemprimjeru:

>>> 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 tokom 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 tome try može imati više od jedne except linije (uvjeta), koji određuju rad za neke drugeiznimke. Pri tome se najviše izvršava jedna od njih, i to samo za iznimke navedene u tom djelu exceptlinije, ali ne za druge. Except linija može imati više iznimki, definiranih unutar n-terca, npr:

... except (RuntimeError, TypeError, NameError):

... pass

Try...except izraz može sadržavati naredbu else koja se izvršava ako u try bloku nije izvršenanijedna iznimka.

for arg in sys.argv[1:]:try:

f = open(arg, ’r’)

Page 43: Mario Essert, Domagoj Ševerdija, Ivan Vazler - programiranjeprogramiranje.yolasite.com/resources/glavni_py.pdf · Python - osnove - Odjel za matematiku Sveučilišta Josipa Jurja

5.3. Obradba iznimki 43

except IOError:print ’cannot open’, arg

else:print arg, ’has’, len(f.readlines()), ’lines’

f.close()

Koristi se umjesto pisanja dodatnih linija u try-u jer se s njom izbjegava mogućnost uporabe iznimkekoja nije navedena u try bloku. Iznimke mogu imati pridružene vrijednosti, argumente, koji ovise o tipuiznimke. Except izraz može definirati varijablu nakon imena iznimke, koja je s instancom iznimke vezanas argumentima u instance.args. Umjesto korištenja instance.args dobro proslijediti jedinstveniargument iznimke i vezati ga atribut poruke.

>>> try:... raise Exception(’miki’, ’riki’)... except Exception, inst:... print type(inst) # instance 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<type ’instance’>(’miki’, ’riki’)(’miki’, ’riki’)x = mikiy = riki

Ako iznimka ima argument, on se ispisuje kao zadnji dio poruke o pogrešci(’detail’). Programi zarad s iznimkama mogu raditi i s funkcijama, koje su unutar njih pozvane.

>>> def nemoguce_dijeljenje():... x = 1/0...>>> try:... nemoguce_djeljenje()... except ZeroDivisionError, detail:... print ’Run time pogreska u dijeljenju:’, detail...

Run time pogreska u dijeljenju: integer division or modulo by zero

5.3 Obradba iznimki

Kada Python podigne iznimku, ona se mora dohvatiti (uhvatiti) i obraditi, inače će Python zatvršitiizvođenje programa. Obradba iznimki prisiljava na razmišljanje o tome što može poći krivo unutarprograma i što se može učiniti u vezi toga. Nije praktično (i skoro nemoguće) pokušavati imati na umusve što može poći krivo. Umjesto toga treba tražiti stanja koja (govoreći općenito) mogu se ponovnopostići koristeći korekcijski blok koda, koji se zove ’obrada iznimke’ (engl. exception handler). Onmože automatski popraviti stanje bez korisničke interakcije, upitati korisnika za dodatne ili prihvatljivepodatke 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). Pythonova naredba try detektirai obrađuje iznimke. Try je višeslojna naredba kao if ili while te slijedi pravila uvlake. Try takođermijenja uobičajeno upravljanje tijeka programa. (Upravljanje tijekom programa je izvršni niz naredbikoje čine program).

Page 44: Mario Essert, Domagoj Ševerdija, Ivan Vazler - programiranjeprogramiranje.yolasite.com/resources/glavni_py.pdf · Python - osnove - Odjel za matematiku Sveučilišta Josipa Jurja

44 Iznimke

try:try_block

except ex:except_block

Python pokreće kod u bloku try dok ga ne završi uspješno ili se pojavi iznimka. Ako završi uspješno,Python preskače blok except, te se izvršenje nastavlja na naredbi koja slijedi iza njega. Ako se pojaviiznimka, Python 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, Python pokreće blok except, te se upravljanje tokom programa prebacujena naredbu koja slijedi blok except. Ako iznimka ne odgovara ex, znimka 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 Python zatvara program teispisuje poruku o pogrešci.

5.3.1 Ignoriranje iznimke

Za ignoriranje iznimke koristi se naredba pass unutar odlomka except .

try:try_block

except ex:pass

pa ako se dogodi iznimka, Python je ignorira i upravljanje tokom programa prelazi na prvu naredbunakon pass naredbe.

5.3.2 Pronalaženje argumenta iznimke

Kada 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 specificirati varijabla nakon imena iznimke u odlomku except.

try:try_block

except ex, target:except_block

pa ako se dogodi iznimka, Python će pridružiti argument iznimke varijabli target.

5.3.3 Obradba svih iznimki

Da bi se obuhvatilo sve iznimke, treba se specificirati 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_block

except:except_block

gdje except_block prihvaća i obrađuje sve iznimke.

Page 45: Mario Essert, Domagoj Ševerdija, Ivan Vazler - programiranjeprogramiranje.yolasite.com/resources/glavni_py.pdf · Python - osnove - Odjel za matematiku Sveučilišta Josipa Jurja

5.3. Obradba iznimki 45

5.3.4 Pokretanje programskog koda bez prisustva iznimke

Moguć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_block

except [...]:except_block

else:else_block

Python pokreće else_block jedino u slučaju kad try_block ne uzrokuje iznimku.

5.3.5 Obradba više iznimki

Moguć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_block

except (ex1, ex2, ...) [, target]:except_block

Odlomak 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šćenje

Naredba try-finally može se koristiti za pokretanje programskog kôda bez obzira je li Python podigaoiznimku ili nije. Za razliku od odlomka except , odlomak finally ne dohvaća iznimke, nego definiraakcije č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_block

finally:finally_block

Python pokreće kôd unutar finally_block-a nakon što ga pokrene u try_block-u. Python ć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, Python ć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 iznimke

Naredba raise se može upotrijebiti da bi se podigla željena iznimka. Za eksplicitno podizanje iznimketreba utipkati:

raise ex

ili

Page 46: Mario Essert, Domagoj Ševerdija, Ivan Vazler - programiranjeprogramiranje.yolasite.com/resources/glavni_py.pdf · Python - osnove - Odjel za matematiku Sveučilišta Josipa Jurja

46 Iznimke

raise ex, arg

ili

raise 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 definirane iznimke

U Pythonu je moguće stvarati korisničke iznimke na način da se definiraju 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: 4

5.4.1 Tvorba iznimki

Iznimke mogu biti stringovi, klase ili instance objekata. Iznimke u obliku stringova su zastarjele, Pythonih još uvijek podržava zbog kompatibilnosti. Korisnički definirane iznimke mogu se stvoriti koristećinaredbu class . Preporučuje se kao temeljnu klasu uzeti Pythonovu korijensku iznimku Exception. Skorisnički definiranim iznimkama radi se na isti način kao i s ugrađenim iznimkama. Uz except i else,postoji i način da se definira iznimka koja će se uvijek ispisati na kraju programa, bez obzira dali jebaš nju program tražio ili neku drugu. To je finally clause i definira 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 iznimku

Page 47: Mario Essert, Domagoj Ševerdija, Ivan Vazler - programiranjeprogramiranje.yolasite.com/resources/glavni_py.pdf · Python - osnove - Odjel za matematiku Sveučilišta Josipa Jurja

5.4. Korisnički definirane iznimke 47

Traceback (most recent call last):File "<stdin>", line 1, in ?File "<stdin>", 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.

5.4.2 Dodjelivalo

Dodjelivalo (eng. assertion) je alat za ispravljanje pogrešaka koji se koristi za ispis dijagnostičkihpodataka dok program radi. Python naredba assert sadrži bool-ov izraz koji ako je false (neistina),označava pogrešku. Izraz je uvijek jednak jedinici ako je istinit u trenutku kad se provjerava. Akoje izraz izračunat kao neistina (false), onda Python 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 Pythonpodiže AssertionError iznimku s dopuštenim argumentom arg. Ako je pak izraz expr jednak true,onda assert ne poduzima ništa.

Page 48: Mario Essert, Domagoj Ševerdija, Ivan Vazler - programiranjeprogramiranje.yolasite.com/resources/glavni_py.pdf · Python - osnove - Odjel za matematiku Sveučilišta Josipa Jurja
Page 49: Mario Essert, Domagoj Ševerdija, Ivan Vazler - programiranjeprogramiranje.yolasite.com/resources/glavni_py.pdf · Python - osnove - Odjel za matematiku Sveučilišta Josipa Jurja

POGLAVLJE 6Funkcije

Većina naredbi tipičnog Python programa organizirana je preko funkcija. Funkcija je skupina naredbikoje se izvršavaju po pozivu. Python pruža mnogo ugrađenih funkcija i dopušta programerima defi-niranje vlastitih funkcija. Zahtjev za izvršenje funkcije zove se funkcijski poziv (engl. function call).Kad se funkcija pozove, može primiti argumente koji specificiraju vrstu podataka nad kojima funkcijaizvršava svoje izračune. U Pythonu funkcija uvijek vraća rezultantnu vrijednost, koja može biti Noneili vrijednost koja predstavlja rezultat izračuna. U Pythonu su funkcije objekti, pa se sa njima upravljaisto kao i s drugim objektima. Tako se funkcija može proslijediti kao argument koji prima druga funk-cija. Slično tome, funkcija može vratiti drugu funkciju kao rezultat poziva. Kao i svaki drugi objekt,funkcija može biti povezana s varijablom, članom unutar spremnika (polja, liste) ili atributom objekta.Funkcije također mogu biti ključevi u rječniku. Na primjer, ako se treba brzo naći inverzna funkcijaza određenu funkciju, može se definirati rječnik čiji su ključevi i vrijednosti funkcije, a onda načinitirječnik dvosmjernim:

inverse = {sin:asin, cos:acos, tan:atan, log:exp}for f in inverse.keys( ): inverse[inverse[f]] = f

Činjenica da su funkcije objekti u Pythonu, često se izražava riječima da su funkcije objekti prveklase.

6.1 Naredba def

Ključnom riječi def definira se funkcije. Def je jednoklauzulna komponentna naredba sa sljedećomsintaksom:

def function-name(parameters):statement(s)

function-name je identifikator. To je varijabla koja se povezuje (ili re-povezuje) s funkcijskim objek-tom prilikom izvršenja naredbe def. parameters je dopuštena, slobodna lista identifikatora, koji sezovu formalni parametri ili samo parametri, a koji se koriste za pridruživanje stvarnim vrijednostimakoje se navode kao argumenti kod poziva funkcija. U najjednostavnijem slučaju, funkcija nema nikakvihformalnih parametara, što znači da funkcija ne uzima nikakve argumente prilikom pozivanja. U ovomslučaju, definicija funkcije ima prazne zagrade koje slijede iza imena funkcije tj. function-name(). Akofunkcija prihvaća argumente, onda parameters sadrži jedan ili više identfikatora, odvojenih zarezima.U ovom slučaju, svaki poziv fukciji pridružuje stvarne vrijednosti, poznate kao argumenti, koje odgova-raju parametrima specificiranima u definiciji funkcije. Parametri su lokalne varijable funkcije, te svakipoziv funkcije povezuje te varijable s odgovarajućim stvarnim vrijednostima koje pozivatelj prenosi kao

49

Page 50: Mario Essert, Domagoj Ševerdija, Ivan Vazler - programiranjeprogramiranje.yolasite.com/resources/glavni_py.pdf · Python - osnove - Odjel za matematiku Sveučilišta Josipa Jurja

50 Funkcije

argumente. Niz naredbi koji nije prazan, poznatiji kao tijelo funkcije (engl. function body), ne izvršavase kada i naredba def. Ono se izvršava kasnije, svaki put kada se funkcija poziva. Tijelo funkcije možeimati jednu ili više ponavljanja return naredbe, ali može postojati i bez nje. Evo primjera jednostavnefunkcije koja vraća vrijednost koja je dvostruka od one koju primi:

def double(x):return x*2

6.2 Parametri

Formalni parametri koji su jednostavni identifikatori predstavljaju obavezne parametre. Svaki pozivfunkciji mora pružiti i odgovarajuću vrijednost (argument) za svaki obvezatni parametar. U listi pa-rametara odvojenih zarezima s niti jednim ili više obvezatnih parametara može slijediti jedan ili višeslobodnih parametara koji imaju sljedeću sintaksu:

identifier=expression

Naredba def računa, ocjenjuje izraz, te sprema referencu vrijednosti koju izraz vraća, a koja sezove pretpostavljena vrijednost (eng. default value). Kad poziv funkcije nema argument koji odgo-vara proizvoljnom parametru, onda se identifikator 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 je promjenljivi objekt, a tijelo funkcije mijenja taj parametar. Na primjer:

def f(x, y=[ ]):y.append(x)return y

print 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 vrijednost, pa novi poziv uzimazadnje stanje argumenta. Ako je potrebno povezati y s novim objektom liste svaki put kada se f pozivas jednim argumentom, koristi se sljedeće:

def f(x, y=None):if y is None: y = [ ]y.append(x)return y

print f(23) # ispisuje se: [23]prinf f(42) # ispisuje se: [42]

Na kraju formalnih parametara dopušteno je koristiti jedan ili oba posebna oblika: *identifier1 i**identifier2. Ako su obadva na raspolaganju, onaj sa dvije zvjezdice mora doći zadnji. *identifier1dopušta da bilo koji poziv funkciji može pružiti dodatne pozicijske argumente, dok **identifier2 dopuštada bilo koji poziv funkciji može pružiti dodatne argumente s imenom. Na taj način rješavaju se pozivifunkcija s varijabilnim brojem argumenata. Svaki poziv funkciji povezuje identifier1 sa n-tercem čijisu članovi dodatni pozicijski argumenti (ili praznim n-tercem, ako ih nema). identifier2 povezuje serječnikom čiji su članovi imena i vrijednosti dodatnih argumenata koji se imenuju (ili praznim rječnikom,ako ih nema). Evo kako napisati funkciju koja prihvaća bilo koji broj argumenata i vraća njihov zbroj:

def zbroj(*broj):rez = 0for x in broj: rez += xreturn rez

print zbroj(23,42) # ispisuje se: 65

Page 51: Mario Essert, Domagoj Ševerdija, Ivan Vazler - programiranjeprogramiranje.yolasite.com/resources/glavni_py.pdf · Python - osnove - Odjel za matematiku Sveučilišta Josipa Jurja

6.3. Atributi funkcijskih objekata 51

Oblik ** također dopušta konstrukciju rječnika s ključevima stringa u obliku koji se lakše čita negostandardna rječnička sintaksa:

def 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 upotrijebiti opcija stavljanja na istu liniju kao i naredba def. Dakako, bilo bi jednako točno (imožda čitljivije) ako bi se funkcija vbr_rj ispisala koristeći dvije linije umjesto jedne:

def vbr_rj (**kwds):return kwds

6.3 Atributi funkcijskih objekata

Naredba def definira neke atribute od objekta funkcije. Atribut func_name, kojem se može pristupitii kao __name__, je samočitajući (engl. read-only) atribut (pa pokušaj ponovnog povezivanja tj. mije-njanja podiže iznimku) koji se odnosi na identifikator korišten kao ime funkcije u naredbi def. Atributfunc_defaults, koji se može ponovno povezati ili re-povezati, se odnosi na n-terac pretpostavljenih vri-jednosti za slobodne parametre (ili prazan n-terac, ako funkcija nema po izboru slobodnih parametara).Još jedan funkcijski atribut je dokumentacijski string (engl. documentation string), također poznatkao docstring. Docstring atribut funkcije može se koristiti ili re-povezati kao func_doc ili __doc__.Ako je prva naredba u tijelu funkcije string literal, compiler povezuje taj niz sa docstring atributomfunkcije. Docstring-ovi se često protežu preko nekoliko fizičkih linija, te se stoga obično označuju kaostring literali unutar trostrukih navodnika. Na primjer:

def zbroj(*brojevi):’’’Prihvati po volji koliko numeri\v{c}kih argumenata i vrati njihov zbroj

Argumenti su butu jedan ili vi\v{s}e brojeva. Izlaz je njihov zbroj. ’’’

rez = 0for broj in brojevi: rez += brojreturn rez

Dokumentacijski nizovi bi trebali biti dio svakoga Python kôda. Njihova je uloga slična komentarimau bilo kojem programskom jeziku, ali im je iskoristivost šira, jer su dostupni pri procesu pokretanjaprograma (engl. runtime). Programerska okruženja i drugi alati mogu koristiti docstring-ove funkcij-skih, klasnih i modularnih objekata da podsjete programera kako koristiti te objekte. Da bi se docstringučinio što je moguće korisnijim, trebalo bi poštovati nekoliko jednostavnih konvencija. Prva linija doc-stringa trebala bi biti sažeti opis svrhe funkcije, a počinjala bi s velikim slovom i završavala točkom.Unutar nje se ne bi trebalo spominjati ime funkcije, osim ako ime nije riječ iz prirodnog, govornogjezika pa dolazi kao dio opisa operacije te funkcije. Ako je docstring protegnut preko više linija, drugalinija treba biti prazna, a sljedeće linije bi trebale formirati jedan ili više odlomaka, odvojenih praznimlinijama, koji opisuju očekivane argumente funkcije, potrebne uvjete, povratne vrijednosti, te mogućenuspojave. Daljnja objašnjenja, književne reference, te primjeri korištenja (koji se mogu provjeriti sadoctest) mogu po slobodnom izboru slijediti iza, prema završetku docstring-a. Uz ove predefiniraneatribute, funkcijskom objektu mogu se dodati i drugi atributi. Da bi se stvorio atribut objekta funkcije,prikladna atributna vrijednost se nakon izvršenja naredbe def povezuje s odgovarajućim referencama.Na primjer, funkcija može brojati koliko je puta pozivana:

def counter( ):counter.count += 1return counter.count

counter.count = 0

Page 52: Mario Essert, Domagoj Ševerdija, Ivan Vazler - programiranjeprogramiranje.yolasite.com/resources/glavni_py.pdf · Python - osnove - Odjel za matematiku Sveučilišta Josipa Jurja

52 Funkcije

Ovo, ipak, nije česta primjena. Mnogo češće, kada se trebaju grupirati neki podaci i kôd zajedno,trebaju se koristiti objektno-orijentirani mehanizmi. Ipak, mogućnost pridruživanja atributa s funkcijommože ponekad biti od koristi.

6.4 Naredba Return

Naredba return u Pythonu dopušta se jedino unutar tijela funkcije, te iza nje po izboru može još slijeditineki izraz. Kada se return izvrši, funkcija završava i dobiva se povratna vrijednost izraza. Funkcijavraća None ako završava dolaskom do konca svog funkcijskog tijela ili izvršenjem naredbe return bezpridruženog izraza. Stvar je stila da se naredba return ne piše na kraju tijela funkcije, ako nema izrazkoji vraća. Ako neke return naredbe u funkciji imaju izraz, onda bi ga i sve ostale return naredbetrebale imati. Naredba return None može se pisati samo ako se eksplicitno želi zadržati stil takvogpisanja. Iako Python ne prisiljava na ovakve stilske konvencije, kôd će biti čitljiviji i jasniji ako ih seslijedi.

6.5 Pozivanje funkcija

Poziv funkciji je izraz sa sljedećom sintaksom:

function-object(arguments)

function-object može biti bilo kakva referenca na objekt funkcije, a to je najčešće ime funkcije.Zagrade označuju operaciju poziva funkciji, dok su arguments u najjednostavnijem slučaju niz od nulaili više izraza odvojenih zarezima, koji daju vrijednosti odgovarajućim formalnim parametrima funkcije.Kada se poziva funkcija, parametri poziva funkcije povezuju se s funkcijskim argumentima, tijelo funkcijese izvršava sa stvarnim vrijenostima argumenata, a neka vrijednost izraza je što god funkcija na koncuvrati nakon izvršenja.

6.5.1 Prenošenje argumenata

U tradicionalnim terminima rečeno, sve operacije prenošenja argumenata u Pythonu su putem vrijed-nosti (engl. by value). Na primjer, ako se varijabla prenosi kao argument, Python prenosi funkciji objekt(vrijednost) na koju se varijabla odnosi, a ne samu varijablu. Na taj način funkcija ne može re-povezati,tj. mijenjati varijable pozivatelja. Ali, ako se kao argument prenosi promjenljivi objekt, funkcija smijezahtjevati izmjene na objektu, jer Python prenosi sam objekt, a ne njegovu kopiju. Re-povezivanjevarijable i promjena objekta su dva potpuno različita koncepta u Pythonu. Na primjer:

def f(x, y):x = 23y.append(42)

a = 77b = [99]f(a, b)print a, b # prints: 77 [99, 42]

Naredba print pokazuje da je a još uvijek povezano sa 77. Re-povezivanje funkcijskog parametrax na 23 nema efekta s obzirom na poziv funkcije f, a posebno ne na povezivanje varijable pozivatelja,koje je bilo iskorišteno da prenese 77 kao vrijednost parametra. Ali, naredba print također pokazujeda je b sad povezano s [99,42]. Objekt b je još uvijek povezan s istim objektom liste kao i prije poziva,ali se taj objekt mijenjao, jer se unutar funkcije f pridodao 42 na taj objekt liste. U oba slučaja, fnije izmijenio poveznice pozivatelja, niti f može izmijeniti broj 77, jer su brojevi nepromjenljivi. Ali, fmože izmijeniti objekt liste, jer su objekti liste promjenljivi. U ovom primjeru, f mijenja objekt listekoji pozivatelj prenosi na f kao drugi argument pozivajući append metodu objekta.

Page 53: Mario Essert, Domagoj Ševerdija, Ivan Vazler - programiranjeprogramiranje.yolasite.com/resources/glavni_py.pdf · Python - osnove - Odjel za matematiku Sveučilišta Josipa Jurja

6.5. Pozivanje funkcija 53

6.5.2 Vrste argumenata

Upravo opisani argumenti zovu se pozicijski argumenti. Svakom pozicijskom argumentu pridružuje sevrijednost parametra koji mu odgovara po poziciji (redoslijedu) u definiciji funkcije. U pozivu funkcijes nula ili više pozicijskih argumenata mogu slijediti jedan ili više imenovanih argumenata sa sljedećomsintaksom:

identifier=expression

identifier mora biti jedno od imena formalnih parametara koja se koriste u def naredbi funkcije.expression daje vrijednost formalnog parametra.

Poziv funkcije mora pružati, 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) # prints: 7print divide(dividend=94, divisor=12) # prints: 7

Očito je da su dva poziva za dijeljenje ekvivalentna. Imenovani argumenti mogu se prenositi usvrhu čitljivosti, kada se čitljivost i razumljivost napisanog kôda može povećati identifikacijom uloge iupravljanjem redoslijeda argumenata. Češća uporaba imenovanih argumenata je u svrhu povezivanjanekih izabranih parametara za specifične vrijednosti, dok drugi izabrani, opcionalni parametri uzimajunjihove pretpostavljene vrijednosti:

def f(middle, begin=’init’, end=’finis’): return begin+middle+endprint f(’tini’, end=’’) # prints: inittini

Zahvaljujući imenovanom argumentu end=” pozivatelj može specificirati vrijednost, 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 u pozivu funkciji,po izboru se može koristiti bilo koji (ili oba) posebna oblika *seq i **dict. Ako su oba prisutna,onaj sa dvije zvjezdice mora doći na zadnjem mjestu. *seq prenosi članove seq kao pozicijske argu-mente funkcije (poslije običnih pozicijskih argumenata, ako ih ima, a koje poziv pruža s uobičajenomjednostavnom sintaksom). seq može biti bilo kakav niz ili iterator. **dict prenosi članove dict kaoimenovane argumente funkcije, gdje dict mora biti rječnikj čiji su svi ključevi stringovi. Ključ svakogčlana je ime parametra, a vrijednost tog člana je vrijednost argumenta. Ponekad je potrebno prenijetiargument oblika *seq ili **dict kad formalni parametri koriste slične oblike. Na primjer, koristećifunkciju sum može se ispisati zbroj svih vrijednosti u riječniku d. Ovo se postiže vrlo jednostavno sa*seq oblikom:

def sum(*numbers):result = 0for number in numbers: result += numberreturn result

print sum(*d.values( ))

Međutim, argumenti oblika *seq ili **dict mogu se prenositi i kad se poziva funkcija koja ne koristislične oblike u svojim formalnim parametrima.

6.5.3 Prostori za imena

Formalni parametri funkcije, plus bilo kakve varijable koje su povezane (pridružbom ili nekom drugompovezujućom naredbom) u funkcijskom tijelu, tvore lokalni prostor za imena funkcije (eng. localnamespace), također poznat i kao lokalni doseg (eng. local scope). Svaka od ovih varijabli zove selokalna varijabla funkcije. Varijable koje nisu lokalne zovu se globalne varijable. Ako lokalna varijablaunutar funkcije ima isto ime kao i globalna varijabla, kada god se to ime spomene u tijelu funkcije,koristi se lokalna, a ne globalna varijabla. Za ovakav pristup kaže se da lokalna varijabla sakrivaglobalnu varijablu istog imena kroz cijelo tijelo funkcije.

Page 54: Mario Essert, Domagoj Ševerdija, Ivan Vazler - programiranjeprogramiranje.yolasite.com/resources/glavni_py.pdf · Python - osnove - Odjel za matematiku Sveučilišta Josipa Jurja

54 Funkcije

6.6 Globalna naredba

Standardno, bilo koja varijabla koja je povezana unutar tijela funkcije je lokalna varijabla funkcije. Akopak funkcija treba re-povezati neke od svojih globalnih varijabli, prva naredba funkcije mora biti:

global identifiers

gdje su identifiers jedan ili više identifikatora odvojenih zarezima. Identifikatori popisani uglobal naredbi odnose se na globalne varijable (npr. atribute modul objekta) koje funkcija trebare-povezati. Na primjer, counter(brojilo) funkcije može se ubaciti u funkciju koristeći ključnu riječglobal i globalnu varijablu, a ne atribut objekta funkcije, kako slijedi:

_count = 0def counter( ):

global _count_count += 1return _count

Bez 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.7 Ugnježđene funkcije

Naredba def unutar tijela funkcije definira 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 sedopusti ugniježđenoj funkciji pristup vanjskim vrijednostima nije oslanjati se na ugnježđene dosegevarijabli, nego prijenos vanjskih vrijednosti preko funkcijskih argumenata. Vrijednost argumenta možebiti povezana kada se ugnježđena funkcija definira korištenjem vrijednosti kao pretpostavljena vrijednostza izabrani argument. Na primjer:

def percent1(a, b, c):def pc(x, total=a+b+c): return (x*100.0) / totalprint "Percentages are ", pc(a), pc(b), pc(c)

Evo iste funkcionalnosti upotrebom ugnježđenih dosega:

def percent2(a, b, c):def pc(x): return (x*100.0) / (a+b+c)print "Percentages are", pc(a), pc(b), pc(c)

U ovom specifičnom slučaju, percent1 ima malu prednost: izračun a+b+c se događa samo jednom,dok kod percent2 nutarnja funkcija pc ponavlja izračun tri puta. Međutim, ako vanjska funkcija re-povezuje svoje lokalne varijable između poziva ugnježđene funkcije, ponavljanje izračuna bi mogla bitii prednost. To znači da se preporučuje znanje oba pristupa, te izbor najprikladnijeg u danoj situaciji.Ugnježđena funkcija koja pristupa vrijednostima sa vanjskih lokalnih varijabla je poznata kao closure.Sljedeći primjer pokazuje kako izgraditi closure bez ugnježđenih dosega (koristeći pretpostavljenu vri-jednost):

Page 55: Mario Essert, Domagoj Ševerdija, Ivan Vazler - programiranjeprogramiranje.yolasite.com/resources/glavni_py.pdf · Python - osnove - Odjel za matematiku Sveučilišta Josipa Jurja

6.7. Ugnježđene funkcije 55

def make_adder_1(augend):def add(addend, _augend=augend): return addend+_augendreturn add

A evo i iste funkcionalnosti korištenjem ugnježđenih dosega:

def make_adder_2(augend):def add(addend): return addend+augendreturn add

Closures su iznimke u općem pravilu gdje su objektno-orjentirani mehanizmi najbolji način pove-zivanja podataka i kôda zajedno. Kada se trebaju konstruirati pozivni objekti, s nekim parametrimau vremenu konstrukcije objekta, closures mogu biti efikasnije i jednostavnije od klasa. Na primjer,rezultat make_adder_1(7) je funkcija koja prihvaća jedan argument i dodaje 7 na taj argument (re-zultat make_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.

Page 56: Mario Essert, Domagoj Ševerdija, Ivan Vazler - programiranjeprogramiranje.yolasite.com/resources/glavni_py.pdf · Python - osnove - Odjel za matematiku Sveučilišta Josipa Jurja
Page 57: Mario Essert, Domagoj Ševerdija, Ivan Vazler - programiranjeprogramiranje.yolasite.com/resources/glavni_py.pdf · Python - osnove - Odjel za matematiku Sveučilišta Josipa Jurja

POGLAVLJE 7Python - objektni jezik

Python je programski jezik orijentiran prema objektima. Za razliku od nekih drugih, također objektno-orijentiranih, jezika, Python ne uvjetuje korištenje isključivo objektno-orijentirane paradigme. Pythontakođer podržava proceduralno programiranje s modulima i funkcijama, tako da je moguće izabratinajprikladniju paradigmu programiranja za svaki dio programa. Općenito, objektno-orijentirana para-digma najbolja je kada se žele skupiti podaci i funkcije u praktične pakete. Isto tako može biti korisnakada se žele koristiti neki od Pythonovih objektno-orijentiranih mehanizama, kao naslijeđe ili posebnemetode. Proceduralna paradigma, koja je bazirana na modulima i funkcijama, je obično jednostavnija iprikladnija kada nikakve prednosti objektno-orijentiranog programiranja nisu potrebne. Sa Pythonom,je to obično stvar miješanja i prilagođavanja jedne ili više paradigmi. Novi stil objektnog modela postatće standard u budućim verzijama Pythona. Njegove prednosti nad klasičnim modelom, iako male, moguse zamijetiti i mjeriti, te praktično nema mana koje ih kompenziraju. Zato je jednostavnije koristitinovi stil objektni model, a ne odlučivati o izboru modela svaki put kod kodiranja nove klase.

7.1 Klasične klase i instance

Klasična klasa ili razred je Python objekt s nekoliko značajki:

• Objekt klase se može 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 podatkovni objekti ili funkcijski objekti.

• Atributi klase koji su povezani na funkcije poznati su kao metode klase.

• Metoda može imati posebno ime definirano od Pythona sa dvije podcrte ispred i iza. Pythonupotrebljava takve posebne metode, kad se različite vrste operacija izvršavaju na instancamaklase.

• Klasa može naslijediti od drugih klasa, što znači da može potragu atributa koji nisu unutar sameklase prenijeti na druge objekte klase.

• Instanca klase je Python objekt s po volji imenovanim atributima koji se mogu povezivati ireferirati. Objekt instance implicitno ostavlja svojoj klasi potragu za atributima koji se ne nalazeu samoj instanci. Klasa također može predati potragu klasama od kojih je naslijeđena.

57

Page 58: Mario Essert, Domagoj Ševerdija, Ivan Vazler - programiranjeprogramiranje.yolasite.com/resources/glavni_py.pdf · Python - osnove - Odjel za matematiku Sveučilišta Josipa Jurja

58 Python - objektni jezik

• U Pythonu, klase su objekti(vrijednosti), te se sa njima postupa kao i s drugim objektima. Takose klasa može prenijeti kao argument u pozivu funkcije. Slično tomu, funkcija može vratiti klasukao rezultat poziva. Klasa, kao i bilo koji drugi objekt, može biti povezana na varijablu (lokalnulili globalnu), član spremnika ili atribut objekta. Klase također mogu biti i ključevi u riječniku.Činjenica da su klase objekti u Pythonu se često izražava tako da se kaže da su klase objekti Prveklase.

7.2 Naredba class

Naredba class je najčešći način stvaranja objekta klase. Class je jednoklauzulna višedijelna naredbas ovom sintaksom:

class classname[(base-classes)]:statement(s)

classname je identifikator. To je varijabla koja postaje povezana (ili re-povezana) s objektom klasenakon što naredba class završi s izvršavanjem. base-classes je po volji zarezima odvojen niz izrazačije vrijednosti moraju biti objekti klase. Ove su klase poznate pod različitim imenima u različitimjezicima; o njima se može misliti kao o baznim klasama, superklasama, ili roditeljima klase koja sestvara. Za klasu koja se stvara kaže se da nasljeđuje oblik, počinje od, produžava se ili podklasira odsvoje bazne klase. Ova klasa je također poznata kao izravna podklasa ili potomak svojih baznih klasa.Podklasna veza između klasa je prijelazna. Ako je C1 podklasa od C2, a C2 podklasa od C3, onda je C1podklasa od C3. Ugrađena funkcija issubclass(C1,C2) prihvaća dva argumenta koji su objekti klase:vraća True ako C1 je podklasa od C2, u suprotnom vraća False. Svaka klasa je zapravo podklasa odsame sebe, tako da issubclass(C, C) vraća True za bilo koju klasu C. Sintaksa naredbe class imamalu, nezgodnu razliku od sintakse naredbe def. U naredbi def, zagrade su obvezatne između imenafunkcije i dvotočke. Da se definira funkcija bez formalnih parametara, mora se koristiti naredba kao:

def name( ):statement(s)

U naredbi class zagrade su obvezatne ako klasa ima jednu li više baznih klasa, ali su zabranjeneako klasa nema baznih klasa. Tako da se za definaciju klase bez baznih klasa mora koristiti naredbakao:

class name:statement(s)

Niz naredbi koji nije prazan, a koji slijedi naredbu class poznat je kao tijelo klase. Tijelo klase seizvršava odmah, kao dio procesa izvršenja naredbe class. Dok se tijelo ne izvrši, novi objekt klase nepostoji i classname identifikator nije još povezan (ili re-povezan). Konačno, valja primijetiti da naredbaclass ne stvara nove instance klase, nego definira skup atributa koji se dijeli između svih instanci kadase stvore.

7.3 Tijelo klase

Tijelo klase je mjesto gdje se specificiraju atributi klase; ovi atributi mogu biti podatčani ili funkcijskiobjekti:

7.3.1 Atributi objekata klase

Atribut objekta klase obično se specificira povezivanjem vrijednosti na identifikator unutar tijela klase.Na primjer:

Page 59: Mario Essert, Domagoj Ševerdija, Ivan Vazler - programiranjeprogramiranje.yolasite.com/resources/glavni_py.pdf · Python - osnove - Odjel za matematiku Sveučilišta Josipa Jurja

7.3. Tijelo klase 59

class C1:x = 23

print C1.x # ispisuje: 23

Objekt klase C1 sad ima atribut s imenom x, povezan na vrijednost 23, a C1.x se odnosi na tajatribut. Također je moguće povezati ili odvezati atribute klase izvan tijela klase. Na primjer:

class C2: passC2.x = 23print C2.x # ispisuje: 23

Ipak, 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 definira neke atribute klase. Atribut __name__ je classname identifikacijski nizznakova korišten u naredbi class. Atribut __bases__ je n-terac objekata klase koji su dani kao bazneklase u naredbi class (ili prazan n-terac, ako nema danih baznih klasa). Na primjer, koristeći klasu C1koju smo upravo stvorili:

print C1.__name__, C1.__bases__ # ispisuje: C1, ( )

Klasa također ima atribut __dict__, što je rječnički objekt koji klasa koristi za potporu (popispostojećih) svih svojih ostalih atributa. Za svaki objekt klase C, bilo koji objekt x i bilo kakav identifi-kator 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: 23, 45, 67

Pritom 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 naredbamakoje su izravno u tijelu klase, reference na atribute klase moraju koristiti puno, a ne jednostavno imekvantifikatora. Na primjer:

class C4:x = 23def amethod(self):

print C4.x # mora se koristiti C4.x, a ne samo x

Treba primijetiti da reference atributa (npr. izraz kao C.S) imaju bogatiju semantiku nego povezi-vanje atributa.

7.3.2 Definicije funkcija unutar tijela klase

Većina tijela klasa uključuju naredbu def, jer su funkcije (u ovom kontekstu se zovu metode) važniatributi za objekte klase. Uz to, metoda definirana 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 definicijumetode:

class C5:def hello(self):

print "Hello"

Klasa može definirati nekolicinu posebnih metoda (metoda sa imenima koja imaju dvije podcrteispred i iza) koje se odnose na posebne operacije.

Page 60: Mario Essert, Domagoj Ševerdija, Ivan Vazler - programiranjeprogramiranje.yolasite.com/resources/glavni_py.pdf · Python - osnove - Odjel za matematiku Sveučilišta Josipa Jurja

60 Python - objektni jezik

7.3.3 Varijable specifične za klasu

Kada naredba u tijelu klase (ili metodi unutar tijela) koristi identifikator koji počinje s dvije pod-crte (ali ne završava podcrtama), kao __ident, Python kompiler implicitno mijenja identifikator u_classname__ident, gdje je classname ime klase. Ovo dopušta klasi korištenje privatnih imena zaatribute, metode, globalne varijable i druge svrhe, bez rizika slučajnog dupliciranja imena korištenihdrugdje. Dogovorno, svi identifikatori koji počinju jednom podcrtom također se namijenjeni kao pri-vatni, za doseg koji ih povezuje, bez obzira je li doseg unutar klase ili nije. Python kompiler ne prisiljavadogovore oko privatnosti varijabli i metoda, to je ostavljeno programerima u Pythonu.

7.3.4 Dokumentacijski string

Ako 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.

7.4 Instance

Instance klase stvaraju se pozivom class objekta kao funkcije. Na taj način stvara se nova instanca ipoziva __init__() metoda od klase (ako je definirana). Na primjer:

# Create a few accountsa = Account("Guido", 1000.00)# Invokes Account.__init__(a,"Guido",1000.00)b = Account("Bill", 100000000000L)

Jednom načinjeni, atributi i metode novo nastale instance dohvatljivi su korištenjem točkastog (.)operatora kako slijedi:

a.deposit(100.00) # Call Account.deposit(a,100.00)b.withdraw(sys.maxint) # Call Account.withdraw(b,sys.maxint)name = a.name # Get account nameprint a.account_type # Print account type

Interno, svaka instanca se stvara koristeći rječnik koji je dohvatljiv kao isntanca __dict__ atributa.Ovaj rječnik sadrži informaciju koja je jedinstvena za svaku instancu. Na primjer:

>>> print a.__dict__{’balance’: 1100.0, ’name’: ’Guido’}>>> print b.__dict__{’balance’: 97852516353L, ’name’: ’Bill’}

Kad god se atributi instance promijene, ove promjene nastaju u lokalnom rječniku instance. Unutarmetoda definiranih u klasi, atributi se mijenjaju kroz pridružbu self varijabli kako je pokazano u__init__(), deposit() i withdraw() metode od Account. Međutim, novi atributi mogu se dodatiinstanci u bilo kojem trenutku, kao na primjer:

a.number = 123456 # Add attribute ’number’ to 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, interpreter prvo pretražuje rječnik instance. Akone nađe traženo, onda se pretražuje rječnik objekta klase koja se koristila za stvaranje instance. Ako nito nije urodilo plodom, onda se provodi pretraživanje baznih klasa (što uključuje nasljeđivanje). Akoi to propadne, konačni pokušaj traženja atributa je pozivom __getattr__() metode te klase (ako jedefinirana). Na koncu, ako ni to ne uspije, onda se podiže AttributeError iznimka. Kad se želi stvoritiinstanca klase, treba se pozvati objekt klase kao da je funkcija. Svaki poziv vraća novi objekt instance

Page 61: Mario Essert, Domagoj Ševerdija, Ivan Vazler - programiranjeprogramiranje.yolasite.com/resources/glavni_py.pdf · Python - osnove - Odjel za matematiku Sveučilišta Josipa Jurja

7.4. Instance 61

te klase: anInstance = C5() Ugrađena funkcija isinstance(O,C) s objektom klase kao argumentomC vraća True ako je objekt O instanca klase C ili bilo koje podklase C. U protivnom isinstance vraćaFalse.

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 potrebna instanci. Argumenti koji se predaju putempoziva moraju odgovarati formalnim parametrima __init__. Na primjer, u sljedećoj klasi:

class C6:def __init__(self,n):

self.x = n

Evo 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 ins-tance. 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 se također 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 objekata instance

Jednom kada se stvori instanca, može se pristupiti njenim atributima (podacima i metodama) koristećitočka (.) operator. Na primjer:

anInstance.hello( ) # ispisuje: Helloprint anotherInstance.x # ispisuje: 42

Objektu 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: 23

Objekt instance z sada ima atribut koji se zove x, povezan na vrijednost 23, i z.x se odnosi nataj atribut. To povezivanje atributa omogućuje također posebna metoda __setattr__ . Stvaranjeinstance implicitno definira dva atributa instance. Za svaku instancu z, z.__class__ je klasa objektakojemu z pripada, a z.__dict__ je riječnik koji z koristi za čuvanje svih svojih ostalih atributa. Naprimjer, za instancu z koja je upravo stvorena:

print z.__class__.__name__, z.__dict__ # ispisuje: 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 identifikator S (osim __class__ i __dict__), z.S=x je ekvi-valentan 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, 67

Nema razlike u atributima instance stvorenima s funkcijom __init__, zadacvanjem preko atributaili po eksplicitnom povezivanju sa z.__dict__.

Page 62: Mario Essert, Domagoj Ševerdija, Ivan Vazler - programiranjeprogramiranje.yolasite.com/resources/glavni_py.pdf · Python - osnove - Odjel za matematiku Sveučilišta Josipa Jurja

62 Python - objektni jezik

7.4.3 Tvornička funkcija

Česta želja je stvoriti instance različitih klasa ovisno o nekim uvjetima ili željeti izbjeći stvaranje noveinstance ako je postojeća još uvijek dostupna za korištenje. Te bi se potrebe mogu izvesti tako da__init__ vrati specifičan objekt, ali to nije moguće jer Python podiže iznimku kad __init__ vrati bilokoju vrijednost osim None. Najbolji način implementacije fleksibilnog stvaranja objekata je koristećiobičnu funkciju, a ne pozivanjem objekta klase izravno. Funkcija koja se koristi u ovu svrhu zove setvornička funkcija.

Pozivanje tvorničke funkcije je fleksibilnije rješenje, jer takva funkcija može vraćati postojeću ins-tancu koja se može ponovno koristiti ili stvoriti novu instancu pozivanjem odgovarajuće klase. Recimoda se ima dvije slične klase (SpecialCase i NormalCase) i da se treba fleksibilno generirati jedna odnjih, ovisno o argumentu. Sljedeća tvornička funkcija appropriateCase to omogućuje:

class SpecialCase:def amethod(self): print "special"

class NormalCase:def amethod(self): print "normal"

def appropriateCase(isnormal=1):if isnormal: return NormalCase( )else: return SpecialCase( )

aninstance = appropriateCase(isnormal=0)aninstance.amethod( ) # ispisuje "special", kako je tra\v{z}eno

7.4.4 Brojanje referenci i uništenje instance

Sve instance imaju brojilo referenci. Ako brojilo referenci postane jednako nuli, instanca se briše. Iakopostoji više načina kako izbrisati referncu, najčešće program koristi del naredbu za brisanje referencena objekt. Ako to utječe da se brojilo referenci objekta smanji na nulu, program poziva __del__()metodu. Pritom naredba del ne mora nužno direktno zvati __del__(). Sakupljač smeća konačno kupisve instance koje su ostale bez referenci.

7.5 Reference atributa

Referenca atributa je izraz u obliku x.name, gdje je x bilo koji izraz, a name identifikator zvan atributnoime. Mnoge vrste Python objekata imaju atribute, ali referenca atributa ima posebnu bogatu semantikugdje se x odnosi na klasu ili instancu. Metode su također atributi, tako da se sve što se odnosi na atributegeneralno odnosi i na pozivajuće atribute (npr. metode). Neka je x instanca klase C, koja se naslijeđujeod bazne klase B. Obje klase i instanca imaju nekoliko atributa (podataka i metoda) kako slijedi:

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 = 67c = 89d = 123def g(self): print "metoda g u klasi C "def h(self): print "metoda h u klasi C"

x = C( )x.d = 77x.e = 88

Page 63: Mario Essert, Domagoj Ševerdija, Ivan Vazler - programiranjeprogramiranje.yolasite.com/resources/glavni_py.pdf · Python - osnove - Odjel za matematiku Sveučilišta Josipa Jurja

7.6. Metode povezivanja i odvezivanja 63

Neka imena atributa su posebna. Na primjer, C.__name__ je string ’C’, tj. ime klase. C.__bases__je n-terac (B, ), tj. n-terac C-ovih baznih klasa. x.__class__ je klasa C, klasa kojoj x pripada. Kadase odnosi na atribute s jednim od ovih posebnih imena, referenca atributa gleda izravno u posebanpretinac (eng. slot) u objektu klase ili instance i uzima vrijednost koju tamo nađe. Zato se oviatributi nikada ne mogu odvezati. Re-povezivanje je dopušteno, tako da se imena i bazne klase ili klaseinstance mogu mijenjati, ali ovo je napredna tehnika i rijetko nužna. Klasa C i instanca x imaju jošjedan poseban atribut, rječnik s imenom __dict__. Svi ostali atributi klase ili instance, osim nekolikoposebnih, su sadržani kao članovi u __dict__ atributu klase ili instance. Osim posebnih imena, kada sekoristi sintaksa x.name za referenciranje na atribut instance x, proces traženja odvija se u dva koraka:

• Kada je ’name’ ključ u x.__dict__, x.name uzima i vraća vrijednost u x.__dict__[’name’]

• Inače, x.name prebacuje proces pretrage klasi od x (tj. radi identično kao x.__class__.name)

Slično tome, potraga za referencom atributa C.name na objektu klase C također se odvija u dvakoraka:

• Kada je ’name’ ključ u C.__dict__, C.name uzima i vraća vrijednost u C.__dict__[’name’]

• Inače, C.name prebacuje potragu na C-ovu baznu klasu, što znači da se vraća na C.__bases__ ipokušava potragu imena name na svakoj od njih

Kada ova dva postupka potrage ne uspiju naći atribut, Python podiže AttributeError iznimku. Me-đutim, ako klasa x-a definira ili naslijedi posebnu metodu __getattr__, Python poziva x.__getattr__(’name’),a ne podiže iznimku. Korisno je razmotriti sljedeće reference atributa:

print x.e, x.d, x.c, x.b. x.a # ispisuje: 88, 77, 89, 67, 23

x.e i x.d uspijevaju u prvom koraku prvog procesa traženja, jer su ’e’ i ’d’ ključevi u x.__dict__.Zato potraga ne ide dalje, nego vraća 88 i 77. Ostale tri reference moraju doći na 2. korak prvog procesai gledati u x.__class__ (tj. u C). x.c i x.b uspijevaju u 1. koraku drugog procesa potrage, jer su ’c’i ’b’ ključevi u C.__dict__. Zato potraga ne ide dalje, nego vraća 89 i 67. Konačno, x.a dospijevaskroz do 2. koraka drugog procesa, gledajući u C.__bases__[0] (tj. u B). ’a’ je ključ u B.__dict__,tako da x.a napokon uspijeva i vraća 23. Proces potrage atributa događa se samo onda, ako se odnosina atribute, a ne ako se atributi povezuju. Kada se poveže ili odveže atribut čije ime nije posebno,specijalno, mijenja se samo ulaz u __dict__. Drugim riječima, u slučaju povezivanja atributa nemaprocesa potrage.

7.6 Metode povezivanja i odvezivanja

Prvi korak procesa potrage reference atributa zapravo čini dodatnu zadaću kada je pronađena vrijednostfunkcija. U ovom slučaju, referenca atributa ne vraća funkcijski objekt izravno, nego pakira funkcijuu nepovezani objekt metode (engl. unbound method object) ili povezani objekt metode (engl. boundmethod object). Ključna razlika između povezanih i nepovezanih metoda je da nepovezana metoda nijepridružena s nikakvom instancom, dok povezana metoda jest. Atributi f, g, i h iz prethodnog primjerasu funkcije, tako da referenca atributa na bilo koji od njih vraća objekt metode koji pakira odgovarajućufunkciju. Korisno je pogledati sljedeće:

print x.h, x.g, x.f, C.h, C.g, C.f

Ova naredba daje (vraća) tri povezane metode, koje su predstavljene stringom:

<bound method C.h of <__main__.C instance at 0x8156d5c>>

a onda tri nepovezane, predstavljene kao:

<unbound method C.h>

Page 64: Mario Essert, Domagoj Ševerdija, Ivan Vazler - programiranjeprogramiranje.yolasite.com/resources/glavni_py.pdf · Python - osnove - Odjel za matematiku Sveučilišta Josipa Jurja

64 Python - objektni jezik

Povezane metode dobiju se kada je referenca atributa na instancu x, a nepovezane kada je referencaatributa na klasu C. Budući da je povezana metoda već pridružena određenoj instanci, metoda se pozivana sljedeći način:

x.h( ) # ispisuje: method h in class C

Klučna stvar koja treba ovdje primjetiti je to da se prvi argument metode (self), ne određujeuobičajenom sintaksom pridruživanja argumenata. Povezana metoda instance x implicitno povezujeparametar self s objektom x. Zato tijelo metode može pristupiti atributima instance kao atributimaself, iako se ne prenosi eksplicitni argument metodi. Nepovezana metoda nije povezana s određenominstancom, pa se mora specificirati odgovarajuća instanca kao prvi argument kod pozivanja nepovezanemetode. Na primjer:

C.h(x) # ispisuje: method h in class C

Nepovezane metode se pozivaju puno rjeđe nego povezane metode. Najveća korist nepovezanihmetoda je za pristup premošćenim metodama. Povezane metode koriste se kad je referenca atributa naisntanci x, a nepovezane kad je referenca atributa na klasi C.

7.6.1 Detalji nepovezanih metoda

Kada se referenca atributa klase odnosi na funkciju, referenca na taj atribut vraća nepovezanu me-todu koja obavija (eng. wrap) funkciju. Nepovezana metoda ima tri atributa uz one objekta funkcijekoji obavija: im_class je objekt klase koji daje metodu, im_func je upakirana funkcija, a im_self jeuvijek None. Ovi svi atributi su nepromjenljivi, read-only, što znači da njihov pokušaj re-povezivanjaili odvezivanja podiže iznimku. Nepovezana metoda se može pozvati isto kao pozivanje njene funkcijeim_func, ali prvi argument u bilo kojem pozivu mora biti instanca od im_class ili potomak. Dru-gim riječima, poziv nepovezanoj metodi mora imati najmanje jedan argument, koji odgovara prvomformalnom parametru (konvencionalno imenovanom self).

7.7 Nasljeđivanje

Nasljeđivanje je mehanizam stvaranja novih klasa koje specijaliziraju ili mijenjaju ponašanje postojećeklase. Originalna klasa zove se temeljna klasa (bazna, eng. base class) ili nadklasa, superklasa (engl.superclass). Nova klasa se zove izvedena klasa ili podklasa (eng. subclass). Kada se klasa stvara putemnasljeđivanja, ona nasljeđuje atribute definirane u njenim temeljnim klasama. Međutim, izvedena klasamože redefinirati bilo koji od ovih atributa i dodati nove vlastite atribute. Nasljeđivanje se specificiras listom imena temeljnih 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): # Inherits from A and B

varC = 3.3def method3(self):

print "Class C : method3"

Page 65: Mario Essert, Domagoj Ševerdija, Ivan Vazler - programiranjeprogramiranje.yolasite.com/resources/glavni_py.pdf · Python - osnove - Odjel za matematiku Sveučilišta Josipa Jurja

7.7. Nasljeđivanje 65

class D: passclass E(C,D): pass

Ako se traži atribut definiran u temeljnoj klasi, onda se koristi algoritam u dubinu (eng. depth-firstsearch) za pretraživanje i to u temeljnim klasama kako su navedene u poretku prilikom definicije 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 definiraju isti simbol, uzet će se prvi simbol kojeg procs traženjanađe. Na primjer:

c = C() # Create a ’C’c.method3() # Invoke C.method3(c)c.method1() # Invoke A.method1(c)c.varB # Access B.varB

Ako izvedena klasa definira atribut s istim imenom kao atribut u temeljnoj klasi, onda će instanceod izvedene klase koristiti atribute izvedene, a ne temeljne klase. Ako se ipak želi koristiti originalniatribut, onda se mora napisati puno ime do tog atributa, tj. ime_temeljne_klase.atribut, kao naprimjer:

class D(A):def method1(self):

print "Class D : method1"A.method1(self) # poziva baznz class metodu

Jedna posljedica ove činjenice nalazi se u inicijalizaciji klasnih instanci. Kad se instanca stvara,onda se ne poziva metoda __init__() temeljnih klasa. To znači, da je u izvedenoj klasi nužno načinitiispravnu inicijalizaciju temeljne klase, ako je to potrebno. Na primjer:

class D(A):def __init__(self, args1):

# Initialize the base classA.__init__(self)# Initialize myself...

Slični koraci mogu također biti nužni kad se definiraju akcije čišćenja (brisanja objekata) u __del__()metodi. Kada se koristi referenca atributa C.name na objekt klase, i ’name’ 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 bazne klase mogu imati i vlastite bazne klase. U ovom slučaju, potraga rekurzivno prosljeđujenaviše, po drvetu naslijeđa, zaustavljajući se kada je ’name’ nađeno. Potraga je po dubini, što znači dapregledava pretke svake bazne klase od C prije pregleda sljedeće bazne klase od C. Slijedi primjer:

class Base1:def amethod(self): print "Base1"

class Base2(Base1): passclass Base3:

def amethod(self): print "Base3"class Derived(Base2, Base3): passaninstance = Derived( )aninstance.amethod( ) # ispisuje: "Base1"

U ovom slučaju potraga za metodu započinje u Derived. Ako tamo nije pronađena, potraga senastavlja na Base2. Ako ni tamo atribut nije nađen, potraga ide na pretka Base2, tj. na Base1, gdje jeatribut napokon nađen. Tako se pretraga zaustavlja na toj točki i nikada ne uzima u obzir Base3, gdjebi se taj atribut također našao.

Page 66: Mario Essert, Domagoj Ševerdija, Ivan Vazler - programiranjeprogramiranje.yolasite.com/resources/glavni_py.pdf · Python - osnove - Odjel za matematiku Sveučilišta Josipa Jurja

66 Python - objektni jezik

7.7.1 Premošćujući (engl. overriding) atributi

Potraga za atributom, kako je objašnjeno, ide naviše po drvetu naslijeđa (prema precima), te se za-ustavlja kada je atribut pronađen. Potomačke klase pregledavaju se prije predaka, što znači da kadapodklasa definira atribut s istim imenom kao i onaj na superklasi, pretraga nalazi definiciju na podklasii tu se zaustavlja. Ovo je poznato kao premošćivanje definicije u superklasi koje obavlja podklasa:

class B:a = 23b = 45def f(self): print "method f in class B"def g(self): print "method g in class B"

class C(B):b = 67c = 89d = 123def g(self): print "method g in class C"def h(self): print "method h in class C"

U ovom kodu, klasa C premošćuje atribute b i g od njene superklase B.

7.7.2 Posluživanje metoda superklase

Kada 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 Base:def greet(self, name): print "Welcome ", name

class Sub(Base):def greet(self, name):

print "Well Met and",Base.greet(self, name)

x = Sub( )x.greet(’Alex’)

Predaja superklasi, u tijelu Sub.greet, koristi nepovezanu metodu dobivenu referencom atributaBase.greet na superklasi, i zato prenosi sve atribute normalno, uključujući self. Predaja ili posluživa-nje implementaciji superklase je glavna korist nepovezanih metoda. Jedno vrlo često korištenje takvogposluživanja događa se pomoću posebne metode __init__. Kada je instanca stvorena u Pythonu,metode __init__ baznih klasa nisu automatski pozvane, jer se mogu naći i u nekim drugim objektnoorijentiranim jezicima. Zato je na podklasi da obavi adekvatnu inicijalizaciju koristeći posluživanje popotrebi. Na primjer:

class Base:def __init__(self):

self.anattribute = 23class Derived(Base):

def __init__(self):Base.__init__(self)self.anotherattribute = 45

Ako __init__ metoda klase Derived nije implicitno pozvala metodu klase Base, instanca Derivedbi promašila taj dio njihove inicijalizacije, te zato takve instance ne bi imale atribut anattribute.

Page 67: Mario Essert, Domagoj Ševerdija, Ivan Vazler - programiranjeprogramiranje.yolasite.com/resources/glavni_py.pdf · Python - osnove - Odjel za matematiku Sveučilišta Josipa Jurja

7.7. Nasljeđivanje 67

7.7.3 "Brisanje" atributa klasa

Nasljeđivanje i premošćivanje pružaju jednostavan i učinkovit način dodavanja ili modifikacije atributaklasa (metoda) ne-invazivno (tj. bez modificiranja klase u kojoj su atributi definirani), dodavanjemili premošćivanjem atributa u podklasama. Međutim, nasljeđivanje ne podržava direktno slične na-čine brisanja (skrivanja) atributa baznih klasa bez direktnog pristupa. Ako podklasa jednostavno neuspije definirati (premostiti) atribut, Python nalazi definiciju bazne klase. Ako je potrebno izvršititakvo brisanje, mogućnosti uključuju: Premošćivanje metode i podizanje iznimke na tijelo metode Iz-bjegavanje nasljeđivanja, držanje atributa na drugom mjestu osim podklasnog __dict__, i definacija__getattr__ zbog selektivne predaje ili posluživanja Korištenje objektnog modela novog stila i pre-mošćivanje __getattribute__ sa sličnim učinkom.

7.7.4 Višeobličje (eng. polymorphism)

Višeobličje ili polimorfizam, ili dinamičko povezivanje potpuno se obražuje kroz ’lookup’ proces traženjaatributa opisanog prethodno u nasljeđivanju objekata. Kad god se metodi pristupa sa obj.method(),prvo se method locira traženjem __dict__ atributa instance, pa instancine klasne definicije, pa temeljnihklasa. To traženje uvijek ide u tom redoslijedu. Prvi uspješni pronalazak koristi se kao tražena metoda.

7.7.5 Skrivanje informacije (engl. information hiding)

Pretpostavlja se da su svi atributi javni (’public’). To znači da su svi atributi klasne instance dohvatljivibez ikakvog ograničenja. To također povlači da sve što je definirano u temeljnoj klasi nasljeđuje se idohvatljivo je u izvedenoj klasi. Takvo ponašanje je često nepoželjno u objektu orjentiranim primjenamajer to otkriva nutarnju strukturu objekta i može voditi konfliktima prostora imena između objekatadefiniranih u izvedenoj klasi i onih definiranih u temeljnoj klasi. Da bi se riješio ovaj probleem, uvedenoje da sva imena u klasi koja počinju s dvostrukom donjom crtom (__) , kao što je __Foo, što se pretvarau oblik _Classname __Foo. To pruža rješenje za klasu da ona ima privatne atribute, budući da privatnaimena u izvedenoj klasi neće kolidirati s imenima u temeljnoj klasi jer su imena 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__X

class B(A):def __init__(self):

A.__init__(self)self.__X = 37 # Pretvara se u self._B__X

Iako 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 semogu dohvatiti s gore opisanim punim imenom iz bilo koje instance.

7.7.6 Operatorsko punjenje

Korisnički objekti mogu se načiniti da rade sa svim Python-ovim ugrađenim operatorima dodajući po-sebne metode. Na primjer, sljedeća klasa nadopunja kompleksne brojeve sa standardnim matematičkimoperatorima i prisilnim tipovima kako bi se ostvarilo miješanje kompleksnih brojeva s cijelim i realnimbrojevima.

class Complex:def __init__(self,real,imag=0):

self.real = float(real)self.imag = float(imag)

Page 68: Mario Essert, Domagoj Ševerdija, Ivan Vazler - programiranjeprogramiranje.yolasite.com/resources/glavni_py.pdf · Python - osnove - Odjel za matematiku Sveučilišta Josipa Jurja

68 Python - objektni jezik

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,other):

return Complex(self.real + other.real, self.imag + other.imag)# self - otherdef __sub__(self,other):

return Complex(self.real - other.real, self.imag - other.imag)# -selfdef __neg__(self):

return Complex(-self.real, -self.imag)# other + selfdef __radd__(self,other):

return Complex.__add__(other,self)# other - selfdef __rsub__(self,other):

return Complex.__sub__(other,self)# Coerce other numerical types to complexdef __coerce__(self,other):

if isinstance(other,Complex):return self,other

try: # See if it can be converted to floatreturn self, Complex(float(other))

except ValueError:pass

U ovom primjeru, postoji nekoliko zanimljivih detalja:

• 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).

• 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.

• Konačno, __coerce__ metoda koristi se u dohvaćanju operacija koje uključuju mijeašne tipovepodataka. U ovom slučaju, drugi numerički tipovi pretvaraju se u kompleksne brojeve tako da semogu koristiti u metodama kompleksne aritmetike.

7.8 Testovi pripadnosti klasa i tipova

Trenutačno, postoji odijeljenost između tipova i klasa. To konkretno znači, da se ugrađeni tipovi poputlista i rječnika ne mogu specijalizirati preko nasljeđivanjem, jer ono za njih ne postoji. Isto tako nitiklase ne mogu definirati nove tipove. Ustvari, sve klasne definicije imaju tip ClassType, dok sve klasneinstance imaju tip InstanceType. Zbog toga je izraz

type(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:

Page 69: Mario Essert, Domagoj Ševerdija, Ivan Vazler - programiranjeprogramiranje.yolasite.com/resources/glavni_py.pdf · Python - osnove - Odjel za matematiku Sveučilišta Josipa Jurja

7.8. Testovi pripadnosti klasa i tipova 69

class A: passclass B(A): passclass C: pass

a = A() # Instanca od ’A’b = B() # Instanca od ’B’c = C() # Instanca od ’C’

print isinstance(a,A) # Vra\’{c}a Trueprint isinstance(b,A) # Vra\’{c}a True, B je izveden iz Aprint isinstance(b,C) # Vra\’{c}a False, C nije izveden iz A

Slično, ugrađena funkcija issubclass(A ,B ) vraća istinu ako je A podklasa klase B. Na primjer:

issubclass(B,A) # Vra\’{c}a Trueissubclass(C,A) # Vra\’{c}a False

Funkcija isinstance() može se koristiti za izvršavanje provjere tipa s obzirom na bilo koji ugrađenitip:

import typesisinstance(3, types.IntType) # Vra\’{c}a Trueisinstance(3, types.FloatType) # Vra\’{c}a False

Ovo je preporučen način provjere tipa među ugrađenim tipovima, jer će razlika između tipova i klasamožda isčeznuti u budućim inačicama Python-a.

Page 70: Mario Essert, Domagoj Ševerdija, Ivan Vazler - programiranjeprogramiranje.yolasite.com/resources/glavni_py.pdf · Python - osnove - Odjel za matematiku Sveučilišta Josipa Jurja
Page 71: Mario Essert, Domagoj Ševerdija, Ivan Vazler - programiranjeprogramiranje.yolasite.com/resources/glavni_py.pdf · Python - osnove - Odjel za matematiku Sveučilišta Josipa Jurja

POGLAVLJE 8Moduli i paketi

Veliki Python programi često se organiziraju kao paketi modula. Nadalje, veliki broj modula već jeuključen u Python-ovu knjižnicu.

8.1 Moduli

Moguće je uključiti u modul bilo koji valjanu datoteku s izvornim kôdom, i pozvati ga s naredbomimport. Na primjer, neka je sljedeći kôd spremljen u datoteku ’spam.py’:

# file : spam.pya = 37 # Varijabladef foo: # Funkcija

print "I’m foo"class bar: # Klasa

def grok(self):print "I’m bar.grok"

b = bar() # Tvorba instance

Pozvati u memoriju ovakav kôd kao modul, postiže se naredbom import spam. Prvi put kad seimport koristi da se modul napuni u memoriju, događaju se tri stvari:

1. On stvara novi prostor imena koji služi svim objektima definiranim u pripadnoj izvornoj datoteci.Ovaj prostor imena dohvaća se kad funkcije i metode definirane unutar modula koriste naredbuglobal.

2. On izvršava kod koji je sadržan u modulu unutar novonastalog prostora imena.

3. On izvršava ime unutar pozivatelja koji se odnosi na prostor imena modula. Ovo ime podudarase s imenom modula i korisiti se kako slijedi:

import spam # Loads and executes the module ’spam’print spam.a # Accesses a member of module ’spam’spam.foo()c = spam.bar()...

Uvlačenje, uvoz (eng. import) višestrukih modula izvodi se tako da se iza naredbe import dopišuimena modula, odijeljenih zarezom, ovako:

71

Page 72: Mario Essert, Domagoj Ševerdija, Ivan Vazler - programiranjeprogramiranje.yolasite.com/resources/glavni_py.pdf · Python - osnove - Odjel za matematiku Sveučilišta Josipa Jurja

72 Moduli i paketi

import socket, os, regex

Moduli se mogu uvući (importirati) koristeći alternativna imena, upotrebom poveznice as. Naprimjer:

import os as systemimport socket as net, thread as threadssystem.chdir("..")net.gethostname()

Naredba from koristi se za specifične definicije unutar modula s trenutačnim prostoru imena. Ovanaredba je identična naredbi import osim što se stvara ime koje se odnosi na novo stvoreni modul pros-tora imena, te referenca na jedan ili više objekata definiranih u modulu koji se smjestio u trenutačnomprostoru imena:

from socket import gethostname# Stavlja gethostname u trenuta\v{c}ni prostor imena

print gethostname() # Koristi se bez imena modulasocket.gethostname() # Pogre\v{s}ka imena (NameError: socket)Naredba from tako{\dj}er prihva\’{c}a zarezom odvojena imena objekata. Zvjezdica (engl. asterisk , *) je sveobuhvatni (engl. wildcard) znak koji se tako{\dj}er koristi da se uvuku, u\v{c}itaju, sve definicije u modulu osim onih koje po\v{c}inju s podvu\v{c}enom crtom (_). Na primjer:from socket import gethostname, socketfrom socket import * # Puni sve definicije u trenuta\v{c}ni prostor imena

Moduli se mogu preciznije upravljati skupom imena koji se učita s from module import * definiranjemliste __all__. Na primjer:

# module: foo.py__all__ = [ ’bar’, ’spam’ ] # Imena koja \’{c}e se uvu\’{c}i sa *

Nadalje, poveznica as može se koristiti da se promijeni ime posebnih objekata koji se u memorijuučitaju s naredbom from. Na primjer:

from socket import gethostname as hostnameh = hostname()

Naredba import može se pojaviti na bilo kojem mjestu u programu. Međutim, kod 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 prethodnom importnaredbom. U varijabli sys.modules može se naći rječnik koji sadrži imena svih trenutačno napunjenihmodula. On preslikaa imena modula na njihove objekte. Sadržaj rječnika se koristi za određivanje je liimport 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, nije dopušteno koristiti ovaj oblik importnaredbe unutar tijela funkcije, zbog njegove interakcije s pravilima funkcijskog dosega (engl. scopingrules). Svaki modul definira variable __name__ koja sadrži ime modula. Programi mogu ispitivati ovuvarijablu da se odredi modul u kojem se naredbe izvršavaju. Gornji (top-level) modul interpretera zovese __main__. Programi zadani na naredbenoj liniji ili unešeni interaktivno, uvijek se izvode unutar__main__ modula. Ponekad program može promijeniti ovo ponašanje, ovisno o tomu je li uvučen izmodula ili je izveden u __main__ okolišu. To se može postići na ovaj način:

# provjera je li se vrti kao programif __name__ == ’__main__’:

# Danaredbe

else:# ne, uvucen je kao modulNaredbe

Page 73: Mario Essert, Domagoj Ševerdija, Ivan Vazler - programiranjeprogramiranje.yolasite.com/resources/glavni_py.pdf · Python - osnove - Odjel za matematiku Sveučilišta Josipa Jurja

8.1. Moduli 73

8.1.1 Modulski put traženja (engl. Search Path)

Kad se učitaju moduli, interpreter traži listu imenika, foldera u sys.path. Tipična vrijednost sys.pathmože izgledati ovako:

[’’, ’/usr/local/lib/python2.0’,’/usr/local/lib/python2.0/plat-sunos5’,’/usr/local/lib/python2.0/lib-tk’,’/usr/local/lib/python2.0/lib-dynload’,’/usr/local/lib/python2.0/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, punjenje (engl. import) modula i compilacija

Do sada su moduli prikaani kao datoteke koje sadrže Python kod. Međutim, moduli uvučeni s naredbomimport stvarno pripadaju nekoj od četiri opće kategorije:

• Programi pisanii u Pythonu (.py datoteke)

• C ili C++ proširenja koja su compilirana u zajedničkim (shared) knjižnicama ili DLL-ovima.

• Paketima koji sadrže skupove modula

• Ugrađene module pisane u C-u i povezane u Python interpreter

Kad se traži modul foo, interpreter pretražuje svaki od direktorija u sys.path za sljedeće datoteke(navedene po redoslijedu pretraživanja):

1. Imenik ili folder foo koji je definiran u paketu

2. foo.so, foomodule.so, foomodule.sl, ili foomodule.dll (compilirana proširenja)

3. foo.pyo (samo ako je -O ili -OO opcija korištena)

4. foo.pyc

5. foo.py

Za .py datoteke, kad se modul prvi put uvuče, importira, on se prevede, compilira u međukod (eng.bytecode) i zapisuje na disk u datoteku s proširenjem .pyc. U idućim učitanjima, interpreter puni ovajpriređeni međukod, osim ako ne dođe do promjene originalne .py datoteke (pa se .pyc datoteka moraregenerirati. Datoteke koje završavaju na .pyo koriste se u svezi sa interpreterskom -O opcijom. Ovedatoteke sadrže međukod s izbačenim brojevima linija i drugim informacijama potrebnim za traženjepogrešaka (eng. debugging). Kao rezultat toga, kod je nešto manji i dopušta interpretoru nešto bržeizvođenje. U slučaju -OO opcije svi dokumentacijski stringovi se također izbacuju iz datoteka. Ovobrisanje dokumentacijskih stringova pojavljuje se samo kad se .pyo datoteke stvaraju, a ne kad sepune. Ako niti jedna od ovih datoteka ne postoji u niti jednom imeniku u sys.path, onda interpreterprovjerava da li ime odgovara imenu nekog ugrađenog modula. Ako ono ne postoji, onda se podižeImportError iznimka. Compilacija datoteka u .pyc i .pyo datoteke događa se samo u sprezi s naredbomimport. Programi specificirani na naredbenoj liniji ili standardnom ulazu ne proizvode takve datoteke.Naredba import u traženju datoteka razlikuje mala i velika slova u njihovom imenu. Kod operacijskihsustava koji ne podržavaju tu razliku, potrebno je o tomu voditi računa.

Page 74: Mario Essert, Domagoj Ševerdija, Ivan Vazler - programiranjeprogramiranje.yolasite.com/resources/glavni_py.pdf · Python - osnove - Odjel za matematiku Sveučilišta Josipa Jurja

74 Moduli i paketi

8.1.3 Ponovno punjenje modula (engl. reloading)

Ugrađena funkcija reload() koristi se da se ponovno napuni i izvrši kod sadržan unutar modula prethodnoučitanog s naredbom import. Ona prima objekt modula kao pojedinačni argument. Na primjer:

import foo... some code ...reload(foo) # Reloads foo

Sve operacije uključene u modul će nakon izvođenja naredbe reload() izvesti iz novo učitanog koda.Međutim, reload() neće retroaktivno obnoviti objekte koji su nastali iz starog modula. To znači daje 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 Paketi

Paketi 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. Paket sedefinira stvaranjem imenika (engl. directory, folder) s istim imenom kao paket i stvaranjem __init__.pydatoteke u tom imeniku. Moguće je nakon toga dodati druge izvorne datoteke (tekstovne datoteekes Python kodom), compilirana proširenja ili podpakete u istom imeniku. Na primjer, paket se možeovako organizirati:

Graphics/__init__.pyPrimitive/

__init__.pylines.pyfill.pytext.py...

Graph2d/__init__.pyplot2d.py...

Graph3d/__init__.pyplot3d.py...

Formats/__init__.pygif.pypng.pytiff.pyjpeg.py

Naredba import koristi se za punjenje modula iz paketa na nekoliko načina:

import Graphics.Primitive.fill

Ovo učitava, uvlači, podmodul Graphics.Primitive.fill. Sadržaj tog modula mora se eksplicitnoimenovati, ka na primjer: Graphics.Primitive.fill.floodfill(img,x,y,color).

from Graphics.Primitive import fill

Page 75: Mario Essert, Domagoj Ševerdija, Ivan Vazler - programiranjeprogramiranje.yolasite.com/resources/glavni_py.pdf · Python - osnove - Odjel za matematiku Sveučilišta Josipa Jurja

8.2. Paketi 75

Ovo učitava podmodul fill i čini ga raspolživim i bez paketnog prefiksa, na primjer: fill.floodfill(img,x,y,color).

from Graphics.Primitive.fill import floodfill

Ovo učitava podmodul fill i čini floodfill funkciju direktno primjenljivom; na primjer, floodfill(img,x,y,color).Kad god se neki dio paketa učita, importira, kod u datoteci __init__.py se izvršava. U najmanjemslučaju ova datoteka može biti i prazna, ali također može sadržavati kod kojim se izvode inicijalizacijekoje su specifične za paket. Sve nađene datoteke __init__.py za vrijeme učitavanja, automatski seizvršavaju. Tako će naredba import Graphics.Primitive.fill pokazana ranije izvršiti __init__.pydatoteke i u Graphics imeniku i u Primitive imeniku. Jedan poseban problem s paketima je obradbaovakve naredbe:

from Graphics.Primitive import *

Željeni rezultat ove naredbe je uvući, importirati, sve module pridružene u paketu sa trenutačnimprostorom imena. Međutim, s obzirom da dogovori oko imena datoteka (pogotovo u smislu razlikovanjavelikih i malih slova) variraju od sustava do sustava, Python ne može točno odrediti koje moduletočno treba uključiti. Kao rezultat, ova naredba samo importira sve reference koje su definirane u__init__.py datoteci u Primitive imeniku. Ovo se ponašanje može promijeniti definiranjem liste__all__ koja sadrži sva imena modula pridružena s paketom. Ova lista treba biti definirana unutarpaketa u __init__.py datoteci, kao ovo:

# Graphics/Primitive/__init__.py__all__ = ["lines","text","fill",...]

Ako korisnik pokrene naredbu from Graphics.Primitive import * onda se svi navedeni podmo-duli uč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 kod neće raditi:

import GraphicsGraphics.Primitive.fill.floodfill(img,x,y,color) # Pogresno!

Međutim, budući da importGraphics naredba izvršava __init__.py datoteku u Graphics imeniku,moguće ju je promijeniti kako bi se automatski učitali svi podmoduli:

# Graphics/__init__.pyimport Primitive, Graph2d, Graph3d

# Graphics/Primitive/__init__.pyimport lines, fill, text, ...

Na ovaj način importGraphics naredba učitava sve podmodule i čini ih raspoloživima za pozive ko-risteći njihova potpuna imena. Moduli koji su sadržani unutar istog imenika paketa, mogu referenciratijedan drugog bez navođenja punog imena paketa. Na primjer, modul Graphics.Primitive.fill možeučitati Graphics.Primitive.lines modul jednostavno koristeći naredbu import lines. Međutim,ako je modul smješten u drugom imeniku, onda se mora koristiti puno ime paketa. Na primjer, akoplot2d iz modula Graphics.Graph2d traži upotrebu lines iz modula Graphics.Primitive, mora sekoristiti puna staza imena: from Graphics.Primitive import lines. Ako je potrebno, modul možeispitati svoju __name__ varijablu da nađe potpunu stazu svog imena. Na primjer, sljedeći kod učitavamodul iz sestrinskog podpaketa znajući samo ime tog podpaketa (a ne i ime s vrha paketa):

# Graphics/Graph2d/plot2d.py# Determine the name of the package where my package is locatedimport stringbase_package = string.join(string.split(__name__,’.’)[:-2],’.’)

# Import the ../Primitive/fill.py moduleexec "from %s.Primitive import fill" % (base_package,)

Page 76: Mario Essert, Domagoj Ševerdija, Ivan Vazler - programiranjeprogramiranje.yolasite.com/resources/glavni_py.pdf · Python - osnove - Odjel za matematiku Sveučilišta Josipa Jurja

76 Moduli i paketi

Konačno, kad Python učitava paket, on definira specijalnu varjablu __path__ koja sadrži listuimenika koji se pretražuju, kad se se traže paketni submoduli. (Varijabla __path__ je posebna inačicasys.path varijable.) __path__ je dohvatljiv za kod sadržan u datoteci __init__.py i inicijalno sadržijedan član s 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.

Page 77: Mario Essert, Domagoj Ševerdija, Ivan Vazler - programiranjeprogramiranje.yolasite.com/resources/glavni_py.pdf · Python - osnove - Odjel za matematiku Sveučilišta Josipa Jurja

POGLAVLJE 9Ulaz i izlaz

Pod pojmom ulaz/izlaza razmatraju se opcije naredbene linije, varijable okoline, rad s datotekama,naredba print i očuvanje objekta.

9.1 Čitanje opcija i varijabli okoliša

Kad interpreter započne s radom, opcije naredbene linije spremaju se u listu sys.argv. Prvi elementliste je ime programa. Idući elementi su opcije predstavljene na naredbenoj liniji iza programskog imena.Sljedeći program pokazuje kako pristupiti opcijama naredbene 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 proizvodi 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

Page 78: Mario Essert, Domagoj Ševerdija, Ivan Vazler - programiranjeprogramiranje.yolasite.com/resources/glavni_py.pdf · Python - osnove - Odjel za matematiku Sveučilišta Josipa Jurja

78 Ulaz i izlaz

9.2 Datoteke (engl. files)

Ugrađena funkcija open(name [,mode ]) otvara i stvara datoteke, kao što sljedi:

f = open(’foo’) # Otvara ’foo’ za citanjef = open(’foo’,’w’) # Otvara za pisanje

Načini otvaranja datoteke su ’r’ za čitanje (eng. read), ’w’ za pisanje (engl. write), ili ’a’ za dodavanjesadržaja u već postojeću datoteku (eng. append). Binarni podatci spremaju se u datoteku s oznakom’b’, pa vrijedi ’rb’ kao način čitanja binarnih podataka, a ’wb’ kao način spremanja inarnih podataka.To je opcionalno u UNIX-u, ali nužno na Windows-ima, gdje se treba uključiti kako bi se postiglaprenosivost 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ćeje 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 sena početku njena duljina pretvara u nulu (briše se sadržaj). open() vraća objekt datoteke (eng. fileobject) koji podržava methode prikazane u tablici 9.1:

Tablica 9.1: Metode s datotekama

Metode Opisf.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 file.

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. flushes) izlazni mem. bufer udatoteku.

f.truncate([size]) Skraćuje datoteku na najviše size okteta.f.fileno() Vraća cjelobrojni identifikator datoteke.f.readinto(buffer,nbytes)

Učitava nbytes podataka iz memorijskog bufferobjekta.

Metoda read() vraća čitavu datoteku kao jedan string, osim ako je zadan jedan proizvoljan para-metar length 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 ite-

racijskim postupkom, umjesto cjelokupnog učitavanja linija odjednom u memoriju, kao što to radireadlines() metoda. Na primjer:

Page 79: Mario Essert, Domagoj Ševerdija, Ivan Vazler - programiranjeprogramiranje.yolasite.com/resources/glavni_py.pdf · Python - osnove - Odjel za matematiku Sveučilišta Josipa Jurja

9.3. Standardni ulaz, izlaz i pogreška (engl. Input, Output, Error) 79

for line in f.xreadlines():# Naciniti nesto s linijom...

Metoda write() upisuje string u datoteku, a metoda writelines()upisuje listu stringova u da-toteku. 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, definiranom 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:

Tablica 9.2: Atributi datoteka

Atributi Opis

f.closedBoolova vrijednost koja pokazuje stanjedatoteke:0 ako je datoteka otvorena, a 1 ako jezatvorena.

f.mode Ulazno/izlazni mod (I/O) za datoteku.

f.nameIme datoteke, ako je otvorena s open(). Inače,atribut predstavlja string koji pokazuje izvornikod datoteke.

f.softspaceBoolova 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)

Python 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’: break

return text

Alternativno, ugrađena funkcija raw_input(prompt) može čitati liniju teksta sa standardnog ulazastdin:

s = raw_input("type something : ")print "You typed ’%s’" % (s,)

Page 80: Mario Essert, Domagoj Ševerdija, Ivan Vazler - programiranjeprogramiranje.yolasite.com/resources/glavni_py.pdf · Python - osnove - Odjel za matematiku Sveučilišta Josipa Jurja

80 Ulaz i izlaz

Konačno, nasilni prekid preko tipkovnice (najčešće generiran sa Ctrl+C) rezultira u KeyboardInterruptizuzetku koji se može dohvatiti koristeći potporu izuzetaka (eng. exception handler). Ako je potrebnovrijednosti od sys.stdout, sys.stdin i sys.stderr mogu se zamijeniti s ostalim objektima dato-teke. U tom slučaju naredba print i funkcije raw_input koriste nove vrijednosti. Originalne vrijed-nosti od sys.stdout, sys.stdin i sys.stderr na početku rada interpretera su također dohvatljiveu sys.__stdout__, sys.__stdin__ i sys.__stderr__. Dobro je primjetiti da se u nekim slučajimasys.stdin, sys.stdout i sys.stderr mogu promijeniti od strane integriranog razvojnog okruženja (eng. inte-grated development environment - IDE ). Na primjer, kad se Python izvod pod Idle-om, onda se sys.stdinzamjenjuje s objektom koji se ponaša kao datoteka, iako je on stvarno objekt razvojnog okruženja. Uovom slučaju, stanovite metode niske razine kao što su read() i seek() ne mogu se izvoditi.

9.4 Naredba print

Naredba print daje izlaz u datoteku koja se pridružena objektu sys.stdout. Ta naredba prihvaća listuzarezima odvojenih objekata, kao na primjer:

print "Vrijednosti varijabli su: ", x, y, z

Za svaki se objekt poziva funkcija str() kako bi proizvela string na izlazu.. Ovi izlazni stringovi seonda povezuju i međusobno odjeljuju prazninama, kako bi se proizveo konačni izlazni string. Izlaz sezaključuje znakom za novi red, osim u slučaju kad se print naredba završava zarezom. U tom slučaju,ispisuje se samo dodatna praznina na koncu stringa, ali ne i novi red. Na primjer:

print "Vrijednosti varijabli su: ", x, y, z, w# ispisuje isti tekst, koriste\’{c}i dvije print naredbeprint " Vrijednosti varijabli su: ", x, y, # Ne ispisuje novi redakprint z, w

Upotrebom string formatirajućeg operatora (%) dobiva se formatirani izlaz. Na primjer:

print "Vrijednosti su: %d %7.5f %s" % (x,y,z) # Formatirani UL/IZL (I/O)

Moguće je promijeniti odredište print naredbe dodajući specijalni »file modifikator, gdje je filedatoteka objekta u koju korisnik piše. Na primjer:

f = open("izlaz","w")print >>f, "Ovdje Python!"...f.close()

Kombinacijom formatiranog ulaz/izlaza stringova s trostrukim navodnicima i rječnika, dobiva sesnažna pomoć u pisanju kompjutorski generiranih tekstova, kakva su, na primjer, cirkularna pisma.Obično se u takvim pismima trebaju opća imena, adrese i neki brojni iznosi zamijeniti stvarnima, kaona primjer ovdje :

Dragi gosp. Miki,Molim Vas vratite mi moj bicikl ili mi platite 150 Eura.

S po\v{s}tovanjem,

Python Mla{\dj}i

Da bi se to načinilo, prvo se formira string s trostrukim navodnicima koji sadrži tekst, a onda rječnik,koji sadrži stvarne vrijednosti varijabli:

Page 81: Mario Essert, Domagoj Ševerdija, Ivan Vazler - programiranjeprogramiranje.yolasite.com/resources/glavni_py.pdf · Python - osnove - Odjel za matematiku Sveučilišta Josipa Jurja

9.5. Otpornost 81

form = """\Dragi %(ime)s,Molim Vas vratite mi moj %(vlasnistvo)s ili mi platite $%(iznos)0.2f Eura.

S po\v{s}tovanjem,

Python Mla{\dj}i

"""print form % { ’ime’: ’gosp. Miki’,

’vlasnistvo’: ’bicikl’,’iznos’: 150,

}

Za 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\v{z}e se sljede\v{c}im kôdom:import picklef = open(filename,’r’)object = pickle.load(f) # Obnavlja objekt

Modul shelve je sličan, ali objekte sprema u bazu podataka sličnu rječniku:

import shelveobject = someObject()dbase = shelve.open(filename) # Otvara bazudbase[’key’] = object # Sprema objekt u bazu...object = dbase[’key’] # Vra\’{c}a objekt iz bazedbase.close() # Zatvara bazu

U oba slučaja, samo se serijalizirani objekti mogu spremiti u datoteku. Većina Python objekatase može serijalizirati, ali objekti posebne vrste, kao što su na primjer datoteke, ne mogu se spremati iobnavljati na ovaj način.

Page 82: Mario Essert, Domagoj Ševerdija, Ivan Vazler - programiranjeprogramiranje.yolasite.com/resources/glavni_py.pdf · Python - osnove - Odjel za matematiku Sveučilišta Josipa Jurja
Page 83: Mario Essert, Domagoj Ševerdija, Ivan Vazler - programiranjeprogramiranje.yolasite.com/resources/glavni_py.pdf · Python - osnove - Odjel za matematiku Sveučilišta Josipa Jurja

Literatura

[1] Wesley J. Chun, Core Python Programming, Prentice-Hall, Inc., 2001.

[2] Alex Martelli, Python in a Nutshell, O’Reilly, 2003.

[3] David M Beazley , Python Essential Reference, New Riders Publishing , 2001.

[4] Rashi Gupta, Making Use of Python, Wiley Publishing, Inc., 2002.

[5] Allen B. Downey; Jeffrey Elkner; Chris Meyers, How to Think Like a Computer Scientist,Green Tea Press, 2005.

[6] David Ascher; Alex Martelli; Ravenscroft, Python Cookbook, O’Reilly, 2005.

[7] Magnus Lie Hetland, Beginning Python: From Novice to Professional, Apress, 2005.

[8] Dave Brueck; Stephen Tanner, Python 2.1 Bible, Hungry Minds, 2001.

[9] Chris Vehily, Python: Visual QuickStart Guide, Peachpit Press, 2001.

[10] Brad Dayley, Python Phrasebook: Essential Code and Commands, Sams, 2006.

83

Page 84: Mario Essert, Domagoj Ševerdija, Ivan Vazler - programiranjeprogramiranje.yolasite.com/resources/glavni_py.pdf · Python - osnove - Odjel za matematiku Sveučilišta Josipa Jurja

Indeks

N-terac, 17

Python, 7

varijabla, 25

84