Professional Documents
Culture Documents
Digitalni udºbenik
Python
- osnove -
Odjel za matematiku
Sadrºaj 3
1 Python interpreter 7
1.1 Jezi£ne zna£ajke . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.2 Izvoenje Python programa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.3 Na² prvi Python program . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2 Tipovi podataka 11
2.1 Brojevi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.2 Nizovi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.2.1 Stringovi - nizovi alfanumeri£kih znakova . . . . . . . . . . . . . . . . . . . . . . 15
2.2.2 N-terac . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.2.3 Lista . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.3 Temeljne operacije i metode s nizovima . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.3.1 Ugraene metode string-ova . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.3.2 Ugraene metode listi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
2.4 Rje£nik . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
2.4.1 Ugraene metode rje£nika . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
2.5 Skup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
4 Programsko upravljanje 35
4.1 Naredba if . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
4.2 Naredba while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
4.3 Naredba for . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
3
4.4 Iteratori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
4.5 Funkcije range i xrange . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
4.6 Saºete liste . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
4.7 Naredba break . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
5 Iznimke 41
5.1 Vrste iznimki . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
5.2 Rad s iznimkama . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
5.3 Obradba iznimki . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
5.3.1 Ignoriranje iznimke . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
5.3.2 Pronalaºenje argumenta iznimke . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
5.3.3 Obradba svih iznimki . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
5.3.4 Pokretanje programskog koda bez prisustva iznimke . . . . . . . . . . . . . . . . 47
5.3.5 Obradba vi²e iznimki . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
5.3.6 Pokretanje obaveznog kôda za £i²¢enje . . . . . . . . . . . . . . . . . . . . . . . . 48
5.3.7 Eksplicitno podizanje iznimke . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
5.4 Korisni£ki denirane iznimke . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
5.4.1 Tvorba iznimki . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
5.4.2 Dijagnosti£ko pridruºivanje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
6 Funkcije 51
6.1 Naredba 'def ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
6.2 Parametri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
6.3 Atributi funkcijskih objekata . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
6.4 Naredba 'return' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
6.5 Poziv funkcije . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
6.5.1 Prijenos argumenata . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
6.5.2 Vrste argumenata . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
6.5.3 Prostor imena . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
6.5.4 Naredba 'global' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
6.6 Ugnjeºene funkcije . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
8 Moduli i paketi 71
8.1 Modul . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
8.1.1 Traºenje modula . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
8.1.2 U£itavanje modula i compilacija . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
8.1.3 Ponovno punjenje modula . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
8.2 Paketi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
9 Ulaz i izlaz 77
9.1 itanje naredbene linije i varijable okoli²a . . . . . . . . . . . . . . . . . . . . . . . . . . 77
9.2 Datoteke . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
9.3 Standardni ulaz, izlaz i pogre²ka (engl. Input, Output, Error) . . . . . . . . . . . . . . . 79
9.4 Naredba print . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
9.5 Otpornost . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
Literatura 83
POGLAVLJE 1
Python interpreter
Python je interpreterski, interaktivni, objektu orjentirani programski jezik, kojeg je 1990. godine prvi
razvio 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 neke
nove revolucionarne zna£ajke u programiranju, ve¢ na optimalan na£in ujedinjuje sve najbolje ideje i
na£ela rada drugih programskih jezika. On je jednostavan i snaºan istodobno. Vi²e nego drugi jezici on
omogu¢uje programeru vi²e razmi²ljanja o problemu nego o jeziku. U neku ruku moºemo ga smatrati
hibridom: nalazi se izmeu tradicionalnih skriptnih jezika (kao ²to su Tcl, Schema i Perl ) i sistemskih
jezika (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 neprotnu upotrebu), open-source software, s izuzetno
dobrom potporom, literaturom i dokumentacijom.
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 u
razvojnom i izvedbenom (engl. runtime ) okoli²u: u prvom se izvodi naredba za naredbom ,
a u drugom odjednom £itava skripta.
ista sintaksa
7
8 Python interpreter
Pro²irivost
Python je pisan u modularnoj C arhitekturi. Zato se moºe lako pro²irivati novi zna£ajkama
ili API-ima. (engl. application programming interface ).
Bogate knjiºnice programa
Pythonova knjiºnica (engl. library ), koja uklju£uje standardnu instalaciju, uklju£uje preko
200 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 index
mnogih Python projekata i razli£itih drugih knjiºnica.
Potpora
Python ima veliku entuzijasti£ku zajednicu korisnika koja se svake godine udvostru£uje.
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.
>>>
$ python
Python 2.5 (r25:51908, Oct 6 2006, 15:24:43)
[GCC 4.1.2 20060928 (prerelease) (Ubuntu 4.1.1-13ubuntu4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>
Interepreter dakle ispisuje svoj prompt >>>, iza kojeg korisnik unosi (utipkava) naredbu, a
koju zavr²a s ENTER tipkom (ili Return tipkom). Zatim Python izvodi tu naredbu, ispisuje
rezultat i ponovo ispisuje prompt o£ekuju¢i novu naredbu:
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. U
Windows okruºenju postoji vi²e gra£kih rje²enja za interaktivan rad. U instalacijskom
paketu s Pythonom dolazi IDLE kojeg je razvio Python-ov autor. IDLE koristi Tkinter
GUI 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 puno
gra£kih rje²enja za jednostavnu Python upotrebu kako u interaktivnom tako i u skriptnom
radu.
Skriptni rad
Programi se spremaju u skripte s pomo¢u obi£nog text editora ili Python orjentiranog gra-
£kog okruºenja, a onda se kao Unix /Linux ili Windows skripte pozivaju iz sistemske linije.
Ako smo na primjer gornju naredbu (ili vi²e njih) spremili u datoteku-skriptu 'moj.py', onda
se pozivom:
python moj.py
skripta izvodi i na zaslonu se dobije rezultat: Znam zbrojiti: 1+2 = 3 jer je kôd skripte
bio isti onaj utipkan u interaktivnom radu.
#include <Python.h>
. . .
Py_Initialize();
PyRun_SimpleString("x = a + 2*pi");
,
from random import randint
gotovo = False ; korak =0
broj = randint (1 , 100)
while not gotovo :
x = int ( raw_input ( " Pogodi zamisljeni broj : " ))
if x == broj :
print ' Cestitamo ! '
gotovo = True ;
elif x < broj :
print ( ' Pucaj navise ! ')
else :
print ( ' Pucaj nanize ! ')
korak +=1
print ' Pogodak iz % d . puta . ' % korak
10 Python interpreter
Prva linija programa uvla£i (engl. import ) iz modula random funkciju randint() s kojom ¢e se
generirati 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. U
varijablu 'broj' sprema se slu£ajni broj (izmeu 1 i 100), kojeg korisnik pogaa. Kako se vidi, postoji
petlja while koju program u izvoenju vrti sve dok varijala gotovo ne postane istinita, tj. True, a
to se dogadja kad zami²ljeni 'broj' bude jednak, od korisnika izabranoj, vrijednosti varijable 'x'. U
slu£aju da to nije ispunjeno, program 'pomaºe' korisniku savjetom da pogaa navi²e ili naniºe. Pritom
se varijabla 'korak' svaki put pove¢ava za 1, kako bi na koncu, nakon £estitke, bilo ispisano i koliko
koraka je trebalo da se do nje doe.
Treba primjetiti kako u Pythonu ne postoje oznake po£etka i konca bloka naredbi (kao ²to su to
viti£aste zagrade u C -jeziku ili begin-end u Pascal -u), nego se to ostvaruje uvlakama. Na taj na£in
korisnik je prisiljen pisati strukturirani kod, lagan za £itanje. Sve upravlja£e naredbe (if, while, else
i sl.) zavr²avaju sa znakom dvoto£ke (':'). Treba takoer uo£iti kako je rad sa ulazom i izlazom u
Pythonu 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 ispisuje
string i/ili sadrºaj varijabli. Mogu¢e je takoer i formatiranje izlaza (zadnja print naredba).
POGLAVLJE 2
Tipovi podataka
Ra£unalni program je algoritam zadan programskim naredbama koje se izvr²avaju nad nekom vrstom ili
tipom podataka. Sve podat£ane vrijednosti u Pythonu predstavljene su objektima,
(binarno spremljenih)
pa se za Python s pravom kaºe: "Sve je objekt ". Svaki objekt moºe imati najvi²e £etiri svojstva:
• tip - veli£ina memorijskog prostora kojeg objekt zauzima i na kojem se stanovite metode (obrade)
mogu tj. smiju obavljati
Identitet i tip objekta su nepromjenljive veli£ine i deniraju se stvaranjem, generiranjem, objekta. Svaki
objekt moºe imati jednu ili vi²e vrijednosti, te jednu ili vi²e metoda. Neki objekti dolaze se Python
interpreterom, zovemo ih ugraeni objekti (engl. built-in objects ), a druge stvara sâm korisnik preko
Python klasa. Vrijednosti objekta £esto se zovu atributi. Dohva¢anje atributa u objektu ostvaruje
se 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 kojima
se vrijednost ne moºe mijenjati bez stvaranja novog objekta istog tipa zovu se nepromjenljivi (engl.
immutable ) objekti. Promjena vrijednosti objekta obi£no se dogaa pridruºivanjem razli£itih literala
ili djelovanjem metode na vrijednost objekta. Literal ozna£uje vrijednost podatka koja se neposredno,
direktno, pojavljuje u programskoj naredbi:
11
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).
Python program pristupa vrijednostima objekata preko njihovih identiteta, tj. njihovih adresnih
referenci. Referenca je broj, adresa memorije, na kojoj je spremljena vrijednost objekta. Vrijednost
objekta £esto se jo² zove atribut objekta. Atributi sloºenih tipova (npr. liste, stringa ili rje£nika) £esto
se jo² zovu £lanovi (engl. items ).
Identitet ili adresna referenca objekta sprema se u memorijsku lokaciju koja se zove varijabla. Varija-
bla moºe pokazivati na spremljeni literal, na isti na£in kao i na objekt koji ima vi²e vrijednosti(sadrºaja
memorijske lokacije) i/ili vi²e metoda. Svaka varijabla sa svojim sadrºajem moºe postojati samostalno,
a moºe biti i ugraena u neki objekt. Dohva¢anje varijable, tj. njezinog sadrºaja iz objekta postiºe se
sa obj.x, gdje je obj ime objekta, a x je ime varijable.
Jedna ili vi²e Python programskih naredbi moºe se spremiti u funkciju. Razlikuju se ugraene (engl.
built-in ) i korisni£ke funkcije. Funkcije, zajedno s podacima, grupiraju se u klase. Funkcije denirane
unutar klasa, zovu se metode. Od klase moºe nastati jedan ili vi²e objekata.
Korisni£ke funkcije denira korisnik, a ugraene dolaze s Python interpreterom. Dakako, i funkcija je
objekt. Ona se moºe postojati samostalno, a moºe biti ugraena unutar onekog drugog objekta. Metoda
Tipovi podataka 13
se iz klase/objekta dohva¢a sa obj.fun(), gdje je klasa/obj ime objekta, a fun() je ime funkcije. Unutar
okruglih zagrada mogu se pozvati argumenti, odnosno parametri funkcije. Funkcija moºe imati ulazne
argumente i vra¢ati izlazne vrijednosti.
Na primjer, provjera tipa nekog objekta ostvaruje se pozivom ugraene funkcije type():
>>> type("Zanimljivi Python svijet!") # string literal
<type 'str'>
>>> type(512) # numeri£ki 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 se
spremati 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 # u£itavaju 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 na
strukturirane tipove podataka (liste, stringove i sl.). Indeksacija po£inje s nultim (0) indeksom.
>>> a=123
>>> id(a)
3695888
>>> b=a # pridruºba b sa a; objekt se ne kopira, samo adresa
>>> b
123
>>> id(b) # b kao i a pokazuje na istu memorijsku adresu
3695888
>>> a=a+1 # stvoren je novi objekt
>>> print 'a=',a,' b=',b
a= 124 b= 123
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 ili funkcije print:
2.1 Brojevi
Ugraeni brojevni objekti u Pythonu podrºavaju cijele brojeve (obi£ne i duga£ke), brojeve s pomi£nim
zarezom (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 novi
brojevni objekt.
>>> a=1234
>>> id(a)
19431452
>>> a=a+0
>>> id(a)
18681652
>>> print a
1234
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 odreen s po£etnom
0 iza koje ide niz oktetnih znamenki (0 do 7). Na sli£an na£in heksadecimalni literal koristi po£etni niz
0x nakon £ega slijedi niz heksadecimalnih znamenki (0 do 9 i A do F bilo velikim ili malim slovom).
Na, primjer:
Bilo kojem literalu cijelog broja moºe moºe se dodati slovo 'L' ili 'l' kako bi se ozna£io duga£ki cijeli
broj ( long integer ). Na primjer:
2.2. Nizovi 15
Razlika izmeu duga£kog i obi£nog cijelog broja je u tome ²to duga£ki cijeli broj nema predodreenu
numeri£ku granicu; moºe biti toliko dug koliko ra£unalo ima memorije. Obi£an cijeli broj uzima nekoliko
okteta memorije i ima minimalnu i maksimalnu vrijednost koju diktira arhitektura stroja. sys.maxinit
je najve¢i dostupni obi£an cijeli broj, dok je sys.maxinit-1 najve¢i negativni.
Realni literal (broj s pomi£nim zarezom) predstavljen je nizom decimalnih znamenki koje uklju£uju
decimalni zarez, tj. to£ku (.), exponent ( e ili E, te + ili - iza, s jednom ili vi²e znamenki na kraju), ili
oboje. Vode¢i znak decimalnog literala ne smije biti e ili E, a moºe biti bilo koja znamenka ili to£ka
(.). Na primjer:
Znak J (ili j ) na kraju literala ozna£uje kvadratni korijen od -1, ²to je uobi£ajena oznaka imaginarnog
dijela u elektrotehni£koj praksi (neke druge discipline koriste znak 'i' u tu svrhu, ali Python je izabrao
ba² znak j).
Treba primijetiti da brojevni literali ne uklju£uju predznak: ako postoji + ili - ispred broja, onda
su to posebni operatori.
x=input('Upi²ite prvi prirodni broj: ') y=input('Upi²ite drugi prirodni broj: ')
print "1) print "2)
> 1) 12 : 15 = 0 i ostatak 12 2) 12 : 15 = 0.800000 >
2.2 Nizovi
Niz je spremnik (engl. container ) £lanova (engl. items) koji se indeksiraju ili dohva¢aju ne-negativnim
cijelim brojevima. Python pruºa tri ugraene (engl. built-in ) vrste nizova za stringove (obi£ne i Uni-
code), n-terace, i liste. Knjiºni£ki i ekstenzijski moduli pruºaju druge vrste nizova, a korisnik takoer
moºe sam napisati svoje. Nizovi se mogu obraivati na vi²e na£ina.
\'
za jednostruki ili
\"
za dvostruki navodnik):
"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 se
takav niz ºeli programom ispisivati:
"Ovo je prva, \n
a ovo druga linija istog stringa"
Drugi pristup je uporaba stringa s trostrukim navodnicima, koji se dobiju trostrukim ponavljanjem
jednostrukih ( ') ili dvostrukih navodnika (""").
U ovakvom literalu stringa s tri navodnika, automatski su sa£uvani novi redovi, pa se njihovi kontrolni
znakovi 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;)
Unicode je novi standard za pisanje znakova. Za razliku od ASCII standarda, novi standard uklju£uje
sve znakove iz gotovo svih svjetskih jezika. Unicode literalni string ima istu sintaksu kao obi£ni literalni
string uz dodatak znaka 'u' ili 'U' koji se pi²e odmah ispred po£etnog navodnika. Unicode literalni nizovi
znakova mogu koristiti '\u' iza kojeg slijede £etiri heksadecimalne znamenke koje opisuju Unicode znak.
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 denira nabrajanjem objekata odvojenih zarezima (,). Zadnjem £lanu u nizu takodjer se moºe
dodati 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ºdeni
n-terci.
2.2.3 Lista
Lista, listina ili popis je promjenljiv poredani niz £lanova objekata. £lanovi u listi su bilo kakvi objekti
razli£itih tipova. Lista se denira nabrajanjem £lanova odijeljenih zarezima (,) i smje²tenih unutar
uglatih zagrada ([ ]). Dopu²teno je iza zadnjeg £lana liste, ostaviti jo² jedan zarez. Prazna lista se
ozna£ava praznim parom uglatih zagrada. Evo nekih primjera:
18 Tipovi podataka
>>> a='ovo'
>>> b='je'
>>> c='lista'
>>> d=[a,b,c] # tvorba liste nabrajanjem £lanova
>>> print d
['ovo', 'je', 'lista']
>>> list(d) # tvorba liste pozivom funkcije
['ovo', 'je', 'lista']
>>> list(a) # tvorba liste pozivom funkcije
['o', 'v', 'o']
>>> type(d)
<type 'list'>
>>> type(a)
<type 'str'>
Treba primjetiti kako se tvorba listi preko list() funkcije uvijek realizira nad pripadnim tipom objekta.
£lan Opis
s[i] Vra¢a element i u nizu s
s[i:j] Vra¢a kri²ku - niz elemenata od i-tog do j-tog indeksa
len(s) Vra¢a broj elemenata u s
min(s) Vra¢a minimalni elemenat iz s
max(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
2.3. Temeljne operacije i metode s nizovima 19
£lan Opis
s[i] = v Pridruºba £lanu na i-tom mjestu
s[i:j] = t Pridruºba skupini £lanova
del s[i] Brisanje £lana
del s[i:j] Brisanje skupine £lanova
Metoda Opis
s.capitalize() Pretvara svako slovo od s u veliko slovo.
s.center(width) Centrira string u polju duljine width.
20 Tipovi podataka
Metoda Opis
s.count(sub[,start
Broji pojavljivanja podstringa sub u stringu s.
[,end]])
s.encode([encoding
Vra¢a kodiranu ina£icu stringa.
[,errors]])
s.endswith(suffix
Provjerava kraj stringa za sux.
[,start[,end ]])
s.expandtabs([tabsize]) Pro²iruje tabulatore praznim mjestima.
Pronalazi prvo pojavljivanje zadanog
s.find(sub[,start[,end]])
podstringa sub.
Pronalazi prvo pojavljivanje zadanog
s.index(sub[,start[,end]]) podstringa sub uz podizanje izuzetka, ako ga
nema.
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.
Provjerava jesu li svi znakovi pisani malim
s.islower()
slovima.
s.isspace() Provjerava jesu li svi znakovi praznine.
Provjerava jeli string pisan kao naslov (prvo
s.istitle()
slovo svake rije£i napisano velikim slovom).
Provjerava jesu li svi znakovi pisani velikim
s.isupper()
slovima.
Povezuje stringove u listi t koriste¢i s kao
s.join(t )
mea².
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
Zamjenjuje podstring old sa new.
[,maxreplace ])
s.rfind(sub[,start[,end]]) Nalazi zadnji pojavak podstringa sub.
Nalazi zadnji pojavak podstringa sub ili javlja
s.rindex(sub[,start[,end]])
izuzetak
s.rjust(width) Desno poravnanje s u stringu duljine width.
s.rstrip() Odstranjuje prazna mjesta iza stringa.
Dijeli string koriste¢i sep kao mea².
s.split([sep[,maxsplit]]) maxsplit je nave¢i broj dijeljenja koji ¢e se
izvr²iti.
Dijeli string u listu linija. Ako je keepends
s.splitlines([keepends]) jednak 1, £uvaju se kontrolni znakovi novih
redaka.
s.startswith(prefix
Provjerava da li string zapo£inje s prefix-om
[,start [,end ]])
Odstranjuje prazna mjesta i ispred i iza
s.strip()
stringa.
2.3. Temeljne operacije i metode s nizovima 21
Metoda Opis
Vra¢a velika slova za string malih slova i
s.swapcase()
obratno.
s.title() Vra¢a verziju stringa kao naslova.
s.translate(table Mijenja string koriste¢i transformacijsku
[,deletechars ]) tablicu znakova.
s.upper() Vra¢a string pretvoren u velika slova.
Primjer 2.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 znakove nakon prvog.
, ,
>>> s1 = " Moj san "
>>> s2 = ' Tv ' + s1 [1:]
>>> print s2 Tvoj san
>>>
Primjer 2.2 Modul 'string' sadrºi mnogo funkcija. Funkcija 'nd' pronalazi podstring u zadanom
stringu. Vra¢a poziciju naenog podstringa
, ,
>>> import string
>>> riba = " zubatac "
>>> index = string . find ( riba , " t " )
>>> print index 4
>>>
>>> string . find ( " abrakadabra " , " ra " )
>>> string . find ( " abrakadabra " , " ra " ,4)
>>> 2
9
Metoda Opis
li.append(x) Dodaje novi element x na kraj liste li.
li.extend(t) Dodaje novu listu t na kraj liste li.
li.count(x) Broji pojavke od x u listi li.
li.index(x) Vra¢a najmanji i za koji je s[i] == x .
li.insert(i,x) Ume¢e x na indeksu i .
22 Tipovi podataka
Metoda Opis
Vra¢a element i i bri²e ga iz liste. Ako se i
li.pop([i])
izostavi, 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.
Sortira (slaºe) £lanove liste li na mjestu.
li.sort([cmpfunc ])
cmpfunc() je funkcija za usporedbu.
, ,
>>> matrica = [[1 , 2 , 3] , [2 , 3 , 1]]
>>> matrica [1] [2 , 3 , 1]
>>> matrica [0][2] 3
2.4 Rje£nik
Preslikavanje (engl. mapping ) je skup objekata indeksiranih s pomo¢u gotovo slobodnih vrijednosti
koje se zovu klju£evi (engl. keys ). Tako nastali objekti su promjenljivi, a za razliku od nizova, nisu
poredani.
Python nudi jednu vrstu preslikavanja, rje£nik (engl. dictionary ). Knjiºni£ki i ekstenzijski moduli
pruºaju jo² vrsta preslikavanja, a druge moºe na£initi korisnik sâm. Klju£evi u rje£niku mogu biti
razli£itih tipova, ali moraju biti jednozna£ni (engl. hashable ). Vrijednosti u rje£niku su takoer objekti
i to mogu biti razli£itih tipova. £lan u rje£niku je par kju£/vrijednost (engl. key/value ). O rje£niku se
moºe razmi²ljati kao o asocijativnom polju.
Eksplicitno stvaranje rje£nika provodi se nizom parova klju£:vrijednost odvojenih zarezima, koji se
smje²taju unutar viti£astih zagrada. Dopu²ten je i zarez nakon zadnjeg £lana. Ako se klju£ pojavljuje
vi²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 praznih
viti£astih zagrada. Evo nekih rje£nika:
>>> 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 u
popisu (argumentima funkcije dict), samo ¢e se posljednji £lan s tim kju£em zadrºati u rezultiraju¢em
rje£niku.
£lan/metoda Opis
di[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 nae; ina£e vra¢a v .
Vra¢a di[k] ako nae; vra¢a v i postavlja
di.setdefault(k[, v])
di[k]=v .
Vra¢a slu£ajne (key ,value) parove kao
di.popitem()
n-terce iz di.
2.5 Skup
Od Python ver. 2.4, postoji ugraeni tip (iako takoer postoji i modul s imenom 'sets') s dvije varijante
- obi£an i zamrznuti skup. Skup je neporedan niz jedincatih (neponavljaju¢ih) elemenata. Elementi
moraju biti jednozna£ni, engl. hashable. Zamrznuti skupovi su jednozna£ni, pa mogu biti elementi
drugih skupova, dok obi£ni skupovi to ne mogu biti.
Operacija Rezultat
[koristi se za ugraene tipove] tvorba obi£nih
set/frozenset
ili zamrznutih skupova iz iterabilnog niza, npr.
([iterabilno=None])
set([5,2,7]), set("zdravo")
[koristi se za set modul] tvorba obi£nih ili
Set/ImmutableSet
nepromjenljivih skupova iz iterabilnog niza,
([iterabilno=None])
npr. Set([5,2,7])
len(s kardinalni broj skupa s
Istinito ako element elem pripada / ne pripada
elem in s / not in s
skupu s
for elem ins: process
Iterira na elementima skupa s
elem...
s1.issubset(s2) s1 u s2
Istinito ako je svaki element u
s1.issuperset(s2) s2 u s1
Istinito ako je svaki element u
s.add(elem) Dodaje element elem u skup s
Bri²e element elem u skupu s. Podiºe
s.remove(elem))
KeyError iznimku ako se element ne pronae
24 Tipovi podataka
Operacija Rezultat
Bri²e sve elemente iz skupa s (ne vrijedi za
s.clear()
nepromjenljive skupove!)
s1.intersection(s2) ili Vra¢a novi skup s elementima zajedni£kim u
s1&s2 s1 i s2
Vra¢a novi skup s elementima koji su i u s1 i
s1.union(s2) ili s1|s2
u s2.
s1.symmetric_difference(s2) Vra¢a novi skup s elementima koji su ili u
ili sl∧s2 s1,ili u s2, ali ne na oba mjesta
s.copy() Vra¢a kopiju skupa s
Dodaje sve vrijednosti iz iterabilnog niza u
s.update(iterabilni niz
skup s
POGLAVLJE 3
Izrazi, operatori i operacije
3.1 Varijable
Python pristupa podacima s pomo¢u referenci. Jedna takva referenca je varijabla, tj. imenovani prostor
u memoriji koji £uva adresu nekog objekta ili literala. Referenca takoer postoji i na atribut (vrijednost)
nekog objekta. Varijabla ili druga vrsta reference nemaju svoj vlastiti tip, za razliku od podatka na
kojeg pokazuju, kojeg referenciraju tj. £iju adresu pohranjuju. Budu¢i da je adresa jedinstvena u
smislu broja okteta, svaka referenca moºe povezati objekte razli£itih tipova, ²to zna£i da je dinami£na,
da se moºe mijenjati prilikom izvr²enja programa. U jednom trenutku varijabla moºe pokazivati na
cjelobrojni podatak, a ve¢ u sljede¢em na realni, kompleksni ili neki sloºeni tip.
U Pythonu nema deklaracija. Postojanje varijable ovisi o naredbi koja povezuje (eng. binding )
varijablu i podatak; drugim rije£ima, naredbi koja imenuje neki objekt, bilo kojeg tipa. Mogu¢e je
odvezati (eng. unbinding ) varijablu resetiranjem njenog imena, tako da vi²e ne sadrºi referencu na taj
objekt. 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. Odvezani objekti
sami ¢e nestati iz memorije. Za to se brine poseban Python modul, ugraen u interpreter. Takvo
automatsko £i²¢enje objekata bez referenci zove se sakupljanje sme¢a (engl. garbage collecting).
Varijabla se moºe imenovati bilo kojim identikatorom, osim onih 30 koji su rezervirani kao Python
klju£ne rije£i. Pritom identikator ima i neka svoja pravila: ne smije imati zabranjene simbole u sebi,
ne smije po£injati brojem i sl. Varijabla moºe biti globalna ili lokalna. Globalna varijabla je dohvatljiva
s vi²e razina, a lokalna uglavnom u funkciji u kojoj se koristi.
25
26 Izrazi, operatori i operacije
(engl. exception ) je na£in na koji Python rje²ava pogre²ke bilo kojeg tipa. Ako se na primjer, re-
povezivanjem varijable s aritmeti£kim sadrºajem dogodi dijeljenje s nulom, Python ¢e podi¢i iznimku
ZeroDivisionError. Pythen dakako, ima ugraene naredbe za dohva¢anje i obrade iznimki.
cilj = izraz
Cilj ili odredi²te (engl. target ) je poznat kao lijeve strana pridruºbe, a izraz (engl. expression ) je
desna strana. Izraz moºe biti obi£na varijabla ili vi²e varijabli povezanih operatorima, poziv funkcije ili
mno²tvo drugih kombinacija s meusobno povezanim objektima. Kad se naredba pridruºbe izvr²ava,
Python izra£unava izraz desne strane, te povezuje vrijednost izraza s ciljem na lijevoj strani. Ovo
povezivanje ne ovisi o tipu izra£unate vrijednosti desne strane, jer se pridruºba ionako dogaa na
razini referenca, adresa objekata, a ne njihova sadrºaja. Cilj moºe biti varijabla /identikator, atribut,
indeksirani £lan niza ili kri²ka slicing ) .
(engl.
Detalji povezivanja ovise o vrsti ili tipu cilja:
• Identikator je ime varijable: pridruºba na identikator povezuje sadrºaj varijable s tim imenom,
upisom adrese pod ime identikatora.
• Referenca atributa ima sintaksu obj.name. Pritom je obj identikator koji ozna£ava objekt, a
name atributivno ime objekta. Pridruºba na referencu atributa traºi da objekt obj poveºe svoj
atribut zvan name s izra£unatom ili pozvanom vrijedno²¢u desne strane.
• Indeksiranje ima sintaksu obj[expr]. Pritom je obj objekt, a expr je izraz koji indeksira mjesto
u nizu. Objekt moºe biti bilo kojeg tipa. Pridruºba na indeksiranje traºi da spremnik obj poveºe
svoj £lan koji je izabran pomo¢u vrijednosti expr, takoer poznate i kao indeksni klju£ £lana s
izra£unatom ili pozvanom vrijedno²¢u desne strane.
U jednostavnoj pridruºbi moºe biti vi²e ciljeva i znakova jednakosti (=). Na primjer:
a = b = c = 0
povezuje varijable a, b, i c s vrijednosti 0. Svaki cilj se povezuje s jednim objektom koji vra¢a izraz,
isto kao kad bi se nekoliko jednostavnih naredbi izvr²avale jedna za drugom.
Cilj u jednostavnoj pridruºbi moºe imati dvije ili vi²e referenci odvojenih zarezima, proizvoljno
ograenih 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 s
to£nim brojem £lanova koliko ima i referenci u cilju, jer se ina£e podigne iznimka. Svaka referenca u
cilju je jednozna£no povezana s odgovaraju¢im £lanom u nizu. Raspakiravaju¢a pridruºba takoer moºe
izmjenjivati reference. Na primjer:
a, b = b, a
3.2. Naredbe pridruºivanja 27
Primjer 3.1 Program ra£una n-ti Fibonnaccijev broj za une²eni prirodni broj n.
,
% ovdje dolazi izvorni kod Matlab programa
Operacija Ekvivalentno sa
x+ = y x=x+y
x− = y x=x−y
x∗ = y x=x∗y
x/ = y x = x/y
x∗∗=y x = x ∗ ∗y
x% = y x = x%y
x& = y x = x&y
x| = y x = x|y
x∧ = y x=x∧y
x >>= y x = x >> y
x <<= y x = x << y
naredba del specicira zahtjev objektu da odveºe neke (ili sve) svoje atribute ili £lanove. Objekt
moºe odbiti odvezati neke (ili sve) atribute ili £lanove, podiºu¢i iznimku ako se poku²ava nedopu²teno
odvezivanje. Odvezivanje (ili brisanje) kri²ke obi£no ima jednak u£inak kao pridruºba praznog niza toj
kri²ki.
Operator Opis A
'izraz,...' String pretvorba NA
key:izraz,... Stvaranje rje£nika NA
[izraz,...] Stvaranje liste NA
Stvaranje n-terca ili
(izrazr,...) NA
jednostavne zagrade
f(izraz,...) Poziv funkcije L
x[index1:index2] Kri²ka (slicing) L
x[index] Indeksiranje (indexing) L
x.attr Referenca atributa L
x**y Eksponent (x na y potenciju) D
x Bitwise NE (NOT) NA
+x, -x Unarni plus ili minus NA
Mnoºenje, dijeljenje, dijeljenje
x*y, x/y, x//y, x%y L
na cijeli broj, ostatak
3.3. Operatori i operacije 29
Operator Opis A
x+y, x-y Zbajanje, oduzimanje L
xy, xy Lijevi pomak, desni pomak L
x&y Bitwise I (AND) L
x∧y Bitwise eksluzivni ILI (XOR) L
x|y Bitwise ILI (OR) L
x < y, x <= y, x > y, x >=
Usporedbe NA
y, x <> y, x! = y, x == y
x is y, x is not y Provjera identiteta NA
x in y, x not in y Provjera £lanstva NA
not x Bool-ov NE (NOT) NA
x and y Bool-ov I (AND) L
x or y Bool-ov ILI (OR) L
Anonimna jednostavna
lambda arg,...: izraz NA
funkcija
Operatori usporedbe mogu se nizati, £ime se implicira logi£na I (and) funkcija. Na primjer:
Oblik prvog niza je mnogo £itljiviji, a provjerava svaki podizraz samo jednom.
Operacija Opis
x+y Zbrajanje
x−y Oduzimanje
x∗y Mnoºenje
x/y Dijeljenje
x ∗ ∗y Potenciranje (x ∧ y)
x%y Modulo funkcija (x mod y )
−x Unarni minus
+x Unarni plus
Ugraena divmod funkcija uzima dva argumenta i vra¢a par £iji su £lanovi kvocijent i ostatak, ²to je
jednostavnije nego koristiti operator // za cjelobrojno dijeljenje i % za ostatak (tablica 3.4). Ugraena
pow(a,b) funkcija vra¢a isti rezultat kao i a**b. Poziv funkcije pow() s tri argumenta, pow(a,b,c)
vra¢a isti rezultat kao i (a**b)%c, ali brºe.
Funkcija Opis
abs(x) Apsolutna vrijednost
divmod(x,y) Vra¢a (int(x / y ), x % y )
pow(x,y [,modulo]) Vra¢a (x ∗ ∗y)x%modulo
Zaokruºuje na najbliºi vi²ekratnik od 10−n
round(x,[n])
(samo za za realne brojeve)
3.3.3 Usporedba
Svi objekti, uklju£uju¢i brojeve, mogu se usporeivati s obzirom na jednakost (==) i nejednakost (!=).
Usporedbe koje zahtijevaju poredak (<, <=, >, >=) mogu se koristiti izmeu bilo koja dva broja osim
kompleksnih. Svi takvi operatori vra¢aju Bool-ove vrijednosti (True ili False). Operatori usporedbe
(tzv. odnosni operatori ) prikazani su u tablici 3.5.
Operator Opis
x < y Manje nego
x > y Ve¢e nego
x == y Jednako
x != y Nije jednako (isto kao <>)
x >= y Ve¢e nego ili jednako
x <= y Manje nego ili jednako
Operacija Opis
x 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 i
EX-ILI).
ne i vi²e. Indeks n moºe takoer biti -1, -2,..., sve do -L (isklju£no), ali ne i manji. Negativni n
ozna£ava iste £lanove u S kao ²to £ini L+n. Drugim rije£ima, S[-1] je posljednji element od S, S[-2] je
pretposljednji, itd. Na primjer:
x = [1,2,3,4]
x[1] # 2
x[-1] # 4
Kori²tenje indeksa ve¢eg ili jednakog duljini niza L ili manjeg od -L, podiºe (izaziva) iznimku.
Pridruºba £lanu niza s nepostoje¢im indeksom ima isti u£inak.
x = [1, 2, 3, 4]
x[1:3] # [2, 3] - ne zaboraviti da prvi £lan niza ima indeks jednak 0
x[1:] # [2, 3, 4]
x[:2] # [1, 2]
Kri²ka takoer moºe koristiti pro²irenu sintaksu S[i,j,k], gdje je k - korak indeksa.
Liste mogu mijenjati svoje £lanove pridruºbom izraza indeksiranom £lanu. Na primjer:
x = [1, 2, 3, 4]
x[1] = 42 # x je sada [1, 42, 3, 4]
Drugi na£in promjene objekata liste li je kori²tenjem kri²ke od likao cilja (lijeva strana) uz naredbu
pridruºbe desne strane. Desna strana pritom takoer mora biti lista. Kri²ka s lijeve strane i lista s
desne mogu biti bilo koje duljine, ²to zna£i da pridruºivanje kri²ke moºe dodavati £lanove liste ili ih
brisati. Na primjer:
x = [1, 2, 3, 4]
x[1:3] = [22, 23, 44] # x je sada [1, 22, 33, 44, 4]
x[1:4] = [2, 3] # x se vratio na [1, 2, 3, 4]
Evo nekih vaºnih posebnih slu£ajeva:
• Koriste¢i praznu listu [ ] kao izraz s desne strane, bri²e se ciljna kri²ka iz liste li s lijeve strane.
Drugim rije£ima, li[i:j] = [ ] ima isti u£inak kao i del li[i:j].
• Koriste¢i praznu kri²ku liste li kao cilj s lijeve strane pridruºbe ubacuju se £lanovi liste s desne
strane na primjerenu poziciju u li. Drugim rije£ima, li[i:i] = ['a','b'] ubacuje £lanove 'a'
i 'b' nakon £lana i u listi li.
• Koriste¢i kri²ku koja pokriva cijeli objekt liste li[:], kao cilj s lijeve strane, potpuno se zamjenjuje
sadrºaj liste li.
£lan ili dio (kri²ka) liste moºe se izbrisati naredbom del. Na primjer:
x = [1, 2, 3, 4, 5]
del x[1] # x je sada [1, 3, 4, 5]
del x[1:3] # x je sada [1, 5]
3.5. Naredba Print 33
Za liste su denirane stacionarne ( in-line ) verzije operatora + i *, koji se koriste u pro²irenim naredbama
pridruºbe. Pro²irena naredba pridruºbe li +=li_1 ima u£inak dodavanja £lana iz liste li_1 na kraj
liste li, dok li *= n ima u£inak dodavanja n broja kopija liste li na kraj li.
Metoda popitem() moºe se koristiti za destruktivnu iteraciju rje£nika, tj. iterativnim dohva¢anjem
£lana bri²e se njegov klju£ i vrijednost u rje£niku. Pritom i item() i popitem() vra¢aju rje£ni£ke £lanove
kao parove klju£/vrijednost, ali kori²tenje funkcije popitem() upotrebljava manju koli£inu memorije.
U²tede na kori²tenju memorije £ine tu metodu korisnom za petlju po dugom rje£niku.
U 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.
Naredba za ispis ozna£ava se s klju£nom rije£i print nakon koje slijedi niti jedan ili vi²e izraza odvojenih
zarezima. Print je prakti£an i jednostavan na£in ispisivanja vrijednosti u tekstovnom obliku. Print
ispisuje na zaslon ra£unala svaki izraz x kao niz znakova ²to je isto kao kad bi se prethodno pozvala
funkcija str(x) koja bi ekslicitno tip podatka, npr. broja pretvorila u string. Print implicitno izbacuje
razmak izmeu izraza, i takoer implicitno uklju£uje novi red (\n) nakon posljednjeg izraza, osim u
slu£aju kad iza posljednjeg izraza slijedi zarez. Evo nekih primjera naredbe print:
slovo = 'c'
print "daj mi ", slovo, "..." # ispisuje: daj mi c ...
odgovor = 100
print "Odgovor je:", odgovor # ispisuje: Odgovor je:100
Odredi²te izlaza naredbe print je datoteka ili objekt sli£an datoteci koji ima vrijednost stdout
atributa u sys modulu. Obi£no je stdout pridruºen zaslonu ra£unala, ali se isto tako moºe pridruºiti
drugom objektu ili izlaznoj napravi. Format ispisa moºe se preciznije kontrolirati uporabom operatora
% ili drugim tehnikama obradbe nizova znakova.
Takoer je mogu¢e koristiti write ili writelines metode datote£nih objekata. U Python ver. 3.0
nadalje, print naredba postaje funkcija print() s pripadnim argumentima za ispis.
,
% ovdje dolazi izvorni kod Matlab programa
# formatiranje ispisa
i = 123
j = 99
y = 123.45678912345
Programsko upravljanje tokom izvoenja 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 meusobno povezanih uvjeta. Pythonova kombinirana
naredba if, koja koristi pro²irenja elif ili else zaklju£ak, sluºi za takvo uvjetno izvr²avanje naredbi.
Sintaksa izgleda ovako:
if uvjet(i):
naredba(e)
elif uvjet(i):
naredba(e)
elif uvjet(i):
naredba(e)
...
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, onda se izvode naredbe iza 'else' dijela, ako on postoji.
Treba primjetiti kako, za razliku od nekih jezika, Python nema naredbu switch, pa se moraju
koristiti if, elif ili else za sve uvjetne obrade. Evo tipi£ne naredbe if:
Kada u 'ako' ili 'ina£e' odlomku ima vi²e naredbi (tj. programsko grananje se odnosi na £itav blok
naredbi), naredbe se pi²u na zasebnim linijama koje su uvu£ene, pomaknute udesno od linije po£etka.
Blok naredbi zavr²ava kada se pozicioniranje linije vrati na ono od po£etka odlomka (ili jo² vi²e ulijevo
od toga). Kada postoji samo jedna jednostavna naredba, kao u gornjem primjeru, onda se ona pi²e na
35
36 Programsko upravljanje
istoj naredbenoj liniji neposredno iza dvoto£ja (':') kojim se zavr²ava jedan ili vi²e uvjetnih ispitivanja.
Dakako, mogu¢e je isto napisati i u idu¢em retku, ali se onda mora koristiti uvlaka. Mnogi koji rade u
Pythonu smatraju stil odvojenih linija £itljivijim od onog u drugim programskim jezicima:
if x < 0
print "x je negativan"
elif x % 2:
print "x je pozitivan i neparan"
else:
print "x is paran i ne-negativan"
Za uvjet u if ili elif odlomku moºe se koristiti bilo koji Python-ov izraz. Pritom se vrijednost
izraza promatra u Bool-ovom kontekstu, gdje se svaka vrijednost uzima kao istinita, ili neistinita. Svaki
broj koji nije nula ili niz znakova koji nije prazan, isto kao i n-terac, lista ili rje£nik, izra£unava se
kao istinito (True). Nula (bilo kojeg brojevnog tipa), None i prazni stringovi, n-terci, liste i rje£nici,
izra£unavaju se kao neistina (False). Kada se pak ºeli ispitati vrijednost x-a u Bool-ovom kontekstu,
preporu£uje se sljede¢i stil kodiranja:
if x:
To je naj£i²¢i i ' naj_Python -skiji' oblik. To je elegantnije i ljep²e nego koristiti konstrukcije kao:
if x is True:
if x == True:
if bool(x) :
ili sli£no.
Postoji osnovna razlika izmeu 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 kao istinit " (²to zna£i da izraz vra¢a bilo kakav
rezultat koji je istinit, razli£it od nule ili praznog, u Bool -ovom kontekstu). Kad se ispituje neki izraz u
upravlja£koj naredbi, onda se razmi²lja o ovom drugom uvjetu, a ne prvom. Ako se izraz za if odlomak
izra£una kao istinit, naredbe koje slijede if odlomak ¢e se izvr²iti i cijela naredba if zavr²ava. Ako
se izraz za if odlomak izra£una kao neistinit, onda se izvr²avaju izrazi za idu¢e elif odlomke, ako su
njihovi uvjeti ispunjeni. Za prvu elseif klauzulu za koju je uvjet istinit, izvr²avaju se sve narede koje
je slijede i £itava naredba if time zavr²ava. U protivnom, ako niti jedan elif odlomak nije izvr²en, jer
uvjeti nisu bili zadovoljeni, onda se izvr²avaju naredbe odlomka else, dakako, ako on postoji.
while izraz:
naredba(e)
count = 0
while x > 0:
x = x // 2 # cjelobrojno dijeljenje
count += 1
print "Aproksimacija log2 je", count
4.3. Naredba for 37
Prvo se izra£una izraz poznat kao uvjet petlje (eng. loop condition ). Ako uvjet nije istinit ( false ),
naredba while zavr²ava i niti jedna od naredbi u tijelu petlje se ne izvr²ava. Ako je pak uvjet petlje
zadovoljen, naredba ili naredbe od kojih se sastoji tijela petlje se izvr²avaju. Kada tijelo petlje zavr²i s
izvr²avanjem, uvjet se ponovno izra£unava, da se vidi treba li se izvr²iti nova iteracija. Ovaj se proces
nastavlja sve dok uvjet petlje ne postane neistinit, nakon £ega while naredba zavr²ava. Tijelo petlje
treba sadrºavati kôd koji ¢e u nekom trenutku u£initi petljin uvjet laºnim, ili petlja nikada ne¢e zavr²iti,
osim ako se ne podigne iznimka ili tijelo petlje ne izvr²i naredbu break. Petlja koja je napisana u tijelu
funkcije takoer zavr²ava ako se naredba return izvr²i unutar tijela petlje, jer u tom slu£aju cijela
funkcija zavr²ava.
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 samo
jedna 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 ugraenoj
funkciji iter, koja vra¢a iteratorski objekt. Cilj pridruºbe iteracijske varijable je obi£no identikator
koji imenuje varijablu petlje, a naredba for slijedno re-povezuje ovu varijablu na svaki £lan po redu
unutar iteratora. Naredba ili naredbe od kojih se sastoji tijelo petlje izvr²avaju se jedna po jedna
za svaki £lan unutar iteratora (osim ako petlja zavr²i uslijed podizanja iznimke ili izvr²enja naredbe
break ili return). Cilj s vi²e identikatora je takoer dopu²ten, kao kad se radi o pridruºbi prilikom
raspakiravanja. U tom slu£aju, iteratorovi £lanovi moraju biti nizovi, svaki iste duljine jednake broju
identikatora unutar cilja. Na primjer, ako je d rje£nik, ovo je uobi£ajeni na£in dohva¢anja £lana u
rje£niku d:
for key, value in d.items():
# dohvatiti samo istinite (pune) kljuceve i vrijednosti
if not key or not value: del d[key]
38 Programsko upravljanje
Metoda items() vra¢a popis parova klju£/vrijednost, pa stoga for petlja koristi dva identikatora
u cilju da se svaki £lan razpakira u par klju£/vrijednost. Ako iterator sadrºi promjenljiv objekt unutar
samoga sebe, onda se taj objekt ne smije mijenjati dok se for petlja obavlja. Na primjer, predhodni
primjer ne moºe koristiti iteritems() items. Naime, iteritems() vra¢a iterator £iji je
umjesto
sadrºani objekt d, pa tijelo petlje ne moºe mijenjati d (sa del d[key]). S druge strane, items() vra¢a
listu, 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 £lan
u iteratoru sa sljede¢om iteracijom petlje. Tijelo petlje uop¢e se ne izvr²ava ako iterator ne oslobaa
nikakve £lanove. U tom slu£aju, upravlja£ka varijabla se ne povezuje ili odvezuje na niti jedan na£in
pomo¢u naredbe for. Meutim, ako iterator oslobaa barem jedan £lan, kad se naredba petlje zavr²i,
upravlja£ka varijabla ostaje povezana na posljednju vrijednost na koju ju je naredba petlje povezala.
Zato je sljede¢i kôd ispravan, dok god neki-niz nije prazan.
for x in neki-niz:
obradi(x)
print "Posljednji obradjeni £lan je: ", x
4.4 Iteratori
Metode items(), keys() i values() vra¢aju njihove rezultantne liste bilo kojim redoslijedom. Ako
se pozove vi²e od jedne od ovih metoda bez bilo kakve izmjene na rje£niku, redoslijed rezultata je
identi£an za sve. Metode iteritems(), iterkeys()i itervalues(), koje su uvedene u Pythonu od
ina£ice 2.2, vra¢aju iteratore ekvivalentne tim listama. Iterator zauzima manje memorije od liste, ali
nije dozvoljena promjena rje£nika dok se iterira na jednom od njegovih iteratora. Iteriranje na listi
vra¢enoj sa items(), keys() ili values() dolazi bez takvih restrikcija. Iteriranje direktno na rje£niku
D je isto kao iteriranje na D.iterkeys().
Metoda Opis
Vra¢a iterator za sve £lanove (key/value
D.iteritems( )
parove) u D
D.iterkeys( ) Vra¢a iterator za sve klju£eve u D
D.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. Naredba
i.next() vra¢a sljede¢i £lan iteratora i ili, kada iterator i vi²e nema £lanova, podiºeStopIteration
iznimku. Ve¢ina je iteratora izgraena eksplicitnim ili implicitnim pozivima ugraene funkcije iter.
Naredba for implicitno poziva iter da bi dobila iterator. Sljede¢a naredba:
for x in clanovi:
naredba(e)
je ekvivalentna s:
_temporary_iterator = iter(clanovi)
while True:
try: x = _temporary_iterator.next ( )
except StopIteration: break
naredba(e)
4.5. Funkcije range i xrange 39
Ako iter(clanovi) vra¢a iterator i tako da naredba i.next nikada ne podigne StopIterationiznimku
(beskona£an iterator), petljafor x in clanovi: nikada ne zavr²ava (osim kad naredbe u tijelu petlje
sadrºavaju prikladne break ili return naredbe ili iznimke). iter(clanovi) poziva posebnu metodu
c._iter_() da se dobije i vrati iterator na clanovi.
Zahvaljuju¢i iteratorima, naredba for se moºe koristiti na spremniku (kontejneru) koji nije niz
znakova, poput rje£nika, sve dok god je kontejner iterabilan (tj. denira _iter_ posebnu metodu tako
da funkcija iter moºe prihvatiti kontejner kao argument i vratiti iterator na taj kontejner). Ugraene
funkcije koje su prije zahtjevale argumentni niz sad prihva¢aju bilo koji iterabilni objekt.
for i in xrange(n):
naredba(e)
range(x) vra¢a popis ili listu £iji £lanovi su sljedni cijeli brojevi od 0 (uklju£eno) do x (isklju£eno).
Funkcija range(x,y) vra¢a popis £iji £lanovi su su sljedni cijeli brojevi od x (uklju£eno) do y (isklju-
£eno). Ako je x ve¢i ili jednak y, onda je rezultat prazna lista. Funkcija range(x,y,step) vra¢a popis
cijelih brojeva od x (uklju£eno) do y (isklju£eno), tako da je razlika izmeu svaka dva susjedna £lana u
popisu step. Ako je korak (eng. step ) manji od 0, range odbrojava od x do y. Funkcija range vra¢a
prazan popis kada je x ve¢i ili jednak y, a korak je ve¢i od 0, ili kada je x manji ili jednak y i korak je
manji od 0. Ako je korak jednak 0, onda range podiºe iznimku. Dok range vra¢a standardni objekt
liste koja se moºe koristiti za bilo koju svrhu, xrange vra¢a objekt za posebne svrhe, posebno nami-
jenjen kori²tenju u iteracijama kao naredba for pokazana ranije. Xrange uzima manje memorije od
range-a za ovu speci£nu namjenu. Stavljaju¢i na stranu potro²nju memorije, range se moºe koristiti
u iste svrhe kao i xrange.
gdje su cilj i iter-clanovi identi£ni kao i u obi£noj for naredbi. Izraz se moºe ograditi i okruglim,
oblim zagradama, pa ¢e u tom slu£aju predstavljati n-terac, a ne listu. lc-odlomci je niz od nula ili
vi²e odlomaka, od kojih je svaki sli£an obliku:
result2 = []
for x in neki_niz
result2.append (x+1)
Saºeta lista koji koristi if odlomak izgleda ovako:
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.
Pi²u¢i program, korisnik (programer) moºe na£initi tri vrste pogre²aka: logi£ke pogre²ke, sintakti£ke
pogre²ke, te pogre²ke u radu (eng. run-time errors )nkoje se pojavljuju tijekom izvoenja programa.
Logi£ka pogre²ka poput neispravnog algoritma, uzrokuje neto£ne rezultate, ali ne sprije£ava izvoenje
programa. Ovakve se pogre²ke te²ko mogu uo£iti.
Sintakti£ka pogre²ka kr²i jedno od Pythonovih gramati£kih pravila i sprije£ava izvoenje programa.
Ove je pogre²ke lako popraviti.
Pogre²ka u radu je pogre²ka kod izvr²enja programa koja se dogaa dok je program u nekoj operaciji.
Neki £esti uzroci takvih pogre²aka u radu su neprimjereni ulazni podaci, arithmeti£ke pogre²ke,
neispravne vrste objekata, nizovi indeksa izvan dometa, nepostoje¢i klju£evi rje£nika, nepravilno
ispisana imena atributa, neinicijalizirane varijable, te problemi vezani uz operacijski sustav.
Iako to ne pomaºe u slu£aju logi£kih pogre²aka, Python podiºe iznimku (engl. exception ) pri otkri-
vanju sintakti£kih pogre²aka ili pogre²aka tijekom izvoenja programa. Interpreter zaustavlja program
te ispisuje dijagnosti£ku poruku o pogre²ci, zvanu " traceback ", koja ukazuje na vrstu iznimke te po-
kazuje pribliºno mjesto pogre²ke. Sintaksne pogre²ke su naj£e²¢e pogre²ke u pisanju programa, a na
njih upozorava Python prilikom izvoenja programa oznakom strijelice na mjestu na kojem se pogre²ka
javlja. To mjesto ne mora doista biti ono na kojem se pogre²ka nalazi, nego je obi£no ono na kojem se
prvi put pogre²ka manifestira. To£no lociranje pogre²aka nije jednostavno.
Kada je program sintaksno dobro napisan, postoji mogu¢nost da se pogre²ke jave prilikom izvoenja
programa. Iznimka je na£in na koji Python dohva¢a i pogre²ke tog tipa.
41
42 Iznimke
StandardError. Funkcija sys.exit() generira iznimku SystemExit koja se moºe dohvatiti kod ekspli-
citnog zatvaranja programa. (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 indivi-
dualnih iznimki. Na primjer, ako postoji skupina iznimki koje obrauju matemati£ke izra£une, onda se
moºe prvo dohvatiti samo ArithmeticError iznimka, a ne i sva njezina djeca (FloatingPointError,
OverflowError i ZeroDivisionError) pojedina£no, uz uvjet da se ºeli na isti na£in raditi sa svim
iznimkama.
Iznimka Opis
Exception Korijen svih iznimki
Podiºe se sa sys.exit() funkcijom. Ako se ne
obrauje ova iznimka, onda Python interpreter
zavr²ava program bez ispisa putanje zavr²etka
SystemExit (engl. traceback ). Ako se pozove sys.exit(),
Python prevodi poziv u iznimku i izvodi
potporu iznimci (eng. exception handler ) koji
se nalazi u finally odlomku od try naredbe.
Osnova svih ugraenih iznimki osim
StandardError
SystemExit.
Roditelj za iznimke koje Python podiºe za
ArithmeticError
razli£ite aritmeti£ke pogre²ke.
Podiºe se za pogre²ke u operacijama s
FloatingPointError
pomi£nom decimalnom to£kom.
Podiºe se kad je rezultat aritmeti£ke operacije
prevelik da bi se mogao prikazati. Ova
OverflowError iznimka ne moºe se pojaviti za duge cijele
brojeve (eng. long integers ). U njihovom
slu£aju Python podiºe MemoryError.
Podiºe se kad je drugi argument obi£nog ili
ZeroDivisionError
modularnog dijeljenja jednak nuli.
AssertionError Podiºe se kad je pogre²ka u assert naredbi.
Podiºe se kad je atributna referenca ili
pridruºba pogre²na. Ako objekt ne podrºava
AttributeError
atributnu referencu ili pridruºbu, onda Python
podiºe TypeError iznimku.
Roditelj za iznimke koje se pojavljuju izvan
EnvironmentError
Python-a.
Podiºe se kad je ulazno/izlazna operacija (kao
²to je print naredba, open() funkcijski poziv
ili metoda u radu s datotekom) pogre²na, na
IOError
primjer, za U/I razloge: "file not found"
(datoteka nije pronaena) ili "disk full"
(disk je pun).
5.1. Vrste iznimki 43
Iznimka Opis
Podiºe se kad se pojavi pogre²ka povezana s
operacijskim sustavom (izvan Python-a).
OSError Obi£no se ovoj iznimci pridruºuje numeri£ki
kôd pogre²ke, kao ²to je u os modulu iznimka
os.error.
Podiºe se kad se pojavi pogre²ka povezana s
WindowsError
Windows -operacijskim sustavom.
Podiºe se kad input() ili raw_input() otkrije
konac datoteke (EOF) bez £itanja ikakvog
EOFError podatka. (treba primjetiti da le-objekt
read() i readline() metoda vra¢a prazan
EOF.)
string kad se otkrije
Podiºe se kad import grije²i na¢i modul ili kad
ImportError
from-import grije²i na¢i ime.
Podiºe se kad korisnik pritisne tipku prekida
interrupt key
( koja je obi£no Ctrl-C ili Del ).
Python redovito provjerava takve prekide
KeyboardInterrupt tijekom izvoenja programa. Python takoe
podiºe ovu iznimku ako korisnik utipka prekid
za vrijeme input() ili raw_input() naredbe
koja £eka korisnikov unos.
Roditelj za iznimke koje Python podiºe kada
LookupError je indeks rje£ni£kog klju£a ili indeks niza
(stringa, liste ili n-terca) nevaljao.
Podiºe se kad je indeks niza izvan dosega. Ako
IndexError indeks nije cijeli broj, onda Python podiºe
TypeError iznimku.
Podiºe se kad Python ne moºe na¢i rje£ni£ki
KeyError
klju£.
Podiºe se kad operacija prelazi raspoloºivu
memoriju, ali program se jo² moºe spasiti
MemoryError brisanjem nekih obekata. Interpreter ne moºe
uvijek uspje²no ispraviti ovu pogre²ku, pa
podiºe iznimku i ispisuje slijed.
Podiºe se kad Python ne moºe prona¢i lokalno
NameError ili globalno ime. Argument iznimke je string
koji ozna£uje izgubljeno ime.
Podiºe se kad se referencira lokalna varijabla u
UnboundLocalError funkciji ili metodi, ali ne postoji vrijednost
pridruºena toj varijabli.
Podiºe se kada Python otkrije generi£ku
pogre²ku koja ne pripada niti jednoj drugoj
RuntimeError kategoriji. Argument iznimke je string koji
pokazuje ²to je neispravno. Python rijetko
podiºe ovu sveobuhvatnu iznimku.
44 Iznimke
Iznimka Opis
Podiºe se kad se pozove metoda koja se jo² nije
na£inila. Apstraktna metoda u korisnikovoj
NotImplementedError temeljnoj klasi moºe takoer podignuti ovu
iznimku, ako se od izvedene klase zahtijeva da
prebri²e ili prepuni (engl. override ) metodu.
Podiºe se kad Python interpreter otkrije
sintaksnu pogre²ku u interaktivnom ili
skriptnom na£inu rada. Ova iznimka se moºe
SyntaxError
pojaviti u import ili exec naredbi, te u
eval() ili input() pozivima funkcija, kad se
incijalno £ita skripta ili se £ita standardni ulaz.
Podiºe se kad se koristi -tt opcija u
naredbenoj liniji sa programom koji
TabError
nekonzistentno koristi tabulatore i prazna
mjesta.
Podiºe se kad program prekida Pythonova
IndentationError pravila uvla£enja (engl. indentation) izvornog
programskog teksta.
Podiºe se kad Python interpreter otkrije
nutarnju pogre²ku koja nije toliko ozbiljna da
zaustavi izvr²avanje interpretera. Argument
SystemError
iznimke je string koji pokazuje gdje je do²lo do
pogre²ke, na razini sistemskih (najniºih)
operacija.
Podiºe se kad se ugraena operacija ili
funkcija primjeni na objekt neprikladnog tipa.
TypeError
Argument iznimke je string koji pokazuje
detalje o nepodudaranju tipova podataka.
Podiºe se kad se ugraenoj operaciji ili
funkcija proslijedi argument koji ima ispravan
ValueError tip, ali ne i ispravnu vrijednost. To su slu£aji
koji se ne mogu opisati preciznijom iznimkom,
kakva je na primjer IndexError.
Podiºe se kad se pojavi pogre²ka u Unicode
UnicodeError
kodiranju ili dekodiranju.
>>> 10 * (1/0)
Traceback (most recent call last):
File "<stdin>", line 1, in ?
ZeroDivisionError: integer division or modulo by zero
>>> 4 + spam*3
Traceback (most recent call last):
File "<stdin>", line 1, in ?
NameError: name 'spam' is not defined
>>> '2' + 2
Traceback (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 Python
5.2. Rad s iznimkama 45
ugraena iznimka podiºu true pri pojavi pogre²ke njenog tipa. Ostatak ispisane linije poruke pruºa
detaljniji opis pogre²ke (TypeError), a dio prije imena iznimke govori o kontekstu u kojem se pogre²ka
dogodila. Taj kontekst je u obliku slijeda (Traceback) obavijesti, od posljednjeg mjesta, rekurzivno
prema po£etku mogu¢e pogre²ke.
• ako se tokom izvr²avanja ne pojavi iznimka, except linija se preska£e i try zavr²ava
• ako se iznimka pojavi tijekom izvr²avanja try-a, i ako odgovara iznimci navedenoj u except liniji,
onda se ona izvr²ava
• ako se iznimka pojavi, a ne odgovara except liniji, provjeravaju se druge iznimke u try izrazu.
Ako njih nema, program zavr²ava i pokazuje poruku koja je gore navedena.
Pri tomu try moºe imati vi²e od jedne except linije (uvjeta), koji dohva¢aju neke druge iznimke.
Pri tome se najvi²e izvr²ava jedna od njih, i to samo za iznimke navedene u tom djelu except linije, ali
ne za druge. Except linija moºe imati vi²e iznimki, deniranih unutar n-terca, npr:
>>> try:
... raise Exception('miki', 'riki')
... except Exception, inst:
... print type(inst) # instance iznimke
46 Iznimke
Ako iznimka ima argument, on se ispisuje kao zadnji dio poruke o pogre²ci('detail'). Programi za
rad s iznimkama mogu raditi i s funkcijama, koje se unutar njih pozivaju.
try:
try_block
except ex:
except_block
Python pokre¢e kôd 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 pojavi
iznimka, Python preska£e ostatak naredbi bloka try i ispituje vrijednost ex u odlomku except kako bi
se 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 prebacuje
na naredbu koja slijedi blok except. Ako iznimka ne odgovara ex, iznimka se pro²iruje na bilo koje
uklju£ene try naredbe, koje bi mogle imati odlomak except u kojem bi se iznimka mogla obraditi. Ako
ni jedna od obliºnjih except klauzula ne obrauje podignutu iznimku, onda Python zatvara program te
ispisuje poruku o pogre²ci.
5.3. Obradba iznimki 47
try:
try_block
except ex:
pass
pa ako se dogodi iznimka, Python je ignorira i upravljanje tokom programa prelazi na prvu naredbu
nakon pass naredbe.
try:
try_block
except ex, target:
except_block
try:
try_block
except:
except_block
try:
try_block
except [...]:
except_block
else:
else_block
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_block
za sve njih. Target je dopustiva varijabla koja uzima argument iznimke.
try:
try_block
finally:
finally_block
Python pokre¢e kôd unutar finally_block-a nakon ²to ga pokrene u try_block-u. Python ¢e
pokrenuti finally_block bez obzira kako se try_block izvr²i: bilo normalno, bilo putem iznimke
ili putem naredbe tipa break ili return. Ako se iznimka dogodi unutar try_block-a, Python ¢e
presko£iti ostatak try_block-a, te pokrenuti finally_block, a onda ponovno podignuti iznimku kako
bi se dohvatila naredbom try-except vi²e razine.
raise ex
ili
ili
Argument iznimke moºe biti jedna vrijednost, argument ili n-terac vrijednosti (arg1, arg2, ...).
Ako je izostavljen, onda je pretpostavljena vrijednost argumenta None.
5.4. Korisni£ki denirane iznimke 49
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,te
je stoga ponovo pozvan nakon ²to se zadnja iznimka izvr²ila. Sve iznimke se mogu pozvati naredbom
raise exception[,value], gdje value daje detalje o iznimci koja je pozvana.
50 Iznimke
Ve¢ina naredbi tipi£nog Python programa organizirana je preko funkcija. Funkcija je skupina naredbi
koje se izvr²avaju po pozivu. Python pruºa mnogo ugraenih funkcija i dopu²ta programerima de-
niranje vlastitih funkcija. Zahtjev za izvr²enje funkcije zove se funkcijski poziv (engl. function call ).
Kad se funkcija pozove, moºe primiti argumente koji speciciraju vrstu podataka s kojima funkcija
radi (obrauje ih). U Pythonu funkcija uvijek vra¢a rezultantnu vrijednost, koja moºe biti None ili
vrijednost koja predstavlja rezultat nekog izra£una, izvr²enog u tijelu funkcije. U Pythonu su funkcije
objekti, pa se sa njima upravlja isto kao i s drugim objektima. Tako se neka funkcija moºe proslijediti
kao argument u pozivu neke druge funkcije. Sli£no tomu, funkcija moºe vratiti drugu funkciju kao re-
zultat obradbe, izvr²enja svog programskog kôda. Kao i svaki drugi objekt, funkcija moºe biti povezana
s nekom varijablom, nekim £lanom unutar niza (polja, liste) ili atributom objekta. Funkcije takoer
mogu biti klju£evi u rje£niku.
def funkcijsko_ime(parametri):
naredba(e)
def double(x):
return x*2
51
52 Funkcije
6.2 Parametri
Formalni parametri koji su jednostavni identikatori navedeni u deniciji funkcije predstavljaju obve-
zatne parametre, ²to zna£i da svaki poziv funkcije mora pruºiti i odgovaraju¢u vrijednost - ( argument )
za svaki parametar. Nakon niza ili liste parametara odvojenih zarezima s niti jednim ili s vi²e (obveznih)
parametara moºe slijediti jedan ili vi²e slobodnih parametara koji imaju sljede¢u sintaksu:
identifikator=izraz
Naredba def ra£una, ocjenjuje izraz, te sprema referencu vrijednosti koju izraz vra¢a, koja se zove
pretpostavljena vrijednost (eng. default value ). Kad poziv funkcije nema argument koji odgovara
takvom slobodnom parametru, onda se identikator argumenta povezuje s tom pretpostavljenom, ili
izra£unatom, vrijednosti.
Treba primjetiti da se isti objekt, pretpostavljena vrijednost, povezuje sa slobodnim parametrom
kad god u pozivu funkcije nema pridruºenog argumenta. Ovo dakako, moºe biti nezgodno, ako je
pretpostavljena vrijednost promjenljivi objekt, a tijelo funkcije mijenja taj parametar. Na primjer:
Druga naredba print ispisuje [23,42] zato jer prvi poziv funkcije f mijenja vrijednost y, koja je
prije bila prazna lista [], a onda dodavanjem 23 poprima tu novu (a pretpostavljenu) vrijednost, pa
novi poziv uzima zadnje stanje argumenta. Ako je potrebno povezati y s novim objektom liste svaki
put kada se f poziva s jednim argumentom, koristi se sljede¢e:
Na kraju formalnih parametara u deniciji funkcije, dopu²teno je koristiti jedan ili oba posebna
oblika: *identifikator1 i **iidentifikator2. Ako su obadva na raspolaganju, onaj s dvije zvjezdice
mora do¢i zadnji. Parametar *identifikator1 omogu¢uje da poziv funkcije moºe osigurati dodatne
pozicijske argumente, dok **identifikator2 omogu¢uje da poziv funkcije moºe osigurati dodatne
argumente s imenom. Na taj na£in rje²avaju se pozivi funkcija s promjenljivim, varijabilnim brojem
argumenata. Svaki poziv funkcije povezuje identifikator1 s n-tercem £iji su £lanovi dodatni pozicijski
argumenti (ili praznim n-tercem, ako ih nema). Identifikator2 povezuje se s rje£nikom £iji su £lanovi
imena i vrijednosti dodatnih argumenata koji se imenuju (ili praznim rje£nikom, ako ih nema). Evo
kako se pi²e funkcija koja prihva¢a bilo koji broj argumenata i vra¢a njihov zbroj:
def zbroj(*broj):
rez = 0
for x in broj: rez += x
return rez
Oblik ** dopu²ta konstrukciju rje£nika s klju£evima stringa u obliku koji se lak²e £ita nego stan-
dardna rje£ni£ka sintaksa:
6.3. Atributi funkcijskih objekata 53
Treba primjetiti da se tijelo funkcije vbr_rj sastoji od samo jedne jednostavne naredbe, tako da se
moºe staviti u istu liniju kao i naredba def. Dakako, bilo bi jednako to£no (i moºda £itljivije) ako bi se
funkcija vbr_rj ispisala koriste¢i dvije linije umjesto jedne:
def vbr_rj(**kwds):
return kwds
Moºe se takoer denirati rje£nik £iji su klju£evi i vrijednosti funkcije, a onda na£initi rje£nik
dvosmjernim:
Na taj na£in za odreenu funkciju moºe se brzo na¢i inverzna funkcija. injenica da su funkcije
objekti u Pythonu, £esto se izraºava rije£ima da su funkcije objekti prve klase.
def zbroj(*brojevi):
'''Prihvati bilo koji broj numeri£kih argumenata i vrati njihov zbroj
Argumenti su n-terac ili lista od jednog ili vi²e brojeva. Izlaz je njihov zbroj. '''
rez = 0
for broj in brojevi: rez += broj
return rez
Dokumentacijski nizovi vaºan su sadrºaj svakoga Python kôda. Njihova je uloga sli£na komentarima
u bilo kojem programskom jeziku, ali im je iskoristivost ²ira, jer su dostupni pri procesu pokretanja pro-
grama (engl. runtime ). Programerska okruºenja i drugi alati mogu koristiti docstring -ove funkcijskih,
klasnih i modularnih objekata da podsjete programera kako koristiti te objekte. To zna£i da djeluju
kao pomo¢ (engl. help ) programa. Da bi sedocstring u£inio ²to korisnijim, trebalo bi po²tovati nekoliko
jednostavnih dogovora. Prva linija docstringa 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, govornog jezika pa dolazi kao dio opisa operacije te funkcije. Ako je
docstring protegnut preko vi²e linija, druga linija trebala bi biti prazna, a sljede¢e linije bi trebale for-
mirati jedan ili vi²e odlomaka, odvojenih praznim linijama, koji opisuju o£ekivane argumente funkcije,
potrebne uvjete, izlazne (povratne) vrijednosti, te mogu¢e nuspojave. Daljnja obja²njenja, knjiºevne
reference, te primjeri kori²tenja (koji se mogu provjeriti sa doctest) mogu po slobodnom izboru slijediti
iza, prema zavr²etku docstring -a. Uz ove predenirane atribute, funkcijskom objektu mogu se dodati
i drugi atributi. Da bi se stvorio atribut objekta funkcije, prikladna atributna vrijednost se nakon
54 Funkcije
izvr²enja naredbe def povezuje s odgovaraju¢im referencama. Na primjer, funkcija moºe brojati koliko
je puta pozivana:
def counter( ):
counter.count += 1
return counter.count
counter.count = 0
Iako ogu¢nost pridruºivanja atributa s funkcijom moºe ponekad biti od koristi njena primjena nije
£esta. Mnogo £e²¢e, kada se trebaju povezati neki podaci i programski kôd zajedno, koriste se objektno-
orijentirani mehanizmi.
funkcijsko_ime(argumenti)
funkcijsko_ime moºe biti bilo kakva referenca na objekt funkcije, ²to je naj£e²¢e samo ime doti£ne
argumenti u najjednostavnijem slu£aju niz
funkcije. Zagrade ozna£uju operaciju poziva funkcijie, dok su
od nula ili vi²e izraza odvojenih zarezima, koji daju, prenose, vrijednosti odgovaraju¢im parametrima
denirane funkcije. Kada se funkcija poziva , parametri poziva funkcije povezuju se s funkcijskim
argumentima, tijelo funkcije se izvr²ava sa stvarnim vrijenostima argumenata, a funkcija nakon izvr²enja
na koncu vra¢a pozivatelju neku vrijednost izraza.
a = 77
b = [99]
6.5. Poziv funkcije 55
f(a, b)
print a, b # ispisuje se: 77 [99, 42]
Naredba print pokazuje da je a jo² uvijek povezano sa 77, iako se kao parametar x proslijedila u
funkciju f(x,y). Re-povezivanje funkcijskog parametra x na 23 nema efekta s obzirom na poziv funkcije
f, jer je x lokalna varijabla funkcije.
Meutim, naredba print takoer pokazuje da 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, f nije izmijenio poveznice pozivatelja, niti f moºe
izmijeniti broj 77, jer su brojevi nepromjenljivi. Ali, f moºe izmijeniti objekt liste, jer su objekti liste
promjenljivi. U ovom primjeru, f mijenja objekt liste koji pozivatelj prenosi na f kao drugi argument
pozivaju¢i append metodu objekta.
identifikator=izraz
identifikator mora biti jedno od imena formalnih parametara koja se koriste u def naredbi
funkcije. izraz daje vrijednost formalnom parametru.
Poziv funkcije mora pruºiti, putem pozicijskih i/ili imenovanih argumenata, to£no jednu vrijednost
za svaki obvezatni parametar, te nula ili jednu vrijednost za svaki slobodno izabrani parametar. Na
primjer:
def zbroj(*br):
rez = 0
for x in br: rez += x
return rez
print zbroj(*d.values( ))
Dakako, argumenti oblika *niz ili **rj mogu se prenositi i kad se poziva funkcija koja ne koristi
sli£ne oblike u svojim formalnim parametrima.
global identifikatori
gdje su identifikatori jedan ili vi²e identikatora odvojenih zarezima. Identikatori popisani u
global naredbi odnose se na globalne varijable koje funkcija treba re-povezati. Na primjer, _count se
moºe ubaciti u funkciju koriste¢i klju£nu rije£ global i globalnu varijablu, kako slijedi:
_count = 0
def counter( ):
global _count
_count += 1
return _count
Bez global naredbe, funkcija counter() UnboundLocalError iznimku, jer bi _count bio
bi podigla
neinicijalizirana (nepovezana) lokalna varijabla. Takoer, iako naredba global omogu¢uje ovakvu vrstu
programiranja, to ipak nije niti elegantno niti preporu£ljivo. Naredba global nije potrebna ako tijelo
funkcije 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 funkcije
re-povezuje globalnu varijablu. Stvar je stila, a i preporuke, da se naredba global ne koristi osim kad
je to apsolutno nuºno.
def make_adder_1(augend):
def add(addend, _augend=augend): return addend+_augend
return add
Ista funkcija kori²tenjem ugnjeºenih dosega izgleda ovako:
def make_adder_2(augend):
def add(addend): return addend+augend
return add
Closures su iznimke u op¢em pravilu, jer su objektno-orjentirani mehanizmi najbolji na£in pove-
zivanja podataka i kôda zajedno. Kada se trebaju konstruirati pozivni objekti, s nekim parametrima
u vremenu konstrukcije objekta, closures mogu biti ekasnije i jednostavnije od klasa. Na primjer,
rezultat make_adder_1(7) je funkcija koja prihva¢a jedan argument i dodaje 7 na taj argument (re-
zultat make_adder_2(7) se pona²a na isti na£in). Closure je "tvornica" za bilo kojeg £lana obitelji
funkcija koji se razlikuju po nekim parametrima, te moºe pomo¢i u izbjegavanju dvostrukog pisanja
programskog kôda.
POGLAVLJE 7
Python - objektni jezik
Python je programski jezik temeljen na objektima. Za razliku od nekih drugih, takoer objektno-
orijentiranih, jezika, Python ne uvjetuje kori²tenje isklju£ivo objektno-orijentirane paradigme. Pyt-
hon takoer podrºava proceduralno (strukturalno) programiranje s modulima i funkcijama, tako da je
mogu¢e izabrati najprikladniju paradigmu programiranja za svaki dio programa. Op¢enito, objektno-
orijentirana paradigma najbolja je kada se ºele skupiti podaci i funkcije u prakti£ne pakete. Isto tako
moºe biti korisna kada se ºele koristiti neki od Pythonovih objektno-orijentiranih mehanizama, kao npr.
naslijeivanje. Proceduralna paradigma, koja je bazirana na modulima i funkcijama, obi£no je jed-
nostavnija i prikladnija u slu£ajima kada nikakve prednosti objektno-orijentiranog programiranja nisu
potrebne. Novi stil objektnog modela postaje standard u novim verzijama Pythona, pa se preporu£uje
koristiti ga za programiranje.
• Objekt klase moºe se pozivati kao da je funkcija. Poziv stvara novi objekt, poznat kao instanca
klase, za koju se zna kojoj klasi pripada.
• Klasa ima po volji imenovane atribute koji se mogu povezivati i referirati.
• Vrijednosti atributa klase mogu biti podat£ani objekti ili funkcijski objekti.
• Klasa moºe podatke i metode naslijediti od drugih klasa, pa potraga nekog atributa koji nije
unutar same klase prenosi se na druge objekte, roditelje klase.
• Instanca klase je Python objekt s po volji imenovanim atributima koji se mogu povezivati i
referirati.
• Python klase su objekti, pa se s njima postupa kao i s drugim objektima. Tako se klasa moºe
prenijeti kao argument u pozivu funkcij, a funkcija moºe vratiti klasu kao rezultat poziva. Klasa,
kao i bilo koji drugi objekt, moºe biti povezana na varijablu (lokalnu lili globalnu), £lan niza ili
atribut objekta. Klase takoer mogu biti i klju£evi u rije£niku.
59
60 Python - objektni jezik
class ime\_klase[(klase\_roditelji)]:
naredba(e)
String ime_klase je identikator. To je varijabla koja postaje povezana (ili re-povezana) s objektom
klase nakon ²to naredba class zavr²i s izvr²avanjem. klase_roditelji je po volji zarezima odvojen
niz izraza (obi£no stringovnih identikatora) £ije su vrijednosti objekti klasa. Ove su klase poznate
pod razli£itim imenima u razli£itim jezicima - govori se o baznim klasama, superklasama ili roditeljima
klase koja se stvara. Za klasu koja se stvara kaºe se da 'nasljeuje oblik', 'po£inje od', 'produºava se'
ili 'podklasira' od svoje bazne, roditeljske klase. Ova klasa takoer je poznata kao izravna podklasa ili
potomak C1 podklasa od C2, a
svojih baznih klasa. Podklasna veza izmeu klasa je prijelazna: ako je
C2 podklasa od C3, onda je C1 podklasa od C3. Ugraena funkcija issubclass(C1,C2) prihva¢a dva
argumenta koji su objekti klase: vra¢a True ako je C1 podklasa od C2; u suprotnom vra¢a False. Svaka
klasa je zapravo podklasa od same sebe, tako da issubclass(C, C) vra¢a True za bilo koju klasu C.
Sintaksa naredbe class ima malu, nezgodnu razliku od sintakse naredbe def. U naredbidef, zagrade
su obvezatne izmeu imena funkcije i dvoto£ke. Da se denira funkcija bez formalnih parametara, mora
se koristiti naredba kao:
def ime( ):
naredba(e)
U naredbi class zagrade su obvezatne ako klasa ima jednu li vi²e roditeljskih klasa, ali su zabranjene
ako ih klasa nema. Tako se za denaciju klase bez roditeljskih klasa mora koristiti naredba ovakve
sintakse:
class ime:
naredba(e)
Niz naredbi koji nije prazan, a koji slijedi naredbu class poznat je kao tijelo klase. Tijelo klase
izvr²ava se odmah, kao dio procesa izvr²enja naredbe class. Dok se tijelo ne izvr²i, novi objekt klase
ne postoji i identikatorime nije jo² povezan (ili re-povezan). Kona£no, valja primijetiti da naredba
class ne stvara nove instance klase, nego denira skup atributa koji se dijele izmeu svih instanci koje
se iz klase stvore.
class C1:
x = 23
print C1.x # ispisuje se: 23
Objekt klase C1 ima atribut s imenom x, povezan na vrijednost cjelobrojnog literala 23, a C1.x se
odnosi, referencira na taj atribut. Mogu¢e je takoer povezati ili odvezati atribute klase izvan tijela
klase. Na primjer:
7.3. Tijelo klase 61
class C2:
pass
C2.x = 23
print C2.x # ispisuje se: 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. Naredba
class implicitno denira neke vlastite, posebne atribute klase. Atribut __name__ je ime klase,
stringovni identikator kori²ten u naredbiclass. Atribut __bases__ je n-terac objekata klase koji su
dani kao roditeljske klase u naredbi class (ili prazan n-terac, ako nema zadanih roditeljskih, baznih
klasa). Na primjer, za ve¢ stvorenu klasu C1 vrijedi:
Klasa takoer ima atribut __dict__, ²to je rje£ni£ki objekt kojeg klasa koristi za potporu (popis)
svih svojih ostalih atributa. Za svaki objekt klase C, bilo koji objekt x i za bilo kakav identikator S
(osim__name__, __bases__ i __dict__) vrijedi:
C.S=x je ekvivalentan s C.__dict__['S']=x.
Na primjer, za poznatu klasu C1:
C1.y = 45
C1.__dict__['z'] = 67
print C1.x, C1.y, C1.z # ispisuje se: 23, 45, 67
Pritom nema razlike izmeu atributa klase koji su stvoreni unutar tijela klase, izvan tijela klase
zadavanjem atributa ili izvan tijela klase eksplicitnim povezivanjem sa C.__dict__.
U naredbama koje su izravno u tijelu klase, reference na atribute klase moraju koristiti puno, a ne
jednostavno ime kvantikatora. Na primjer:
class C3:
x = 23
def f1(self):
print C3.x # mora se koristiti C3.x, a ne samo x
Treba primijetiti da reference atributa (npr. izraz kao C.S) imaju bogatiju semantiku nego jednos-
tavno povezivanje atributa.
class C4:
def pozdrav(self):
print "Zdravo"
Klasa moºe denirati takoer nekoliko posebnih metoda (metoda sa imenima koja imaju dvije
podcrte ispred i iza imena), a koje se odnose na posebne operacije.
62 Python - objektni jezik
class ZiroRacun:
"Jednostavna klasa"
tip_racuna = "Ziro"
def _ _init_ _(self,ime,racun):
"Inicijalizacije nove klase"
self.osoba = name
self.novac = racun
def polog(self,iznos):
"Dodaje iznosu na ra£unu"
self.novac = self.novac + iznos
def povuci(self,iznos):
"Oduzima od iznosa na ra£unu"
self.novac = self.novac - iznos
def provjeri(self):
"Vraca iznos na racunu"
return self.novac
Instance klase stvaraju se pozivom class objekta. Tada se istodobno stvara nova instanca i poziva
__init__() metoda te klase (ako je u njoj denirana). Na primjer:
Jednom na£injeni, atributi i metode novo nastale instance dohvatljivi su kori²tenjem ' to£ka ' (.)
operatora:
Interno, svaka instanca se stvara koriste¢i rje£nik koji je dohvatljiv kao instanca __dict__ atributa.
Ovaj rje£nik sadrºi informaciju koja je jedinstvena za svaku instancu. Na primjer:
Iako se pridruºba atributima uvjek provodi na lokalnom rje£niku neke instance, pristup atributu
ponekad je vrlo sloºen. Kad god se pristupa atributu, Python interpreter (compiler) prvo pretraºuje
rje£nik instance. Ako ne nae traºeno, onda se pretraºuje rje£nik objekta klase koja se koristila za
stvaranje instance. Ako ni to nije urodilo plodom, onda se provodi pretraºivanje roditeljskih klasa (ako
ih klasa ima). Ako i to propadne, kona£ni poku²aj traºenja atributa je pozivom __getattr__() metode
te klase (ako je denirana). Na koncu, ako ni to ne uspije, onda se podiºe AttributeError iznimka.
Kako je pokazano, da bi se stvorila instanca klase, treba se (poput poziva funkcije) pozvati objekt
klase. Svaki poziv vra¢a novi objekt instance te klase:jedna_instanca = C5(). Ugraena funkcija
isinstance(Obj,C) s objektom klase kao argumentom C vra¢a True ako je objekt Obj instanca klase
C ili bilo koje podklase od C. U protivnom isinstance vra¢a False.
7.4.1 __init__
Kada klasa ima ili nasljeuje metodu __init__, poziv objektu klase implicitno izvr²ava __init__ na
novoj instanci kako bi se obavila inicijalizacija koja je potrebna instanci. Argumenti koji se predaju
putem poziva moraju odgovarati formalnim parametrima __init__ metode. Na primjer, u sljede¢oj
klasi:
class C6:
def __init__(self,n):
self.x = n
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 druga
vra¢ena vrijednost uzrokuje TypeError iznimku. Glavna svrha __init__ je povezivanje, tj. stvaranje
atributa novostvorene instance. Atributi instance takoer se mogu povezivati ili re-povezivati i izvan
__init__ metode. Programski kod bit ¢e £itljiviji ako se svi atributi klasne instance inicijalno poveºu
naredbama u metodi __init__.
i4=C4();
i4.pozdrav( ) # ispisuje se: Zdravo
print jedna_instanca.x # ispisuje se: 42
64 Python - objektni jezik
Objektu instance moºe se dodati neki atribut povezivanjem neke vrijednosti na referencu atributa.
Na primjer:
Objekt instance z sada ima atribut koji se zove x, 23, i z.x se odnosi na taj
povezan na vrijednost
atribut. To povezivanje atributa omogu¢uje takoer posebna metoda __setattr__. Stvaranje instance
implicitno denira dva atributa instance. Za svaku instancu z, z.__class__ je klasa objekta kojemu
z pripada, a z.__dict__ je rje£nik koji z koristi za £uvanje svih svojih ostalih atributa. Na primjer, za
instancu z koja je upravo stvorena:
Oba ova atributa mogu se re-povezati (ali ne odvezati), iako je ovo rijetko nuºno. Za bilo koji objekt
instance z, bilo koji objekt x, i bilo koji identikator S (osim __class__ i __dict__), z.S=x je
ekvivalentan s z.__dict__['S']=x (osim ako __setattr__ posebna metoda presretne poku²aj povezi-
vanja). Na primjer, za poznatu stvarenu instancu z:
z.y = 45
z.__dict__['z'] = 67
print z.x, z.y, z.z # ispisuje: 23, 45, 67
Nema razlike u atributima instance stvorenima s funkcijom __init__, zadavanjem preko atributa
ili po eksplicitnom povezivanju sa z.__dict__.
class Posebna:
def metoda(self): print "posebna"
class Obicna:
def metoda(self): print "obicna"
def Prikladna(obicnaje=1):
if obicnaje: return Obicna( )
else: return Posebna( )
i1 = Prikladna(obicnaje=0)
i1.metoda( ) # ispisuje se: "posebna", kako je traºeno
7.5. Nasljeivanje 65
7.5 Nasljeivanje
Nasljeivanje je mehanizam stvaranja novih klasa koje specijaliziraju ili mijenjaju pona²anje postoje¢e
klase. Originalna klasa zove se temeljna, roditeljska klasa (bazna, eng. base class ) ili nadklasa, super-
klasa (engl. superclass ). Nova klasa se zove izvedena klasa ili podklasa (eng. subclass ). Kada se klasa
stvara putem nasljeivanja, ona nasljeuje atribute denirane u njenim roditeljskim klasama. Meutim,
izvedena klasa moºe redenirati bilo koji od ovih atributa i dodati nove vlastite atribute. Nasljeivanje
se specicira s listom imena roditeljskih klasa koje se odvajaju zarezom u class naredbi. Na primjer:
class A:
varA = 42
def method1(self):
print "Class A : method1"
class B:
varB = 37
def method1(self):
print "Class B : method1"
def method2(self):
print "Class B : method2"
class D: pass
class E(C,D): pass
Ako se traºi atribut deniran u temeljnoj klasi, onda se koristi algoritam u dubinu (eng. depth-rst
search ) za pretraºivanje i to u temeljnim klasama kako su navedene u poretku prilikom denicije klase.
Na primjer, u klasi E u prethodnom primjeru, temeljne klase se pretraºuju redoslijedom C , A, B, D. U
slu£aju da vi²estruke temeljne klase deniraju isti simbol, uzet ¢e se prvi simbol kojeg procs traºenja
nae. Na primjer:
Ako izvedena klasa denira atribut s istim imenom kao atribut u temeljnoj klasi, onda ¢e instance
od izvedene klase koristiti atribute izvedene, a ne roditeljske klase. Ako se ipak ºeli koristiti originalni
atribut, onda se mora napisati puno ime do tog atributa, tj. ime_roditeljske_klase.atribut, kao
na primjer:
66 Python - objektni jezik
class D(A):
def method1(self):
print "Class D : method1"
A.method1(self) # poziva roditeljsku metodu
Jedna posljedica ove £injenice nalazi se u inicijalizaciji klasnih instanci. Kad se instanca stvara, onda
se ne poziva metoda __init__() roditeljskih klasa. To zna£i, da je u izvedenoj klasi nuºno na£initi
ispravnu inicijalizaciju roditeljske klase, ako je to potrebno. Na primjer:
class D(A):
def __init__(self, args1):
# Inicijalizacija roditeljske klase
A.__init__(self)
# Initialize myself
...
Sli£ni koraci mogu takoer biti nuºni kad se deniraju akcije £i²¢enja (brisanja objekata) u __del__()
metodi. Kada se koristi referenca atributa C.ime na objekt klase, i 'ime' nije klju£ u C.__dict__,
potraga se implicitno proslijeuje na svaki objekt klase koji je u C.__bases__, po redoslijedu navoenja.
C-ove roditeljske klase mogu imati i vlastite roditeljske klase. U ovom slu£aju, potraga rekurzivno
prosljeuje navi²e, po drvetu naslijea, zaustavljaju¢i se kada je 'ime' naeno. Potraga je po dubini,
²to zna£i da pregledava pretke svake roditeljske klase od C prije pregleda sljede¢e roditeljske klase od
C. Slijedi primjer:
class Roditeljska_1:
def neka_metoda(self): print "Roditeljska_1"
class Roditeljska_2(Roditeljska_1): pass
class Base3:
def neka_metoda(self): print "Roditeljska_3"
class Izvedena(Roditeljska_2, Roditeljska_3): pass
inst1 = Izvedena( )
inst1.neka_metoda( ) # ispisuje se: "Roditeljska_1"
U ovom slu£aju potraga za metodom zapo£inje u klasi Izvedena. Ako tamo nije pronaena, potraga
se nastavlja na Roditeljska_2. Ako ni tamo atribut nije naen, potraga ide na pretka Roditeljska_2,
tj. na Roditeljska_1, gdje je atribut napokon naen. Tako se pretraga zaustavlja na toj to£ki i nikada
ne uzima u obzir Roditeljska_3, gdje bi se taj atribut takoer na²ao.
class B:
a = 23
b = 45
def f(self): print "metoda f u klasi B"
def g(self): print "metoda g u klasi B"
class C(B):
b = 67
7.5. Nasljeivanje 67
c = 89
d = 123
def g(self): print "metoda g u klasi C"
def h(self): print "metoda h u klasi C"
class Gornja:
def pozdrav(self, ime): print "Zdravo ", ime
class Donja(Gornja):
def pozdrav(self, ime):
print "Dobro do²li",
Gornja.pozdrav(self, ime)
x = Donja( )
x.pozdrav('Miki')
Predaja superklasi, u tijelu Donja.pozdrav, koristi nepovezanu metodu dobivenu referencom atri-
buta Gornja.pozdrav na superklasi, i zato prenosi sve atribute normalno, uklju£uju¢i self. Predaja
ili posluºivanje implementaciji superklase je glavna korist nepovezanih metoda.
7.5.3 Vi²eobli£je
Vi²eobli£je ili polimorzam, (eng. polymorphism ) ili dinami£ko povezivanje potpuno se otkriva kroz
proces traºenja nekog atributa, prethodno opisano u nasljeivanju objekata. Kad god se metodi pristupa
sa obj.method(), prvo se metoda locira traºenjem __dict__ atributa instance, pa instancine klasne
denicije, pa roditeljskih klasa. To traºenje uvijek ide u tom redoslijedu. Prvi uspje²ni pronalazak
koristi se kao traºena metoda.
class A:
def __init__(self):
self.__X = 3 # Pretvara se u self._A__X
class B(A):
def __init__(self):
68 Python - objektni jezik
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£io
pristup " privatnim " atributima neke klase. To zna£i da, ako su poznati klasa i njen atribut, onda se
oni mogu dohvatiti s gore opisanim punim imenom iz bilo koje instance.
class Complex:
def __init__(self,real,imag=0):
self.real = float(real)
self.imag = float(imag)
def __repr__(self):
return "Complex(%s,%s)" % (self.real, self.imag)
def __str__(self):
return "(%g+%gj)" % (self.real, self.imag)
# self + other
def __add__(self,drugi):
return Complex(self.real + drugi.real, self.imag + drugi.imag)
# self - other
def __sub__(self,drugi):
return Complex(self.real - drugi.real, self.imag - drugi.imag)
# -self
def __neg__(self):
return Complex(-self.real, -self.imag)
# drugi + self
def __radd__(self,drugi):
return Complex.__add__(drugi,self)
# other - self
def __rsub__(self,drugi):
return Complex.__sub__(drugi,self)
# Prisilno pretvori ostale numeri£ke tipove u kompleksni
def __coerce__(self, drugi):
if isinstance(drugi, Complex):
return self,drugi
try: # Provjeriti ako se moºe pretvoriti u float
return self, Complex(float(drugi))
except ValueError:
pass
U ovom primjeru, postoji nekoliko zanimljivih detalja:
1. Prvo, normalno pona²anje od __repr__() je stvaranje stringa koji ¢e se izvr²iti kako bi se ponovno
na£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 ispisati
s pomo¢u print naredbe).
3. Kona£no, __coerce__ metoda koristi se u dohva¢anju operacija koje uklju£uju mije²ane tipove
podataka. U ovom slu£aju, drugi numeri£ki tipovi pretvaraju se u kompleksne brojeve tako da se
mogu koristiti u metodama kompleksne aritmetike.
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 ugraene funkcije isinstance(obj,cname). Ova
funkcija vra¢a istinu, ako objekt obj pripada klasi cname cname. Na
ili bilo kojoj klasi izvedenoj iz
primjer:
class A: pass
class B(A): pass
class C: pass
Sli£no, ugraena funkcija issubclass(A ,B ) vra¢a istinu ako je A podklasa klase B. Na primjer:
Funkcija isinstance() moºe se koristiti za izvr²avanje provjere tipa s obzirom na bilo koji ugraeni
tip:
import types
isinstance(3, types.IntType) # Vra¢a True
isinstance(3, types.FloatType) # Vra¢a False
Ovo je preporu£en na£in provjere tipa meu ugraenim tipovima, jer ¢e razlika izmeu tipova i klasa
moºda i²£eznuti u budu¢im ina£icama Python-a.
POGLAVLJE 8
Moduli i paketi
Podaci (varijable), funkcije, klase i objekti skupljaju se u module. Vi²e modula zajedno £ini paket.
Moduli i paketi predstavljaju Python knjiºnicu (engl. library ).
8.1 Modul
U modul je mogu¢e uklju£iti bilo koju valjanu datoteku s Python kôdom, te pozvati ga s naredbom
import. Na primjer, neka je sljede¢i kôd spremljen u datoteku 'primjer.py':
# datoteka: primjer.py
a = 37 # Varijabla
def A: # Funkcija
print "Ja sam u A"
class K: # Klasa
def B(self):
print "Ja sam u K.B"
b = K() # Tvorba instance
Pozvati u memoriju ovakav kôd kao modul, postiºe se naredbom import primjer. Prvi put kad se
import koristi da se modul u£ita u memoriju, dogaaju se tri stvari:
1. Modul stvara novi prostor imena koji sluºi svim objektima deniranim u pripadnoj izvornoj
datoteci. Ovaj prostor imena dohva¢a se ako funkcije i metode denirane unutar modula koriste
naredbu global.
2. Modul izvr²ava kôd koji je sadrºan unutar novonastalog prostora imena.
3. Modul izvr²ava ime unutar pozivatelja, koje se odnosi na prostor imena modula. Ovo ime podu-
dara se s imenom modula.
U£itavanje, uvoz (eng. import ) vi²estrukih modula izvodi se tako da se iza naredbe import dopi²u
imena modula, odijeljena zarezom, na primjer ovako:
71
72 Moduli i paketi
Moduli se mogu u£itati ( importirati ) koriste¢i alternativna imena, i to upotrebom poveznice as. Na
primjer:
import os as sustav
import socket as mreza, thread as nit
sustav.chdir("..")
mreza.gethostname()
Naredba from koristi se za speci£ne denicije unutar modula s trenuta£nim prostoru imena. Ova
naredba predstavlja pro²irenje naredbe import gdje se uz novo stvoreni prostora imena, stvara i refe-
renca na jedan ili vi²e objekata deniranih untar modula:
Naredba from takoer prihva¢a zarezom odvojena imena objekata. Zvjezdica (engl. asterisk , *) je
sveobuhvatni (engl. wildcard ) znak koji se koristi za u£itanje svih denicija u modulu, osim onih koje
po£inju s podvu£enom crtom (_). Na primjer:
Moduli se mogu preciznije upravljati skupom imena koji se u£ita s from module import * definiranjem
liste __all__. Na primjer:
# module: primjer.py
__all__ = [ 'K', 'primjer' ] # To su sva ona imena koja ¢e se uvu¢i sa *
Nadalje, poveznica as moºe se koristiti za promjenu imena objekata koji se u£itaju s naredbom
from. Na primjer:
Naredba import moºe se pojaviti na bilo kojem mjestu u programu. Meutim, kôd u svakom
modulu izvodi se samo jednom, bez obzira kako £esto se naredba import izvr²ava. Idu¢e import
naredbe jednostavno stvaraju referencu na prostor imena modula koji je stvoren s po£etnom import
naredbom. U varijabli sys.modules moºe se na¢i rje£nik koji sadrºi imena svih trenuta£no napunjenih
modula. On preslikavaa imena modula na njihove objekte. Sadrºaj rje£nika se koristi za odreivanje je
li import napunio svjeºu kopiju modula ili se isti modul poziva drugi put.
Naredba from module import * moºe se koristiti samo na vrhu modula. Drugim rije£ima, nije
dopu²teno koristiti ovaj oblik import naredbe unutar tijela funkcije, zbog njegove interakcije s pra-
vilima funkcijskog dosega (engl. scoping rules ). Svaki modul denira variablu __name__ koja sadrºi
ime modula. Programi mogu ispitivati ovu varijablu i pritom odrediti modul u kojem se programske
naredbe izvr²avaju. Najvi²i (tzv. __main__. Programi zadani
top-level) modul interpretera zove se
__main__ modula. Ponekad
na naredbenoj liniji ili une²eni interaktivno, uvijek se izvode unutar tog
program moºe promijeniti ovo pona²anje, ovisno o tomu je li uvu£en iz modula ili je izveden u __main__
okoli²u. To se moºe posti¢i na ovaj na£in:
8.1. Modul 73
['', '/usr/local/lib/python2.5',
'/usr/local/lib/python2.5/lib-tk',
'/usr/local/lib/python2.5/lib-dynload',
'/usr/local/lib/python2.5/site-packages']
Prazan string odnosi se na trenuta£ni imenik, folder. Novi imenici dodaju se u put traºenja vrlo
jednostavno - dodavanjem £lana (stringa puta) u ovu listu.
• C ili C++ pro²irenja koja su compilirana u zajedni£kim (shared) knjiºnicama ili DLL-ovima.
Kad se na primjer, traºi modul primjer, interpreter pretraºuje svaki od direktorija u sys.path za
sljede¢e datoteke (navedene po redoslijedu pretraºivanja):
4. primjer.pyc
5. primjer.py
Za .py datoteke, kad se modul prvi put u£ita, on se prevede, compilira u meukôd (eng. bytecode )
i zapisuje na disk u datoteku s pro²irenjem .pyc. U idu¢im u£itanjima, interpreter puni ovaj prireeni
meukôd, osim ako ne doe do promjene originalne .py datoteke (pa se .pyc datoteka mora regenerirati.
Datoteke koje zavr²avaju na .pyo koriste se u svezi s interpreterskom -O opcijom. Ove datoteke sadrºe
meukôd s izba£enim brojevima linija i drugim informacijama potrebnim za traºenje pogre²aka (eng.
debugging ). Kao rezultat toga, kôd je ne²to manji i dopu²ta interpretoru ne²to brºe izvoenje. U slu£aju
-OO opcije svi dokumentacijski stringovi se takoer izbacuju iz datoteka. Ovo brisanje dokumentacijskih
stringova pojavljuje se samo kad se .pyo datoteke stvaraju, a ne kad se pune. Ako niti jedna od ovih
74 Moduli i paketi
datoteka ne postoji u niti jednom imeniku (folderu) u sys.path, onda interpreter provjerava da li ime
odgovara imenu nekog ugraenog modula. Ako ni ono ne postoji, onda se podiºe ImportError iznimka.
Compilacija datoteka u .pyc i .pyo datoteke dogaa se samo u sprezi s naredbom import. Programi
izvedeni preko naredbene linije ili preko standardnog ulaza ne proizvode takve datoteke. Naredba
import u traºenju datoteka razlikuje mala i velika slova u njihovom imenu. Kod operacijskih sustava
koji ne podrºavaju tu razliku, potrebno je o tomu voditi ra£una.
import primjer
... neki kôd ...
reload(primjer) # Ponovno puni modul 'primjer'
Sve operacije uklju£ene u modul ¢e se nakon izvoenja naredbe reload() izvesti iz novo u£itanog
kôda. Meutim, reload() ne¢e retroaktivno obnoviti objekte koji su nastali iz starog modula. To zna£i
da je mogu¢e istodobno postojanje referenci na objekte i u staroj i u novoj verziji modula. Nadalje,
compilirane ekstenzije pisane u C ili C++ ne mogu se ponovono puniti naredbom reload(). Kao
op¢e pravilo, treba izbjegavati ponovno punjenje modula, osim za vrijeme razvitka programa i traºenja
pogre²ki u njemu.
8.2 Paketi
Paketi dopu²taju da se vi²e modula skupi zajedno pod jednim zajedni£kim imenom. Ova tehnika
pomaºe u razlu£ivanju sukoba u prostoru imena modula koji se koriste u razli£itim primjenama. Paket
se denira stvaranjem imenika, foldera (engl. directory, folder ) s istim imenom kao paket i stvaranjem
__init__.py datoteke u tom imeniku. Mogu¢e je nakon toga dodavati druge izvorne datoteke (tekstovne
datoteke s Python kôdom), compilirana pro²irenja ili podpakete u istom imeniku. Na primjer, paket se
moºe ovako organizirati:
Graphics/
__init__.py
Primitive/
__init__.py
linije.py
ispuna.py
tekstovi.py
...
Graph2d/
__init__.py
plot2d.py
...
Graph3d/
__init__.py
plot3d.py
...
Formati/
__init__.py
gif.py
png.py
8.2. Paketi 75
tiff.py
jpeg.py
import Graphics.Primitive.ispuna
Ovo u£itava podmodul Graphics.Primitive.ispuna. Sadrºaj tog modula mora se eksplicitno
imenovati, kao na primjer: Graphics.Primitive.ispune.crtaj(img,x,y,color).
Drugi na£in:
u£itava podmodul ispuna i £ini ga raspoloºivim i bez paketnog preksa, na primjer: ispuna.crtaj(img,x,y,color).
Tre¢i na£in:
Ova naredba u£itava podmodul ispuna i £ini crtaj funkciju direktno primjenljivom, primjerice:
crtaj(img,x,y,color). Kad god se neki dio paketa u£ita, importira, kôd u datoteci __init__.py se
tad izvr²i. U najmanjem slu£aju ova datoteka moºe biti i prazna, ali takoer moºe sadrºavati kôd kojim
se izvode inicijalizacije koje su speci£ne za paket. __init__.py za vrijeme
Sve naene datoteke u
u£itavanja, automatski se izvr²avaju. Tako ¢e naredba import Graphics.Primitive.ispuna izvr²iti
__init__.py datoteke i u Graphics imeniku i u Primitive imeniku.
Jedan poseban problem s paketima je obradba ovakve naredbe:
eljeni cilj ove naredbe je u£itati sve module pridruºene u paketu s trenuta£nim prostorom imena.
Meutim, s obzirom da dogovori oko imena datoteka (pogotovo u smislu razlikovanja velikih i malih
slova) variraju od sustava do sustava, Python ne moºe to£no odrediti koje module to£no treba uklju£iti.
Kao rezultat, ova naredba samo u£itava sve reference koje su denirane u __init__.py datoteci u
Primitive imeniku. Ovo se pona²anje moºe promijeniti deniranjem liste __all__ koja sadrºi sva
imena modula pridruºena s paketom.
Takva lista treba biti denirana unutar paketa u __init__.py datoteci, kao na primjer:
# Graphics/Primitive/__init__.py
__all__ = ["linije", "tekstovi", "ispuna",...]
Ako korisnik pokrene naredbu from Graphics.Primitive import * onda se svi navedeni podmo-
duli u£itaju, kako se i o£ekuje. U£itavanje samo imena paketa ne¢e automatski u£itati sve podmodule
koji se nalaze u paketu. Na primjer, sljede¢i kôd ne¢e raditi:
import Graphics
Graphics.Primitive.fill.floodfill(img,x,y,color) # Pogre²no!
# Graphics/__init__.py
import Primitive, Graph2d, Graph3d
# Graphics/Primitive/__init__.py
import linije, tekstovi, ispuna ...
76 Moduli i paketi
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 (foldera) paketa, mogu refe-
Graphics.Primitive.ispuna
rencirati jedan drugog bez navoenja punog imena paketa. Na primjer, modul
moºe u£itati Graphics.Primitive.linije modul jednostavno koriste¢i naredbu import linije. Me-
utim, ako je modul smje²ten u drugom imeniku, onda se mora koristiti puno ime paketa. Na primjer,
akoplot2d iz modula Graphics.Graph2d traºi upotrebu linije iz modula Graphics.Primitive, mora
se koristiti puna staza imena:from Graphics.Primitive import linije. Ako je potrebno, modul
moºe ispitati svoju __name__ varijablu kako bi na²ao potpunu stazu svog imena. Na primjer, sljede¢i
kôd u£itava modul iz sestrinskog podpaketa znaju¢i samo ime tog podpaketa (a ne i najvi²e ime s vrha
paketa):
# Graphics/Graph2d/plot2d.py
# Odreuje ime paketa, gdje je smje²ten moj paket
import string
base_package = string.join(string.split(__name__,'.')[:-2],'.')
Kona£no, kad Python u£itava paket, on denira posebnu varjablu__path__ koja sadrºi listu imenika
__path__ je posebna ina£ica sys.path
koji se pretraºuju, kad se se traºe paketni podmoduli. (Varijabla
varijable.) __path__ je dohvatljiv za kôd sadrºan u datoteci __init__.py i inicijalno sadrºi jedan £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.
POGLAVLJE 9
Ulaz i izlaz
Pod pojmom ulaz/izlaza razmatraju se mogu¢i argumenti naredbene linije, varijable okoline, rad s
datotekama, naredba (ili funkcija) 'print', te o£uvanje programskih objekta.
# printopt.py
# Print all of the command-line options
import sys
for i in range(len(sys.argv)):
print "sys.argv[%d] = %s" % (i, sys.argv[i])
Izvoenjem programa dobije se sljede¢e:
import os
path = 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¢nost
pozivom funkcije os.putenv() function. Na primjer:
os.environ["FOO"] = "BAR"
os.putenv("FOO","BAR")
77
78 Ulaz i izlaz
9.2 Datoteke
Ugraena funkcija open(name [,mode ]) otvara i stvara datoteke, kao ²to sljedi:
Metode Opis
f.read([n]) £ita najvi²e n okteta (engl. bytes )
£ita jednu ulaznu liniju do najvi²e n znakova.
f.readline([n])
Ako se n iizostavi, onda £ita cijelu liniju.
f.readlines() £ita sve linije i vra¢a listu.
Returns an opaque sequence object where
f.xreadlines()
each iteration reads a new line from the le.
f.write(s) Upisuje u datoteku string s .
f.writelines(l ) Upisuje u datoteku sve stringove iz liste l .
f.close() Zatvara datoteku.
Vra¢a trenuta£no kazalo (brojilo znakova)
f.tell()
datoteke.
f.seek(offset [, where ]) Traºi novu poziciju u datoteci.
f.isatty() Vra¢a 1 ako je f interactivni terminal.
Sprema (eng. ushes ) izlazni mem. bufer u
f.flush()
datoteku.
f.truncate([size]) Skra¢uje datoteku na najvi²e size okteta.
f.fileno() Vra¢a cjelobrojni identikator datoteke.
f.readinto(buffer,nbytes U£itava nbytes podataka iz memorijskog buer
) objekta.
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¢u
liniju ulaza, uklju£uju¢i i znak zavr²etka linije (eng. newline terminator ); metoda readlines() vra¢a
sve 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 ne
bri²e, ve¢ se u£itava u idu¢im £itanjima. Obje metode: readline() i readlines() ovise o operacijskom
sustavu te obrauju na razli£ite na£ine zavr²etke linija (na primjer, '
n' u odnosu na '
r
n'). 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 radi
readlines() metoda. Na primjer:
9.3. Standardni ulaz, izlaz i pogre²ka (engl. Input, Output, Error) 79
Atributi Opis
Boolova vrijednost koja pokazuje stanje
f.closed datoteke:0 ako je datoteka otvorena, a 1 ako je
zatvorena.
f.mode Ulazno/izlazni mod (I/O) za datoteku.
Ime datoteke, ako je otvorena s open(). Ina£e,
f.name atribut predstavlja string koji pokazuje izvorni
kod datoteke.
Boolova vrijednost koja pokazuje da li se
f.softspace praznina treba ispisivati ispred druge
vrijednosti kad se koristi print naredba.
def gets():
text = ""
while 1:
c = sys.stdin.read(1)
text = text + c
if c == '\n': break
return text
Alternativno, ugraena funkcija raw_input(prompt) moºe £itati liniju teksta sa standardnog ulaza
stdin :
s = raw_input("type something : ")
print "You typed '%s'" % (s,)
80 Ulaz i izlaz
Kona£no, nasilni prekid preko tipkovnice (naj£e²¢e generiran sa Ctrl+C) rezultira u KeyboardInterrupt
izuzetku koji se moºe dohvatiti koriste¢i potporu izuzetaka (eng. exception handler ). Ako je potrebno
vrijednosti odsys.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 takoer dohvatljive
u sys.__stdout__, sys.__stdin__ i sys.__stderr__. Dobro je primjetiti da se u nekim slu£ajima
sys.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.stdin
zamjenjuje s objektom koji se pona²a kao datoteka, iako je on stvarno objekt razvojnog okruºenja. U
ovom slu£aju, stanovite metode niske razine kao ²to su read() i seek() ne mogu se izvoditi.
Za svaki se objekt poziva funkcija str() kako bi proizvela string na izlazu.. Ovi izlazni stringovi se
onda povezuju i meusobno odjeljuju prazninama, kako bi se proizveo kona£ni izlazni string. Izlaz se
zaklju£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:
Mogu¢e je promijeniti odredi²te print naredbe dodaju¢i specijalni file modifikator, gdje je file
datoteka objekta u koju korisnik pi²e. Na primjer:
f = open("izlaz","w")
print >>f, "Ovdje Python!"
...
f.close()
S po²tovanjem,
Python Mlai
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:
9.5. Otpornost 81
form = """\
Dragi %(ime)s,
Molim Vas vratite mi moj %(vlasnistvo)s ili mi platite $%(iznos)0.2f Eura.
S po²tovanjem,
Python Mlai
"""
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 napisati
jednu 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£ini
niz funkcija za spremanje objekta u datoteku i isto tako funkcije za £itanje. Tu mogu nastati razli£iti
pristupi, ovisno o sklonostima i razmi²ljanju programera. Jedan ugraeni pristup ovom problemu je
serijalizacija objekta koja se postiºe upotrebom pickle i shelve modula. Modul pickle serijalizira
objekt u tok okteta (eng. stream of bytes ) koje se mogu zapisati u datoteku. Na primjer, sljede¢i kôd
zapisuje objekt u datoteku:
import pickle
object = someObject()
f = open(filename,'w')
pickle.dump(object, f) # Sprema objekt
Ponovno obnavljanje objekta postiºe se sljede£im kôdom:
import pickle
f = 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 shelve
object = someObject()
dbase = shelve.open(filename) # Otvara bazu
dbase['key'] = object # Sprema objekt u bazu
...
object = dbase['key'] # Vra¢a objekt iz baze
dbase.close() # Zatvara bazu
U oba slu£aja, samo se serijalizirani objekti mogu spremiti u datoteku. Ve¢ina Python objekata
se moºe serijalizirati, ali objekti posebne vrste, kao ²to su na primjer datoteke, ne mogu se spremati i
obnavljati na ovaj na£in.
Literatura
[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