Professional Documents
Culture Documents
Intermediate skripta
Uvod u srednji stupanj Python-a
Josip Katalinić
Zagreb, 2016.
Sadržaj
1. Dokumenti................................................................................................................................................. 3
1.1. Zapisivanje podataka u dokument...................................................................................................... 4
1.2. Čitanje podataka iz datoteke .............................................................................................................. 4
1.3. Čitanje linije po liniju ........................................................................................................................ 5
1.4. Konkatenacija nove linije stringu ...................................................................................................... 5
1.5. Čitanje stringa i micanje nove linije s kraja ....................................................................................... 6
1.6. Dodavanje podataka u postojeći dokument ....................................................................................... 6
1.7. Čitanje i zapisivanje numeričkih vrijednosti ...................................................................................... 7
1.8. Korištenje petlje za obadu datoteke ................................................................................................... 8
1.9. Čitanje dokumenta sa petljom i detektiranje kraja dokumenta .......................................................... 8
1.10. Korištenje for petlje za čitanje linija ................................................................................................ 9
2. Iznimke ..................................................................................................................................................... 9
2.1. TypeError iznimka ........................................................................................................................... 10
2.2. IOError iznimka ............................................................................................................................... 10
3. Liste ........................................................................................................................................................ 12
3.1. Uvod u liste ...................................................................................................................................... 12
3.2. Operator ponavljanja ........................................................................................................................ 12
3.3. Iteracija preko liste sa for petljom.................................................................................................... 13
3.4. Indeksiranje liste .............................................................................................................................. 13
3.5. Len funkcija ..................................................................................................................................... 13
3.6 Liste su promjenjive .......................................................................................................................... 14
3.7. Konkatenacija lista ........................................................................................................................... 14
3.8. List slicing........................................................................................................................................ 15
3.9. Pronalaženje elemenata u listi sa in operatorom .............................................................................. 15
3.10. Metode liste.................................................................................................................................... 16
4. Rječnici ................................................................................................................................................... 18
4.1. Kreiranje rječnika i operacije na rječnicima .................................................................................... 18
4.2. Miješanje tipova podataka u rječniku .............................................................................................. 19
4.3. Korištenje for petlje za iteraciju kroz rječnik................................................................................... 20
4.4. Metode rječnika ............................................................................................................................... 21
5. Klase i Objektno orijentirano programiranje .......................................................................................... 23
5.1 Klase ................................................................................................................................................. 23
1
Python_102
5.2 Definicija klase ................................................................................................................................. 23
5.3. Instance ............................................................................................................................................ 24
5.4. Pristup vrijednosti putem self .......................................................................................................... 25
5.5 __init__ ............................................................................................................................................. 27
5.6 Skrivanje atributa .............................................................................................................................. 28
5.7. Nasljeđivanje.................................................................................................................................... 29
6. Skupovi (sets).......................................................................................................................................... 30
6.1 Kreacija seta i operacije na setovima ................................................................................................ 30
7. Rekurzija ................................................................................................................................................. 35
7.1 Rješavanje problema uz pomoć rekurzije ......................................................................................... 36
8. Izgrađivanje programa kroz klase ........................................................................................................... 38
8.1 Postavljanje objekata kao argumenta ................................................................................................ 39
9. Serijalizacija Objekta .............................................................................................................................. 40
9.1. Deserijalizacija objekta .................................................................................................................... 41
10. Operator overloading ............................................................................................................................ 42
10.1. __sub__ .......................................................................................................................................... 42
10.2. __add__ .......................................................................................................................................... 43
10.3. __mul__ ......................................................................................................................................... 44
10.4. __div__ .......................................................................................................................................... 45
2
Python_102
1. Dokumenti
Kada program treba spremiti podatke za kasniju uporabu, zapisujemo podatke u dokument.
Baviti ćemo se tekstualnim tipom dokumenata, u Python-u postoje dva načina pristupa spremljenim
podatcima unutar dokumenta:
a) sekvencijalni pristup dokumentu – gdje pristupamo podatcima od početka dokumenta, sve do kraja
dokumenta (ako želimo pristupiti podatku koji je na kraju dokumenta, moramo proći cijeli dokument)
b) direktni pristup dokumentu – gdje pristupamo podatcima tako da direktno odlazimo do željenog
podatka, bez potrebe za prolaženjem podataka koji su prije željenog podatka
Za usporedbu sekvencijalni pristup možemo promatrati kao kazetu koju premotavamo, gdje moramo
proći sve pjesme da bi došli do željene pjesme, dok direktni pristup bi odgovarao CD-u, gdje možemo
pristupiti bilo kojoj pjesmi bez potrebe prolaska pjesama koje su bile prije.
Postoje 3 moda:
''r'' – otvara se dokument samo za čitanje, dokument se ne može izmijeniti, odnosno ne možemo
zapisati ništa u njega
''w'' – otvaramo dokument za zapisivanje, ako dokument već postoji izbrisati će se njegov sadržaj, ako ne
postoji kreiraj ga
''a'' – otvaramo dokument za zapisivanje, svi podatci zapisani u dokument će biti dodani na kraj
dokumenta, ako dokument ne postoji kreiraj ga
Da bi Python mogao raditi sa dokumentima na disku kompjutera, program mora kreirati tip podataka file
koji se asocirao sa dokumentom, tip podataka file možemo referencirati varijablom čime efektivno
referenciramo dokument.
3
Python_102
Npr. ukoliko kreiramo dokument vjezba.txt u istom folderu gdje nam je kreiran i .py program, možemo
ga otvoriti tako što koristimo:
print type(vjezba_file)
Također ukoliko .txt dokument nije u istom folderu gdje je kreiran .py program, možemo specificirati
putanju, npr. ukoliko se .txt nalazi na desktopu, a .py se nalazi na nekom drugom mjestu, putanju ćemo
pisati npr. :
print type(vjezba_file)
ime = "Pero"
vjezba_file.write("Peric\n")
vjezba_file.write(ime)
print type(vjezba_file)
vjezba_file.close()
def main():
procitano = test_dok.read()
test_dok.close()
print procitano
main()
4
Python_102
>> Pero
Peric
def main():
procitano1 = test_dok.readline()
procitano2 = test_dok.readline()
test_dok.close()
print procitano1
print procitano2
main()
>> Pero
Peric
def main():
5
Python_102
prijatelji_dok.write(prijatelj1+"\n")
prijatelji_dok.write(prijatelj2+"\n")
prijatelji_dok.close()
main()
def main():
linija1 = prijatelji_dok.readline()
linija2 = prijatelji_dok.readline()
prijatelji_dok.close()
print linija1.rstrip("\n")
print linija2.rstrip("\n")
main()
>> Pero
Mato
- ako dokument postoji neće biti izbrisan, ako dokument ne postoji biti će kreiran
6
Python_102
- kada podatak zapisujemo u dokument, zapisat će se na kraju sadržaja dokumenta
def main():
prijatelji_dok.write("Josip\n")
prijatelji_dok.write("Ivan\n")
prijatelji_dok.close()
main()
def main():
dok.write(str(br_1) + "\n")
dok.write(str(br_2) + "\n")
dok.close()
7
Python_102
main()
def main():
str(broj)+": "))
br_dok.write(str(prodaja)+"\n")
br_dok.close()
main()
def main():
linija = prod_dok.readline()
8
Python_102
while linija != "":
kolicina = float(linija)
linija = prod_dok.readline()
prod_dok.close()
main()
def main():
kolicina = float(linija)
prod_dok.close()
main()
2. Iznimke
Iznimka je error koji se događa dok je program pokrenut, te uzrokuje naglo zaustavljanje programa.
Možemo koristiti try/excet izjavu za rukovanje iznimkama.
try:
9
Python_102
izjava
except NazivIznimke:
izjava
ime = ''Pero''
godine = 25
No sada možemo upozoriti korisnika kroz except navođenjem naziva iznimke, da konkatenacija mora sa
tipovima podataka string.
ime = "Pero"
godine = 25
try:
except TypeError:
def main():
10
Python_102
dok = open(naziv_dok, "r")
sadrzaj = dok.read()
print sadrzaj
dok.close()
main()
Već smo spomenuli, ukoliko bi unijeli naziv dokumenta koji ne postoji dobili bi IOError, no sada ga
možemo uhvatiti unutar except izjave, te ispisati da navedeni dokument ne postoji.
def main():
try:
sadrzaj = dok.read()
print sadrzaj
dok.close()
except IOError:
main()
11
Python_102
3. Liste
Sekvenca – drži višestruki broj podataka, poredanih jedan za drugim, na sekvencama se mogu provoditi
specifične operacije s kojima možemo ispitati i manipulirati svaki podatak.
Primjer liste sa 4 elementa tipa integer, koju smo pridružili varijabli godine:
Ukoliko lista sadrži samo jedan tip podataka, naziva se lista stringova, int-ova itd.
Budući da lista ima svojstvo prihvaćanja različitih tipova podatka, možemo napisati sljedeće:
print godine
brojevi = range(1,4+1)
print brojevi
> >[1, 2, 3, 4]
lista * n
brojevi [0] * 5
print brojevi
>>[0, 0, 0, 0, 0]
brojevi = [1, 2, 3] * 3
print brojevi
12
Python_102
>>[1, 2, 3, 1, 2, 3, 1, 2, 3]
brojevi = [1, 2, 3]
for i in brojevi:
print i
main()
>>1
brojevi = [1, 2, 3]
>>1 2 3
brojevi = [1, 2, 3]
print brojevi[3]
brojevi = [1, 2, 3]
len(brojevi)
>>3
- len funkcija se može koristiti da bi se zaustavila IndexError iznimka prilikom iteracije liste sa petljom.
13
Python_102
def main():
brojevi = [1, 2, 3]
index = 0
print brojevi[index]
index+=1
main()
>> 1
brojevi = [1, 2, 3]
brojevi[0] = 10
print brojevi
>> [10, 2, 3]
lista1 = [1,2,3]
lista2 = [4,5,6]
lista3 = lista1+lista2
print lista3
>>[1, 2, 3, 4, 5, 6]
print sva_imena
14
Python_102
>>['Pero', 'Mato', 'Marija', 'Dora']
naziv_liste[pocetak:kraj]
vikendi = dani[5:7]
print vikendi
>>['Sub', 'Ned']
print dani[:]
print dani[:2]
>>['Pon', 'Uto']
print dani[2:]
print dani[1:8:2]
print dani[-1]
>>''Ned''
print dani[-2:]
>>['Sub', 'Ned']
print dani[:-2]
15
Python_102
print "Pon" in dani
>>True
False
brojevi = [1,2]
brojevi.append(3)
print brojevi
>>[1, 2, 3]
brojevi = [1,2]
brojevi.append("tri")
print brojevi
[1, 2, 'tri']
brojevi = [1,2]
print brojevi.index(1)
>>0
brojevi = [1,2]
print brojevi.index(2)
>>'0
c) insert(index, predmet) – insert stavlja određeni predmet na specificirani indeks, kada je predmet
stavljen u listu lista je proširena
brojevi = [1,2]
brojevi.insert(2,3)
>> [1, 2, 3]
16
Python_102
brojevi = [1,2]
brojevi.insert(0,"jedan")
print brojevi
>> ['jedan', 1, 2]
brojevi = [2,1]
brojevi.sort()
print brojevi
>> [1, 2]
imena.sort()
print imena
e) remove(predmet) – uklanja prvo pojavljivanje predmeta iz liste, ValueError iznimka se poziva ukoliko
predmet nije nađen u listi
imena.remove("Ana")
print imena
>> ['Mato']
imena.remove("Ivo")
print imena
17
Python_102
4. Rječnici
U Pythonu rječnik je objekt koji sprema kolekciju elemenata, svaki element koji je spremljen u rječniku
ima dva dijela, ključ i vrijednost, te se nazivaju ključ-vrijednost par.
rječnik = {ključ:vrijednost}
S time da ključ mora biti jednostavan tip podatka (string, float, int, boolean).
Operacije na rječnicima
rječnik[ključ]
Tako npr. ukoliko želimo dobiti vrijednost telefonskog broja od Pere koristimo:
print telefonski_imenik["Pero"]
>>>019435
b) Koristeći in, kao i not in operator možemo testirati nalaze li se određene vrijednosti u rječniku.
if "Pero" in telefonski_imenik:
print telefonski_imenik["Pero"]
rječnik[ključ] = vrijednost
Tako da možemo dodati novi element u rječnik čiji ključ je ''Ivo'', te vrijednost ''012523''
18
Python_102
telefonski_imenik["Ivo"] = "012523"
print telefonski_imenik
d) Brisanje elemenata
Možemo izbrisati ključ-vrijednost par iz rječnika sa del izjavom, generalni format je:
del naziv_rječnika[ključ]
del telefonski_imenik["Pero"]
print telefonski_imenik
>>>{'Mato': '012432'}
if "Ivo" in telefonski_imenik:
del telefonski_imenik["Ivo"]
print len(telefonski_imenik)
>> 2
telefonski_imenik = {}
telefonski_imenik[''Pero''] = ''019435''
19
Python_102
telefonski_imenik = {"Pero":3, 3.2:320, "Ivo":[25,1990,185]}
print telefonski_imenik["Ivo"]
>>> [25,1990,185]
print len(telefonski_imenik["Ivo"])
>>>3
print zaposlenik["oib"]
>>>20363234
izjava
izjava
print korisnik
>>>
Mato
Ivo
Pero
20
Python_102
for korisnik in telefonski_imenik:
>>>
Mato 012432
Ivo 012523
Pero 019435
Clear metoda briše sve elemente u rječniku ostavljajući rječnik praznim, generalni format je:
rječnik.clear()
telefonski_imenik.clear()
print telefonski_imenik
>>>{}
b) Get metoda
Get metoda se koristi kao alternativa [] operatoru za dobivanje vrijednosti na temelju ključa, s tim
ukoliko se ne nađe specificirani ključ, metoda ne izaziva iznimku već se ispisuje drugi argument metode,
generalni format
rječnik.get(ključ, ispis)
>>>
21
Python_102
019435
c) keys metoda
print telefonski_imenik.keys()
>>>
d) pop metoda
Pop metoda vraća vrijednosti asocirane sa specifičnim ključevima i briše ključ-vrijednost par iz rječnika,
ako ključ nije nađen metoda ispisuje drugi argument, generalni format:
rječnik.pop(ključ, ispis)
print telefonski_imenik
print izbrisani_pero
>>>
019435
e) values metoda
print telefonski_imenik.values()
>>>
22
Python_102
5. Klase i Objektno orijentirano programiranje
Proceduralno programiranje je metoda pisanja softvera koja se bazira oko funkcija koje obavljaju
određeni zadatak npr. dobivanje inputa od korisnika, čitanje i zapisivanje u dokument, ispisivanje inputa
itd…
Proceduralno programiranje može dovesti do određenih problema, uzmimo za primjer rad na velikom
programu koji ima korisnike u bazi podataka, program je dizajniran da ima tri varijable ime, adresu i
telefonski broj. Naš posao bi bio napraviti funkcije koje pristupaju tim trima varijablama, te ovisno o
ulozi funkcije rade drugačije zadatke. Ovdje možemo uočiti jedan problem, ukoliko odlučimo da program
više neće imati tri varijable, već da će se podatci spremati unutar liste, morali bi izmijeniti svaku funkciju
gdje se pojavljuju varijable, da bi ih spremili unutar liste.
Podatak u objektu je poznat kao data atribut koji označava ništa druge nego varijable koji referenciraju
vrijednosti.
Procedure koji objekt izvršava zovu se metode, dok metode možemo gledati kao funkcije objekta koje
izvršavaju operacije na data atributima.
5.1 Klase
Programer odlučuje koji su mu atributi potrebi, kao i metode za specifičan objekt, te onda kreira klasu.
Klasu možemo promatrati kao nacrt kroz koji su objekti kreirani, kada koristimo takav jedan „nacrt“ da bi
izgradi objekt (npr. kuću), kažemo da izgrađujemo instancu kuće koja je opisana nacrtom.
Još jedan od primjera bi mogao poslužiti za opis razlike klase i objekta je kalup za kolače i sami kolač.
Kalup za kolače nije sami kolač, no opisuje kolač, također kalup za kolače može kreirati više instanci
kolača uz pomoć istog kalupa.
class NazivKlase:
atributi
metode
23
Python_102
Na primjer kreirajmo klasu Ime koja sadrži atribut naziv čija je vrijednost ''Pero'', te za zatim ispisuje
class Ime:
naziv = ''Pero''
print naziv
Ime()
>>Pero
U gornjem primjeru vidimo kreiranu klasu Ime, koja u svojoj definiciji sadrži atribut naziv koji je zatim
ispisan.
Nakon što je klasa Ime kreirana i definirana, pozivamo ju poput funkcije sa dvostrukim zagradama
Ime()
Kreirajmo klasu Voce koja sadrži metodu Naziv, te zatim ispisuje naziv voća
class Voce:
print naziv_voca
Voce().Naziv("Banana")
U ovom primjeru vidimo metodu Naziv koja sadrži 2 parametra, jedan obavezni self, i jedan proizvoljni
naziv_voca, nakon poziva klase Voce() sa notacijom točke smo pozvali metodu Naziv i predali joj
argument ''Banana'' koji je potom ispisan.
5.3. Instance
Instanca je individualni objekt određene klase.
naziv_instance = naziv_klase()
24
Python_102
Uzmimo prijašnji primjer sa voćem i kreirajmo 2 instance, instancu banana i instancu mango.
class Voce:
print naziv_voca
banana = Voce()
mango = Voce()
banana.Naziv("Banana")
mango.Naziv("Mango")
Ovdje vidimo kreirane 2 instance, banana i mango. Nakon što su kreirane instance, preko njih možemo
pozvati metode koje sadrži klasa iz koje su instance kreirane. U našem primjeru na instanci banana
pozivamo metodu Naziv kojoj kao argument dajemo string ''Banana'', dok na instanci mango pozivamo
također metodu Naziv kojoj kao argument dajemo string ''Mango''
a) Kao proizvoljno definirana self varijabla u tijelu metode, kojoj pridružujemo vrijednost parametra
Generalni format:
class Klasa:
self.moja_varijabla = parametar
Kreirajmo klasu Ime koja ima dvije metode, Naziv i Ispis, te definirajmo proizvoljnu self varijablu ime,
kojoj će biti pridružena vrijednost parametra naziv unutar tijela metode Naziv. Zatim kroz metodu Ispis
koja sadrži obavezni parametar self, ispišimo našu ''globalnu'' varijablu self.ime
class Ime:
self.ime = naziv
25
Python_102
def Ispis(self):
print self.ime
pero = Ime()
pero.Naziv("Pero")
pero.Ispis()
*U mnogim primjerima se često koristi isti naziv za self varijablu, kao i za parametar koji se pridružuje
self varijabli, tako umjesto self.ime = naziv, piše se self.naziv = naziv.
b) Kao proizvoljno definirana varijabla klase, kojoj možemo pristupiti putem self varijable, s time da self
varijabla ne može biti proizvoljna nego mora imati isto ime kao i varijabla klase na koju se poziva.
Generalni format:
class Klasa:
def Metoda(self):
self.ime = ''Mato'' #pristupili smo varijabli klase ime, te joj promijenili vrijednost u ''Mato''
Kreirajmo klasu Ime koja ima varijablu klase nadimak čija je vrijednost string ''Perica'', vrijednost
nadimak izmijenimo u tijelu metode Naziv u ''Perko'', te zatim ispišimo novu vrijednost varijable
nadimak
class Ime:
nadimak = "Perica"
def Naziv(self):
self.nadimak = "Perko"
print self.nadimak
pero = Ime()
pero.Naziv()
26
Python_102
5.5 __init__
__init__ (dva underscore s obje strane) označava inicijalizaciju, odnosno metoda sa nazivom __init__ će
biti automatski pozvan prilikom kreiranja instance klase, kao i prilikom poziva klase
class Hrana:
def __init__(self):
def Burek(self):
print "Burek"
burek = Hrana()
burek.Burek()
>>init je pozvan
>>Burek
class Hrana:
prilog = "Vrhnje"
def __init__(self):
self.prilog = "Jogurt"
def Burek(self):
burek = Hrana()
burek.Burek()
27
Python_102
U ovom programu smo promijenili vrijednost varijable klase prilog koja ima string vrijednost ''Vrhnje'',
kroz __init__ u ''Jogurt''
class Hrana:
prilog = "Vrhnje"
def Burek(self):
print self.prilog
burek = Hrana()
burek.prilog = "Jogurt"
burek.Burek()
>>Jogurt
U ovom programu smo promijenili vrijednost varijable klase u Jogurt, kroz instancu burek.
Ukoliko želimo učiniti atribute privatnim, na način da im te može pristupiti vanjski kod te izmijeniti
njihovu vrijednost to činimo dvostrukim underscore __
class Hrana:
__prilog = "Vrhnje"
def Burek(self):
print self.__prilog
burek = Hrana()
burek.prilog = "Jogurt"
burek.Burek()
>>Vrhnje
28
Python_102
5.7. Nasljeđivanje
Nasljeđivanje omogućuje proširivanje funkcionalnosti klase kroz prethodno kreirane klase.
Njemački ovčar je pas, auto je vozilo, cvijet je biljka, trokut je oblik, nogometaš je sportaš…
Pod klasu možemo smatrati kao proširenom verzijom parent klase, child klasa nasljeđuje atribute i
metode iz parent klasa bez da ih moramo ponovno pisati.
Također novi atributi i metode mogu biti dodani u child klasu, te je to ono što ju čini specijaliziranom
verzijom child klase.
Generalni format:
class Child(Parent_klasa)
Tako na primjer možemo kreirati parent klasa Slatko koja ima metodu Secer koja ispisuje ''Secer'', te
child klasa Cokolada koja nasljeđuje atribute i metode iz parent klase Slatko.
class Slatko:
sastojak = "Kakao"
def Secer(self):
class Cokolada(Slatko):
def Milka(self):
print "Milka"
29
Python_102
svizac = Cokolada()
svizac.Secer()
svizac.Milka()
Nakon što smo kreirali instancu na child klasi koja je naslijedila atribute i metode parent klase, možemo
pozvati sve metode parent klase.
6. Skupovi (sets)
Skup(set) sadrži kolekciju unikatnih vrijednosti, te ga shvaćamo poput matematičkih skupova.
brojevi = set()
Set se kreira tako što kao argument funkciji set predamo listu sa različitim elementima:
brojevi = set([1,2,3])
print brojevi
>>set([1, 2, 3])
brojevi = set([1,2,3])
print len(brojevi)
>>>3
Za dodavanje elemenata u listu koristimo add metodu, gdje kao argument dajemo željenu vrijednost,
ukoliko dodamo vrijednost koja već postoji, ta vrijednost neće biti dodana u set.
brojevi = set()
30
Python_102
brojevi.add(1)
brojevi.add(2)
brojevi.add(3)
print brojevi
Ukoliko želimo dodati grupu elemenata koristimo update metodu, gdje kao argument možemo staviti
(listu, string ili pak drugi set)
brojevi1 = set([1,2,3])
brojevi2 = set([4,5,6])
brojevi2.update([7,8,9])
brojevi1.update(brojevi2)
print brojevi1
print brojevi2
>>>
set([1, 2, 3, 4, 5, 6, 7, 8, 9])
set([4, 5, 6, 7, 8, 9])
Ukoliko želimo izbrisati element seta koristimo remove ili discard metodu, ove dvije metode se razlikuju
u tome kako se ponašaju kada specifičan element nije pronađen u setu, budući da remove poziva
KeyError iznimku, dok discard ne poziva iznimku.
brojevi = set([1,2,3])
brojevi.remove(1)
brojevi.discard(2)
print brojevi
>>> set([3])
brojevi = set([1,2,3])
brojevi.remove(4)
>>>
31
Python_102
KeyError: 4
brojevi = set([1,2,3])
brojevi.discard(4)
izjava
izjava
brojevi = set([1,2,3])
print element
>>>
brojevi = set([1,2,3])
if 2 in brojevi:
>>>
Broj 2 je u setu
Također možemo koristiti not in operator da bi utvrdili ne postoji li određena vrijednost u setu.
brojevi = set([1,2,3])
32
Python_102
if 4 not in brojevi:
>>>
Unija dva seta je unija koja sadrže elemente iz oba seta, generalni format je:
set1.unija(set2)
brojevi1 = set([1,2,3,4])
brojevi2 = set([2,3,4,5])
unija = brojevi1.union(brojevi2)
print unija
>>>
set([1, 2, 3, 4, 5])
Presjek dva seta je set koji sadrži samo elemente koji su u oba seta, generalni format je:
set1.intersection(set2)
brojevi1 = set([1,2,3,4])
brojevi2 = set([2,3,4,5])
presjek = brojevi1.intersection(brojevi2)
print presjek
>>>
set([2, 3, 4])
33
Python_102
Razlika seta1 i seta2 su elementi koji se pojavljuju u setu1, ali se ne pojavljuju u setu2, generalni format
je:
set1.difference(set2)
brojevi1 = set([1,2,3,4])
brojevi2 = set([2,3,4,5])
razlika = brojevi1.difference(brojevi2)
print razlika
>>>
set([1])
Simetrička razlika se odnosi na elemente koji su u jednom setu, ali ne u oba, generalni format je:
set1.symetric_difference(set2)
brojevi1 = set([1,2,3,4])
brojevi2 = set([2,3,4,5])
sim_razlika = brojevi1.symmetric_difference(brojevi2)
print sim_razlika
>>>
set([1, 5])
Ukoliko set2 sadrži sve elemente seta1, onda se kaže da je set2 podskup seta1, generalni format je:
brojevi1 = set([1,2,3,4])
34
Python_102
brojevi2 = set([2,3,4])
print brojevi2.issubset(brojevi1)
>>>
True
Ukoliko set1 sadrži sve elemente seta2, onda se kaže da je set1 nadskup seta2, generalni format je:
brojevi1 = set([1,2,3,4])
brojevi2 = set([2,3,4])
print brojevi1.issuperset(brojevi2)
>>>
True
7. Rekurzija
Rekurzivna funkcija je funkcija koja poziva sebe.
def main():
poruka()
def poruka():
poruka()
main()
def main():
poruka(5)
def poruka(ponavljanja):
35
Python_102
if ponavljanja > 0:
poruka(ponavljanja -1)
main()
def main():
fact = faktorijal(broj)
def faktorijal(unos):
if unos == 0:
return 1
else:
main()
def main():
brojevi = [1, 2, 3, 4, 5, 6, 7, 8, 9]
suma = range_sum(brojevi, 2, 5)
36
Python_102
return 0
else:
main()
If n = 0 onda Fib(n) = 0
If n = 1 onda Fib(n) = 1
def fib(n):
if n == 0:
return 0
elif n == 1:
return 1
else:
def main():
print(fib(broj))
37
Python_102
def fib(n):
if n == 0:
return 0
elif n == 1:
return 1
else:
main()
1. Naziv klase
3. Metode
Programi koji koriste klase često koriste get/set metode, koji omogućuju dodatnu fleksibilnost
manipulacije podataka.
Get metoda omogućuje postavljanje, dok set metoda omogućuje pristup podatcima.
#automobil.py
class Automobil:
def __init__(self, proizvodjac, model):
self.__proizvodjac = proizvodjac
self.__model = model
38
Python_102
def set_proizvodjac(self, proizvodjac):
self.__proizvodjac = proizvodjac
def set_model(self, model):
self.__model = model
def get_proizvodjac(self):
return self.__proizvodjac
def get_model(self):
return self.__model
volvo.set_model("S90")
bmw.set_proizvodjac("Bayerische Motoren Werke")
print volvo.get_proizvodjac()
print bmw.get_model()
U ovom primjeru kreirana je set/get metoda koje pridružuju/vraćaju vrijednost parametra na self
varijablu.
Kreiramo instancu volvo putem Automobil klase, dajemo 2 argumenta koja su definirana unutar __init__
funkcije (proizvodjac, model).
Nakon što je instanca kreirana ona sadrži set i get metode, te proizvoljno možemo mijenjati/pozivati
proizvodjaca i model.
39
Python_102
#grad.py
class Grad:
def __init__(self,naziv):
self.__naziv = naziv
def get_naziv(self):
return self.__naziv
#poziv.py
import grad
zg = grad.Grad("ZG")
def vanjski_kod(grad):
vanjski_kod(zg.get_naziv())
Ovdje vidimo primjer gdje smo unutar poziv.py pozvali dokument grad (import grad), te kreirali instancu
zg = grad.Grad(''ZG''), nakon toga smo kreirali funkciju vanjski_kod, koja prima 1 parametar, te ga
ispisuje konkatenirajući vrijednost parametra grad + '' naziv grad''.
Nakon toga smo pozvali funkciju dajući za argument, metodu get_naziv instance zg), koja je u našem
slučaju string vrijednosti ''ZG'', budući da get_naziv vraća self varijablu koja je postavljena u __init__
''ZG'' prilikom kreiranja instance zg.
9. Serijalizacija Objekta
Serijalizacija objekta je proces pretvaranja objekta u bajtove koji mogu biti spremljeni za kasnije
korištenje. U Pythonu, proces serijalizacije se naziva pickling.
40
Python_102
Python standardna knjižnica pruža modul koji se zove pickle, te nam omogućuje različite funkcije za
serijalizaciju/pickling objekta.
Nakon što smo napravili import pickle modula, radimo sljedeće korake za serijalizaciju objekta:
2. Pozivamo na pickle modulu dump metodu, koja nam omogućuje serijalizaciju objekta i zapisivanje u
specifični dokument
pickle.dump(objekt, spremljeni_dokument)
3. Nakon što smo serijalizirali sve objekta koje želimo, zatvaramo datoteku
spremljeni_dokument.close()
Cijeli algoritam:
import pickle
pickle.dump(imena, pohrana)
pohrana.close()
41
Python_102
2. Zovemo funkciju load modula pickle, da bi otvorili objekt iz dokumenta
ucitano = pickle.load(pohrana)
pohrana.close()
Cijeli algoritam:
import pickle
ucitano = pickle.load(pohrana)
pohrana.close()
print type(ucitano)
10.1. __sub__
Uzmimo za primjer operator overloading za oduzimanje __sub__:
class Broj:
self.broj = broj
x = Broj(5)
a=x-2
42
Python_102
print a.broj
>>>9
Ovdje vidimo zanimljiv primjer gdje ukoliko na instanci pozovemo operator oduzimanja
a=x -2
Pozivamo __sub__ operator overloading metodu, koja su svojem tijelu ima sintakstu
return NazivKlase(atributi)
Upravo ovdje kreiramo naše custom ponašanje ukoliko se na instanci pozove operator oduzimanja,
poštujući gore navedenu sintaksu možemo stavljati opcionalne parametre, te ponašanja koja nama
odgovaraju. Poput konkatenacije, zbrajanja, oduzimanja, množenja, dijeljenja, potenciranja…
Jedno od naših custom ponašanja je to da smo broju 5, koji je postavljen na self varijablu broj kroz
inicijalizaciju
x = Broj(5)
Dodali unutar tijela funkcije broj2, koji odgovara broju 2 prilikom poziva operatora oduzimanja
a=x–2
return Broj(self.broj+broj2+2)
10.2. __add__
Primjer operatora overloading za zbrajanju __add__:
class Broj:
43
Python_102
def __init__(self, broj):
self.broj = broj
x = Broj(5)
a=x+2
print a.broj
Ovdje imamo isti slučaj kao i sa prethodnim operatorom -, samo što je u našem slučaju operator
overloading pozvan na operatoru zbrajanja. Također sintaksa je poštivana, te je u tijelu __add__ funkcije
vraćena konkatenacije ''Ovo je broj '' + str(self.broj) gdje smo u potpunosti ignorirali parametar (broj2)
__add__ funkcije čime dobivamo nakon poziva operatora + na instanci klase vrijednost a.broj ''Ovo je
broj 5''.
10.3. __mul__
Primjer operatora overloading za množenje __mul__:
class Broj:
self.broj = broj
return Broj("Mnozenje")
x = Broj(5)
a=x*2
print a.broj
44
Python_102
>>>Mnozenje
10.4. __div__
Primjer operatora overloading za dijeljenje __div__:
class Broj:
self.broj = broj
return Broj(self.broj-broj2)
x = Broj(5)
a=x/2
print a.broj
>>>3
45
Python_102