Python Skripta

May 2, 2017 | Author: milanpk | Category: N/A
Share Embed Donate


Short Description

Python Skripta...

Description

ˇ UNARSKOM INŽENJERSTVU PYTHON U RAC ´ bojan crnkovi c, ´ jerko škifi c´ i marko cavrak ˇ stefan ivi c,

Numeriˇcke metode, priprema, obrada i vizualizacija podataka 4. ožujka 2014. – v0.1

ˇ Stefan Ivi´c, Bojan Crnkovi´c, Jerko Škifi´c i Marko Cavrak: Python u raˇcunarskom inženjerstvu, Numeriˇcke metode, priprema, obrada i vizualizacija poc 4. ožujka 2014. dataka,

SADRŽAJ

I 1

osnove pythona uvod 1.1

1.2

1.3

1.2.2

Dodatni paketi na Windows platformi

1.2.3

Instalacija pomo´cu upravitelja paketa

2.2 2.3

2.4

3.2 3.3 3.4 3.5 3.6

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . .

. . . . . . . . . Python ljuska kao kalukulator . . . . Python skripte . . . . . . . . . . . 2.3.1 Upotreba posebnih znakova . . Moduli . . . . . . . . . . . . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . . . . . . . . . ¯ Relacijski operatori ili operatori usporedivanja) . Operatori dodjeljivanja . . . . . . . . . . . . Logiˇcki operatori . . . . . . . . . . . . . . . ˇ Clanski operatori . . . . . . . . . . . . . . . Operatori identiteta . . . . . . . . . . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . .

. . . .

. . . .

. String . . Liste . . Tuple . .

. . . . Dictionary . Skupovi . . .

Brojevi

. . . .

. . . . . .

4.2 4.3 4.4 4.5 4.6

5.2 5.3

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

6.2 6.3

7.2 7.3 7.4 7.5 7.6

. . . . . while . . . . break . . . . continue . .

4 4 4 5 5 5 6

7 7 7 8 8

12 13 14 16 17 18

19 19 20 20 21 21

23 24 24 25

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . else . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . elif . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . if

25 26 27 29

. . . . Paraleleno iteriranje . Numeriranje liste . . for

4

23

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . input . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . raw_input . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . print

petlje 7.1

3

19

Aritmetiˇcki operatori

uvjetna grananja 6.1

3

11

. . . . . .

osnovne naredbe za unos i ispis podataka 5.1

3

7

Pokretanje Pythona

operatori 4.1

7

. . . . . . . . . . .

tipovi podataka 3.1

6

. . . . . . . . . . .

python ljuska i .py skripte 2.1

5

. . . . . . . . . . .

. . . .

. Spyder . . . . . . . PyDev . . . . . . . Kate . . . . . . . .

Editori i razvojna okruženja

1.3.3

4

. . . . . . . . . .

1.3.2

3

3

. . . . . . . . . . . . . . . 1.1.1 Instalacija na Linux platformi . . . 1.1.2 Instalacija na Windows platformi . Dodatni paketi . . . . . . . . . . . . 1.2.1 Dodatni paketi na Linux platformi .

Instalacija

1.3.1

2

1

. . . .

. . . .

. . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

29 30 30 31 32 33

iii

iv

sadržaj

8

funkcije 8.1 8.2 8.3 8.4 8.5 8.6 8.7

9

35

. . . . . Vra´canje vrijednosti iz funkcije . . . . . Argumenti sa zadanim vrijednostima . . Keyword i non-keyword argumenti . . . Ugnježdena definicija funkcije . . . . . Anonimne funkcije . . . . . . . . . . Rekurzivne funkcije . . . . . . . . . .

Definiranje i pozivanje funkcija

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

objektno-orijentirano programiranje

9.4 9.5

9.6

39 40 43

. . . . . .

. . . . . .

. . . . . . .

. . . . . . 9.5.1 Preopterecivanje funkcija . 9.5.2 Preopterecivanje operatora . ¯ Nasljedivanje . . . . . . . . . .

. . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

10 oblikovanje stringova 10.1

. . . . 11.5 Preimenovanje, kopiranje i brisanje datoteka . 11.6 Arhiviranje . . . . . . . . . . . . . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. 12.2 Matematiˇcke funkcije . . . . . . . . . . . . . 12.3 Datum i vrijeme . . . . . . . . . . . . . . . . 12.4 Vrijeme izvršavanja . . . . . . . . . . . . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

Otvaranje i zatvaranje datoteka

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

12 python standard library 12.1

44 44 45 46 47 48 49 51

57 59

. 11.2 Pisanje u datoteke . . . . . . . ˇ 11.3 Citanje iz datoteka . . . . . . . 11.4 Pozicioniranje u datoteci . . . . 11.1

44

55

Oblikovanje sa operatorom %

11 rad sa datotekama

59 59 60 61 62 62 63

Informacije o platformi i operacijskom sustavu

13 greške u python kodu

63 63 64 64 67

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13.2 Manipulacija greškama - Exception handling . . . . . . . . . . . . . . . . 13.3 Ispravljanje grešaka - DeBugging . . . . . . . . . . . . . . . . . . . . .

67

numpy polja i matrice

71

13.1

II

39

55

9.3

. . . . . . . . . . Atributi . . . . . . . . . 9.3.1 Globalni atributi . 9.3.2 Objektni atributi . Metode . . . . . . . . . Preopterecivanje . . . . .

. . . . . . . . . .

37

. . . . . . . . . . . . . . . . . . . . . . 10.2 Oblikovanje sa metodom format . . . . . . . . . . . . . . . . . . . . .

Klase

. . . . . . . . . .

37

43

Objektno-orijentirano programiranje

9.2

. . . . . . . . . .

36

. . . . . . . . . .

9.1

. . . . . . . . . .

35

Tipovi grešaka

14 zadavanje polja u numpy-u 14.1 14.2 14.3 14.4 14.5 14.6 14.7 14.8

. . . linspace . zeros . . ones . . eye . . . diag . .

. . . . . . . meshgrid . array

arange

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

69

73

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

15 informacije o polju i indeksiranje

. . . . . . . . . . . . . . . . . . . . . . . . . . . 15.2 Indeksiranje polja . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15.1

68

Informacije o polju

16 manipulacije sa numpy poljima

73 74 74 75 75 76 76 77 79 79 79 81

sadržaj

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16.3 Dodavanje i brisanje elemenata polja . . . . . . . . . . . . . . . . . . .

16.1

Manipulacije sa dimenzijama polja

81

16.2

Transponiranje

82

ˇ 17 u citavanje i spremanje numpy polja

83

. . . . . . . . . . . . . . . . . . . . 17.2 Spremanje u tekstualne datoteke . . . . . . . . . . . . . . . . . . . . . 17.1

Uˇcitavanje iz tekstualnih datoteka

ˇ ˇ 18 matri cni ra cun 18.1

III

. . . . . . . . . . . . . . . . . .

Rješavanje sustava linearnih jednadžbi

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . . . . . . . . . . . Mapa boja . . . . . . . . . . . . . Detaljnije podešavanje grafa izolinija . . Primjer . . . . . . . . . . . . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

Linijski grafovi

Svojstva prozora, prostora crtanja i osi

. 19.5 Podgrafovi . . . . 19.6 Polarni grafovi . . 19.7 tips and tricks . . . Spremanje grafova

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . . . . . . .

. . . . . . . . .

20 složeniji 2d grafovi 20.1

Izolinije 20.1.1 20.1.2 20.1.3

ˇ numeri cke metode

22.2 22.3 22.4 22.5

. . . . . . Newton-Raphsonova metoda . Sekanta . . . . . . . . . . . Brentova metoda . . . . . . Zadaci . . . . . . . . . . . Metoda bisekcije

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

25 rješavanje sustava linearnih jednadžbi

ˇ 26 numeri cko integriranje

. . . 26.3 Naprednije metode . 26.4 Zadaci . . . . . . . V

Trapezna formula

Simpsonove formule

99 100 101

103 103 104 105

111 113 114 114 115

117 118

. . . .

. . . .

121 121 122 125

. . . . . . . . . . . . . . . . . . . . . . . 25.2 LU dekompozicija . . . . . . . . . . . . . . . . . . . . . . . . . . . . Metoda Gaussove eliminacije

26.1

99

121

. . . . . . . . . . . . . . . . . . . . . . . 24.2 Linearna regresija . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24.3 Zadaci . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Metoda najmanjih kvadrata

26.2

94

117

1D interpolacija

24 regresije

25.1

92

111

. . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23.2 2D i N-D interpolacija . . . . . . . . . . . . . . . . . . . . . . . . . . 24.1

92

109

23 interpolacije 23.1

92

107

22 rješavanje nelinearnih jednadžbi 22.1

89

103

21 izrada animacija

IV

85

89

. . . . . . . . . . . 19.2 Naprednija kontrola linijskih grafova . 19.2.1 Boje . . . . . . . . . . . . 19.2.2 Markeri . . . . . . . . . . . 19.4

84

87

19 osnovni 2d grafovi

19.3

83

85

priprema, obrada i vizualizacija podataka 19.1

82

125 126 129

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

rješavanje modela temeljenih na odj i pdj

ˇ ˇ 27 numeri cke metode za rješavanje obi cnih diferencijalnih jednadžbi

129 131 132 133

135 137

v

vi

sadržaj

. . 27.1.2 . 27.1.3 . 27.2 Sustavi obiˇcnih diferencijalnih jednadžbi 1. reda . 27.3 Obiˇcne diferencijalne jednadžbe višeg reda . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

139

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . ¯ 29.2 Stacionarno provodenje topline u štapu . . . . . . . . . . . . . . . . . .

149

27.1

. . . . . . . . . Runge-Kutta metode . . . . . . Rješavanje pomo´cu scipy-a . . . .

Obiˇcne diferencijalne jednadžbe 1. reda 27.1.1

Eulerova metoda

. . . .

. . . .

. . . .

ˇ 28 po cetni problemi 28.1

. . . . . . . Stacionarno strujanje . . . . . . . . . Maningova formula . . . . . . . . . . Uniformno strujanje i normalna dubina . . Kritiˇcna dubina . . . . . . . . . . . . Hidrauliˇcki skok . . . . . . . . . . . Numeriˇcko rješavanje . . . . . . . . .

Modeliranje otvorenog vodotoka 28.1.1 28.1.2 28.1.3 28.1.4 28.1.5 28.1.6

Progib ploˇce

. . . . . . . . . . . . . 34.2 Simpleks metoda . . . . . . . . . . . . . . . 34.3 Rješavanje LP problema pomo´cu modula PuLP . 34.4 Praktiˇcni primjeri LP problema . . . . . . . . . 34.4.1 Teretni zrakoplov . . . . . . . . . . . . Definicija LP problema

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35.2 Nelder-Mead metoda za optimizaciju funkcije dviju varijabli . . . . . . . . Algoritam

36 simulirano kaljenje

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36.2 Primjer simuliranog kaljenja pomo´cu modula inspyred . . . . . . . . . . Algoritam

ˇ 37 optimizacija rojem cestica

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37.2 Korištenje PSO metode pomo´cu modula inspyred . . . . . . . . . . . . . Razvoj metode

ˇ 38 geneti cki algoritmi

. . . . . . . . . . . . . . . . . . . . . . . . . . . 38.2 Korištenje DEAP modula . . . . . . . . . . . . . . . . . . . . . . . . 38.1

VII a

Evolucijski algoritmi

dodaci bibliografija

143 144 145

151

155

165 166 166 167

. . . . .

35 nelder-mead metoda

37.1

142

165

Optimizacijske varijable

34 linearno programiranje

36.1

141

163

. . . . . . . . . . . . . . . . . . . . . . . . . 33.2 Ciljevi optimizacije i funkcija cilja . . . . . . . . . . . . . . . . . . . . 33.3 Ograniˇcenja . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

35.1

140

159

optimizacijske metode

34.1

138

155

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

33 definicija optimizacijskog problema 33.1

137 138

153

32 metoda linija

VI

137

149

Savijanje grede

30 klasifikacija parcijalnih diferencijalnih jednadžbi ˇ 31 elipti cke parcijalne diferencijalne jednadžbe 31.1

137

139

. . . . . . .

29 rubni problemi 29.1

137

167 168 168 168 169 173 173 174 179 179 179 183 183 184 187 187 188

195 197

POPIS SLIKA

Slika 1.1 Slika 1.2 Slika 6.1 Slika 6.2 Slika 6.3 Slika 7.1 Slika 7.2 Slika 7.3 Slika 19.1 Slika 19.2 Slika 19.3 Slika 19.4 Slika 19.5 Slika 19.6 Slika 19.7 Slika 19.8 Slika 19.9 Slika 19.10 Slika 19.11 Slika 19.12 Slika 20.1 Slika 20.2 Slika 22.1 Slika 22.2 Slika 23.1 Slika 23.2 Slika 24.1 Slika 26.1 Slika 26.2 Slika 27.1 Slika 28.1 Slika 28.2 Slika 28.3 Slika 28.4 Slika 28.5 Slika 28.6 Slika 28.7 Slika 29.1 Slika 29.2 Slika 29.3 Slika 31.1 Slika 32.1 Slika 35.1

Slika 35.2 Slika 36.1 Slika 37.1 Slika 37.2 Slika 38.1

Spyder razvojno okruženje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Kate tekstualni editor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Dijagram toka if naredbe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . if-else dijagram toka . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Dijagram toka za složeni uvjet grananja . . . . . . . . . . . . . . . . . . . . . . . Dijagram toka while petlje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Dijagram toka while petlje sa else blokom . . . . . . . . . . . . . . . . . . . . . Dijagram toka while petlje sa continue naredbom . . . . . . . . . . . . . . . . . Matplotlib elementi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ¯ Prozor sa grafom napravljen izvodenjem izvrnog koda 19.1 . . . . . . . . . . . ¯ Graf napravljen izvodenjem izvornog koda 19.2 . . . . . . . . . . . . . . . . . . ¯ Graf napravljen izvodenjem izvornog koda 19.3 . . . . . . . . . . . . . . . . . . Izmijenjene granice grafa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Custom ticks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Custom ticks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Spines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Formatiranje oznaka na osima . . . . . . . . . . . . . . . . . . . . . . . . . . . . Prikaz legende na grafu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Podgrafovi nastali izvršavanjem izvornog koda 19.5 . . . . . . . . . . . . . . . Graf u polarnom koordinatnom sustavu . . . . . . . . . . . . . . . . . . . . . . Predefinirane mape boja u matplotlibu . . . . . . . . . . . . . . . . . . . . . . . ¯ Graf napravljen izvodenjem izvornog koda 20.1 . . . . . . . . . . . . . . . . . . Skica metode biskecije . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Newton-Raphsonova metoda . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Primjer razliˇcitih 1D interpolacija . . . . . . . . . . . . . . . . . . . . . . . . . . Primjer 2D interpolacije . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Regresijski pravac dobiven izvornim kodom 24.1 . . . . . . . . . . . . . . . . . Trapezi na cjelom intervalu [a, b] i na tri podintervala. . . . . . . . . . . . . . . Raˇcunanje površine ispod krivulje pomo´cu trapeza (Izvorni kod 26.1) . . . . . Vizualizacija rješenja iz izvornog koda 27.1. . . . . . . . . . . . . . . . . . . . . Skica popreˇcnog presjeka otvorenog vodotoka . . . . . . . . . . . . . . . . . . . Energetske linije u strujanju fluida otvorenim vodotokom . . . . . . . . . . . . Pravokutni popreˇcni presjek kanala . . . . . . . . . . . . . . . . . . . . . . . . . Trapezni popreˇcni presjek kanala . . . . . . . . . . . . . . . . . . . . . . . . . . . M-krivulje vodnog lica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . S-krivulje vodnog lica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Numeriˇcko rješenje strujanja u otvorenom kanalu pravokutnog presjeka . . . . Savijanje grede . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Rubni uvjeti za razliˇcite oslonce grede . . . . . . . . . . . . . . . . . . . . . . . . Progib elastiˇcne linije grede . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ploˇca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Diskretizacija . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Toˇcke refleksije, ekspanzije, kontrakcije i redukcije kod Nelder-Mead metode optimizacije za funkciju dvije varijable. Toˇcke refleksije, ekspanzije ili kontrakcije mjenjaju najgoru toˇcku simpleksa, dok toˇcke redukcije mjenjaju dvije nagore toˇcke simpleksa. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Izgled simpleksa u 5 iteraciji (za izvorni kod 35.1). . . . . . . . . . . . . . . . . Konvergencija optimizacije pomo´cu simuliranog kaljenja . . . . . . . . . . . . . Ponašanje jedinki u Reynoldsovom modelu. Odvajanje, usmjeravanje i kohezija. . Utjecaj gnjezda na jedinke jata. . . . . . . . . . . . . . . . . . . . . . . . . . . . . Konvergencija optimizacije genetiˇckim algoritmom (Izvorni kod 38.1) . . . . .

5 6 25 26 28 30 31 31 89 90 92 94 95 96 96 97 98 99 100 101 104 106 112 113 118 119 122 129 131 138 139 139 142 143 145 145 147 149 150 151 155 159

174 177 181 183 184 193

vii

P O P I S TA B L I C A

Tablica 3.1 Tablica 4.1 Tablica 4.2 Tablica 4.3 Tablica 4.4 Tablica 5.1 Tablica 10.1 Tablica 10.2 Tablica 12.1 Tablica 12.2 Tablica 19.1 Tablica 19.2 Tablica 19.3 Tablica 19.4 Tablica 28.1

viii

Primjeri oznaˇcavanja brojeva . . . . . . . . . . . . . . . . . . . . . Aritmetiˇcki operatori . . . . . . . . . . . . . . . . . . . . . . . . . . Relacijski operatori . . . . . . . . . . . . . . . . . . . . . . . . . . . Operatori dodjeljivanja . . . . . . . . . . . . . . . . . . . . . . . . . Logiˇcki operatori . . . . . . . . . . . . . . . . . . . . . . . . . . . . printf formatiranje . . . . . . . . . . . . . . . . . . . . . . . . . . . Opcije konverzije . . . . . . . . . . . . . . . . . . . . . . . . . . . . Definiranje tipova podataka . . . . . . . . . . . . . . . . . . . . . . Opis nekih funkcija math modula . . . . . . . . . . . . . . . . . . . Opis nekih funkcija cmath modula . . . . . . . . . . . . . . . . . . Vrste linija . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Simboli boja . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Vrste markera . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Pozicija legende . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Vrijednosti Manningovog koeficijenta za razliˇcite izvedbe kanala.

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. 13 . 19 . 20 . 20 . 21 . 23 . 55 . 56 . 63 . 63 . 90 . 91 . 91 . 99 . 141

POPIS IZVORNOG KODA

Izvorni kod 2.1 Izvorni kod 2.2 Izvorni kod 3.1 Izvorni kod 4.1

Podrška za posebne znakove u Python skriptama . . . . . . . . . . . . . . . . . Korištenje objekata modula . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Dodavanje i brisanje elemenata liste . . . . . . . . . . . . . . . . . . . . . . . . . ¯ Primjer kombiniranje operatora dodjeljivanja, operatora usporedivanja i logiˇckih operatora . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Izvorni kod 5.1 Razliˇciti primjeri ispisa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Izvorni kod 6.1 Jednostavan primjer upotrebe if naredbe . . . . . . . . . . . . . . . . . . . . . . Izvorni kod 6.2 Pisanje složenijeg uvjetovanog grananja . . . . . . . . . . . . . . . . . . . . . . . Izvorni kod 6.3 Primjer upotrebe else naredbe . . . . . . . . . . . . . . . . . . . . . . . . . . . . Izvorni kod 6.4 Primjer kombinacije naredbi if, elif i else . . . . . . . . . . . . . . . . . . . . Izvorni kod 7.1 Upotreba for naredbe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Izvorni kod 7.2 Naredba for s listom stringova . . . . . . . . . . . . . . . . . . . . . . . . . . . . Izvorni kod 7.3 Naredba for i stirng . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Izvorni kod 7.4 Naredba for s listom stringova . . . . . . . . . . . . . . . . . . . . . . . . . . . . Izvorni kod 7.5 Upotreba while naredbe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Izvorni kod 7.6 Upotreba else naredbe u petlji . . . . . . . . . . . . . . . . . . . . . . . . . . . . Izvorni kod 7.7 Upotreba break naredbe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Izvorni kod 7.8 Upotreba continue naredbe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Izvorni kod 7.9 Upotreba zip naredbe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Izvorni kod 7.10 Upotreba zip naredbe sa više lista. . . . . . . . . . . . . . . . . . . . . . . . . . . Izvorni kod 7.11 Numeriranje elemenata liste pomo´cu enumerate. . . . . . . . . . . . . . . . . . Izvorni kod 8.1 Definicija i pozivanje jednostavne funkcije . . . . . . . . . . . . . . . . . . . . . Izvorni kod 8.2 Definicija funkcije koja prima argument . . . . . . . . . . . . . . . . . . . . . . . Izvorni kod 8.3 Definicija funkcije koja prima više argumenata i vra´ca vrijednost . . . . . . . . Izvorni kod 8.4 Funkcija koja vra´ca razliˇcite tipove . . . . . . . . . . . . . . . . . . . . . . . . . . Izvorni kod 8.5 Funkcija koja vra´ca više vrijednosti korsite´ci tuple . . . . . . . . . . . . . . . . Izvorni kod 8.6 Funkcija sa zadanim argumentom . . . . . . . . . . . . . . . . . . . . . . . . . . Izvorni kod 8.7 Funkcija sa *args i **kwargs argumentima . . . . . . . . . . . . . . . . . . . . . Izvorni kod 8.8 *args i **kwargs argumenti prilikom poziva funkcije . . . . . . . . . . . . . . . Izvorni kod 8.9 Primjer anonimne funkcije u ugnježdenoj definiciji . . . . . . . . . . . . . . . . Izvorni kod 9.1 Definicija klase . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Izvorni kod 9.2 Primjer definicije klasnih (globalnih) atributa . . . . . . . . . . . . . . . . . . . . Izvorni kod 9.3 Primjer definicije objektnog atributa . . . . . . . . . . . . . . . . . . . . . . . . . Izvorni kod 9.4 Inicijalizacija objekta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Izvorni kod 9.5 Definicija metode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Izvorni kod 9.6 Preoptere´civanje funkcije print . . . . . . . . . . . . . . . . . . . . . . . . . . . . Izvorni kod 9.7 Preoptere´civanje funkcije print . . . . . . . . . . . . . . . . . . . . . . . . . . . . Izvorni kod 9.8 Preoptere´civanje funkcije print . . . . . . . . . . . . . . . . . . . . . . . . . . . . ¯ Izvorni kod 9.9 Naslijedivanje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ¯ Izvorni kod 9.10 Naslijedivanje override __init__metode . . . . . . . . . . . . . . . . . . . . . . . Izvorni kod 10.1 Primjer formatiranja numeriˇckih podataka sa tupleom i dictionaryjem . . . . . Izvorni kod 10.2 Primjer formatiranja numeriˇckih podataka sa tupleom i dictionaryjem . . . . . Izvorni kod 10.3 Primjer formatiranja numeriˇckih podataka za ispis u stupcima . . . . . . . . . Izvorni kod 11.1 Primjer kreiranja tekstualne datoteke . . . . . . . . . . . . . . . . . . . . . . . . gfx/RadSaDatotekama/info.txt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . gfx/RadSaDatotekama/test.txt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ˇ Izvorni kod 11.2 Citanje sadržaja tekstualne datoteke . . . . . . . . . . . . . . . . . . . . . . . . . Izvorni kod 11.3 Pristupanje sadržaju datoteke preko iteriranja po file objektu . . . . . . . . . gfx/RadSaDatotekama/test.txt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Izvorni kod 11.4 Dohva´canje trenutne pozicije u datoteci . . . . . . . . . . . . . . . . . . . . . . . Izvorni kod 11.5 Kopiranje, micanje i preimenovanje datoteka . . . . . . . . . . . . . . . . . . . . Izvorni kod 12.1 Primjer mjerenja vremena izvršavanje algoritma . . . . . . . . . . . . . . . . . . ¯ Izvorni kod 12.2 Primjer upotrebe Timer klase za mjerenje vremena izvodenja funkcije . . . . . Izvorni kod 13.1 Upotreba dbg modula . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Izvorni kod 14.1 Spremanje elemenata dijagonale matrice u vektor . . . . . . . . . . . . . . . . . Izvorni kod 15.1 Osnovne informacije o NumPy polju . . . . . . . . . . . . . . . . . . . . . . . . Izvorni kod 15.2 Manipulacije sa poljima pomo´cu indeksa . . . . . . . . . . . . . . . . . . . . . . Izvorni kod 16.1 Mijenjanje dimenzija polja . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Izvorni kod 16.2 Mijenjanje dimenzija polja . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Izvorni kod 16.3 Transponiranje matrica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Izvorni kod 17.1 Sadržaj datoteke data.txt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Izvorni kod 17.2 Uˇcitavanje iz tekstualne datoteke . . . . . . . . . . . . . . . . . . . . . . . . . . . Izvorni kod 18.1 Rješavanje sustava linearnih jednadžbi . . . . . . . . . . . . . . . . . . . . . . . Izvorni kod 19.1 Jednostavan graf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Izvorni kod 19.2 Kontrola linija i markera . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Izvorni kod 19.3 Naprednija kontrola linija i markera . . . . . . . . . . . . . . . . . . . . . . . . . Izvorni kod 19.4 Prikaz legende na grafu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Izvorni kod 19.5 Primjer crtanja podgrafova . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Izvorni kod 19.6 Primjer crtanja grafa u polarnom koordinatnom sustavu . . . . . . . . . . . . . Izvorni kod 20.1 Primjer vizualizacije izolinija . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Izvorni kod 21.1 Jednostavan primjer animacije . . . . . . . . . . . . . . . . . . . . . . . . . . . . Izvorni kod 22.1 Primjer pronalaženja nultoˇcke funkcije metodom biskecije . . . . . . . . . . . . Izvorni kod 22.2 Primjer pronalaženja nultoˇcke funkcije metodom tangente . . . . . . . . . . . . Izvorni kod 23.1 Primjer razliˇcitih 1D interpolacija . . . . . . . . . . . . . . . . . . . . . . . . . . Izvorni kod 23.2 Primjer linearne i kubiˇcne 2D interpolacije . . . . . . . . . . . . . . . . . . . . .

8 9 16 20 23 25 26 26 27 29 29 29 29 30 30 31 32 32 32 33 35 36 36 36 37 37 38 38 40 44 44 45 46 46 48 49 50 51 52 55 56 56 59 60 60 61 61 61 61 62 64 65 70 76 79 80 81 81 82 83 83 85 89 91 93 99 99 100 105 107 112 114 117 118

ix

x

Popis izvornog koda

Izvorni kod 24.1 Primjer linearne regresije . . . . . . . . . . . . . . . . . . . . . . . . . . gfx/RjesavanjeSustavaLinJed/A.txt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . gfx/RjesavanjeSustavaLinJed/B.txt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Izvorni kod 25.1 Primjer naivne Gaussove eliminacije . . . . . . . . . . . . . . . . . . . . Izvorni kod 25.2 Primjer LU dekompozicije . . . . . . . . . . . . . . . . . . . . . . . . . . ¯ Izvorni kod 26.1 Primjer raˇcunanja odredenog inegrala pomo´cu trapezne formule . . . Izvorni kod 26.2 Upotreba Simpsonove 1/3 formule . . . . . . . . . . . . . . . . . . . . Izvorni kod 26.3 Numeriˇcko integriranje pomo´cu quad funkcije . . . . . . . . . . . . . . Izvorni kod 27.1 Primjer rješavanja obiˇcnih diferencijalnih jednadžbi 1. reda. . . . . . . Izvorni kod 28.1 Strujanje u pravokutnom kanalu . . . . . . . . . . . . . . . . . . . . . . Izvorni kod 29.1 Rješavanje elastiˇcne linije savijanja . . . . . . . . . . . . . . . . . . . . . Izvorni kod 31.1 Rješavanje problema progiba ploˇce pomo´cu metode konaˇcnih razlika ¯ Izvorni kod 32.1 Primjer rješavanje provodenja topline kroz štap pomo´cu metode linija Izvorni kod 34.1 Primjer rješavanja LP problema pomo´cu modula PuLP . . . . . . . . . Izvorni kod 34.2 Rješavanje problema transportnog zrakoplova . . . . . . . . . . . . . . Izvorni kod 35.1 Primjer 2D optimizacije Nelder-Mead metodom . . . . . . . . . . . . . Izvorni kod 36.1 Primjer simuliranog kaljenja pomo´cu modula inspyred . . . . . . . . . Izvorni kod 37.1 Particle Swarm Optimization na primjeru Rastrigin funkcije . . . . . . Izvorni kod 38.1 Optimizacija Rastrigin funkcije pomo´cu DEAP modula . . . . . . . . .

. . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . .

121 125 125 126 126 130 132 133 137 145 150 156 160 168 170 175 179 184 188

INDEKS

%, 55 alpha, 105 Amoeba, 173 and, 20 anonimne funkcije, 39 append, 15, 82 arange, 74 aritmetiˇcki operatori, 19 array, 73 as, 9 atributi, 44 bisect, 111 bisekcija, 111 break, 30 brent, 114 Brentova metoda, 114 bvp1lg, 150 capitalize, 14 center, 14 class, 44, 47–49, 51 clock, 64 close, 59 closure, 39 cmath, 63 coding, 8 color, 92 colormap, 103 continue, 31 contour, 103 contourf, 103 copy, 62 count, 13, 15

from, 9 funkcije, 35 GA, 187 genetiˇcki algoritmi, 187 genfromtxt, 84 globalni atributi, 44 grid, 98 griddata, 118 hidrauliˇcki skok, 144 id, 21 if, 25 import, 8 in, 21 indeksi, 79 index, 13, 15 input, 24 insert, 15, 82 inspyred, 184 integriranje, 129 interp1d, 117 interp2d, 118 interpolacija, 117 is, 21 is not, 21 isalnum, 14 isalpha, 14 isdigit, 14 islower, 14 isspace, 14 istitle, 14 isupper, 14 izolinije, 103 join, 14

datoteke, 59 DEAP, 188 debug, 67, 69 decimal, 64 decode, 14 def, 35 del, 11, 15 delete, 82 diag, 76 dpi, 94 draw, 101 easy_install, 4 elastiˇcna linija, 149 elif, 27 Eliptiˇcke parcijalne diferencijalne jednadžbe, 155 else, 26, 30 encode, 14 endswith, 13 enumerate, 33 error, 68 Euler-Bernoullijeva jednadžba, 149 Eulerova metoda, 137 evolucijski algoritmi, 187 exception, 68 expandtabs, 13 extend, 15 eye, 76 figsize, 94 figure, 94 file, 59 find, 13 flatten, 81 for, 29 format, 57

Kate, 6 label, 93 lambda, 39 lambda funkcije, 39 legend, 98 legenda, 98 len, 15 linearno programiranje, 167 linspace, 74 list, 14 ljust, 14 loadtxt, 83 logicki operatori, 20 lower, 14 lstrip, 14 LU dekompozicija, 126 M krivulje, 145 Manningov koeficijent trenja, 141 Manningova formula, 140, 141 mapa boja, 103 marker, 92 markeredgecolor, 92 markeredgewidth, 92 markerevery, 92 markerfacecolor, 92 markerfacecoloralt, 92 markersize, 92 math, 63 matrica sustava, 85 meshgrid, 77, 103 metoda Gaussove eliminacije, 125 metoda linija, 159 metoda sekante, 114 metoda tangente, 113

xi

xii

INDEKS

metode, 46 modul, 8 move, 62 naslov, 98 ndarray, 73 ndim, 79 Nelder-Mead metoda, 173 nestacionarno strujanje, 139 neuniformno strujanje, 139 newton, 113 Newton-Raphsonova metoda, 113 Newtonova metoda, 113 normalna dubina, 142 not, 20 not in, 21 objektni atributi, 45 objektno orijentirano programiranje, 43 odeint, 137 ones, 75 ones_like, 75 open, 59 open channel flow, 139 operatori dodjeljivanja, 20 or, 20 otvoreni vodotok, 139 Parcijalne diferencijalne jednadžbe, 153 Particle Swarm Optimization, 183 partition, 14 pdb, 67, 69 perimetar, 139 pip, 4 plot, 89 pop, 15 print, 23 printf, 23 prozirnost, 105 PSO, 183 PuLP, 168 PyDev, 5 quad, 132 range, 15 ravel, 81 raw_input, 24 read, 60 readline, 60 readlines, 60 regresija, 121 rekurzija, 40 rekurzivne funkcije, 40 relacijski operatori, 19 remove, 15 rename, 62 replace, 13 reshape, 81 resize, 82 return, 36 reverse, 15 rfind, 13 rindex, 13 rjust, 14 rpartition, 14 rsplit, 14 rstrip, 14

Runge-Kutta metode, 137 S krivulje, 145 savetxt, 84 secant, 114 seek, 61 set, 18 setuptools, 4 shape, 79 show, 89 shutil, 62 simboli, 8 simps, 132 Simpsonova pravila, 131 Simpsonove formule, 131 simulated annealing, 179 simulirano kaljenje, 179 size, 79 skupovi, 18 solve, 85 sort, 15 spines, 96 spline interpolacija, 117 split, 14 splitlines, 14 Spyder, 5 squeeze, 81 stacionarno strujanje, 139, 140 startswith, 13 strip, 14 subplot, 99 sustav linearnih jednadžbi, 125 swapcase, 14 tell, 61 time, 64 Timer, 65 title, 14, 98 translate, 13 trapezna formula, 129 trapz, 129 trim_zeros, 82 type, 12 ugnježdena definicija funkcije, 39 uniformno strujanje, 139, 142 unique, 82 upper, 14 vektor slobodnih cˇ lanova, 85 Vrijeme izvršavanja, 64 while, 30 write, 59 writelines, 59 xlabel, 94 xlim, 94 xticks, 95 ylabel, 94 ylim, 94 yticks, 95 zeros, 75 zeros_like, 75 zfill, 14 zip, 32

ACRONYMS

DRY

Don’t Repeat Yourself

API

Application Programming Interface

UML

Unified Modeling Language

xiii

Dio I OSNOVE PYTHONA Python je skriptni programski jezik op´ce namjene.

1

UVOD

Zašto Python? Postoje mnogi razlozi zašto odabrati Python kao inženjerski alat ? Odliˇcan za poˇcetnike a istodobno mo´can za struˇcnjake ? Skalabilan, pogodan za velike projekte, kao i one male ? Omogu´cuje brz razvoj ? Cross-platform, omogu´cuje razvoj i izvršavanje koda na gotovo svim platformama i arhitekturama ? Ugradiv u kodove pisane u drugim programskim jezicima ? Proširiv sa drugim programskim jezicima ? Objektno orjentiran ? Uredna i elegantna sintaksa ? Stabilan ? Bogatstvo dostupnih paketa i biblioteka ? Specijelizirani paketi za numeriku, statistiku, obradu podataka i vizualizacije ? Otvoreni besplatni kod koji održava velika zajednica programera i znanstvenika 1.1 1.1.1

instalacija Instalacija na Linux platformi

Gotovo sve Linux distribucije sadže Python pakete u osnovnim repozitorijima, ali i v´cina distribucija ima inicijalno instaliran Python. Na openSUSE distribuciji, Python se može instalirati jednostavnom naredbom: sudo zypper in python

Nakon instalacije Pythona, možemo provjeriti koja je putanja python izvršne datoteke user@machine:~> type python python is /usr/bin/python

1.1.2

Instalacija na Windows platformi

Za instalaciju Pythona na Windows platformi potrebno je preuzeti instalacijsku datoteku sa http://www.python.org. Nakon preuzimanja, pokretanjem insta¯ lacijske datoteke zapoˇcinje isntalacijki program koji omogu´cuje uredivanje postavki Python instalacije. Uobiˇcajena je instalacija Pythona zajedno sa dodatnim paketima, na Windows platformi, preko neke od dostupnih Python distribucija (vidi poglavlje 1.2.2.1).

3

4

uvod

1.2

dodatni paketi

Velika snaga Pythona je dostupnost velikog broja paketa raznih namjena. Za inženjerske potrebe, potrebni su dodatni paketi koji omogu´cavaju matriˇcni raˇcun, numeriˇcke metode, statistiˇcku obradu podataka, vizualizacije, izradu animacija i druge specijalizirane mogu´cnosti. Osnovni paketi, koji c´ e biti korišteni u ovoj skripti, su: ? Numpy (http://www.numpy.org/), ? SciPy (http://www.scipy.org), ? matplotlib (http://matplotlib.org/) i ? IPython (http://ipython.org/). Za instalaciju dodatnih python paketa postoje alati za upravljanje Python paketima. Najpoznatiji su easy_install, koji dolazi sa ve´cinom Python distribucija te pip. pip se može instalirati pomo´cu easy_install-a: user@machine:~> sudo easy_install pip

1.2.1

Dodatni paketi na Linux platformi

Za instalaciju dodatnih paketa na openSUSE distribuciji pokrenite naredbu: user@machine:~> sudo zypper in python-numpy python-scipy \\ python-matplotlib IPython

1.2.2 1.2.2.1

Dodatni paketi na Windows platformi Python distribucije

Python distribucije su objedinjane instalacije pythona, raznih dodatnih paketa te cˇ esto i tekstualnih editora ili razvoijnih okruženja. Distribucije su ve´cinom ciljane za Windows platformu zbog nepraktiˇcne višestruke instalacije svakog pojedinog softwarea. Neke od najpopularnijih Python distribucija su: ? pythonxy (http://code.google.com/p/pythonxy/) ? ActivePython (http://www.activestate.com/activepython) ? Entought Python (http://www.enthought.com/python/) ? winpython (http://code.google.com/p/winpython/) ? PortablePython (http://portablepython.com/) 1.2.3

Instalacija pomo´cu upravitelja paketa

Python upravitelji paketa omogu´cuju jednostavno instalaciju, osvježavanje ili deinstalaciju raznih Python paketa. Iako upravitelji paketa nisu dio Pythona, cˇ esto bar jedan upravitelj dolazi sa osnovnom instalacijom Pythona. Valja izdvojiti dva upravitelja python paketa: ? setuptools https://pypi.python.org/pypi/setuptools ? pip https://pypi.python.org/pypi/pip

1.3 editori i razvojna okruženja

5

Primjer instalacije paketa pomo´cu upravitelja setuptools sa naredbom easy_install: user@machine:~> sudo easy_install ime_paketa

Primjer instalacije paketa sa naredbom pip: user@machine:~> sudo pip install ime_paketa

1.3

editori i razvojna okruženja

Python koristi pokre´ce kod iz obiˇcnih tekstualnih datoteka koje je mogu´ce ¯ uredivati u mnogim tekstualnim editorima. Razvojna okruženja (eng. Integrated Development Environment, IDE), osim ¯ što omogu´cavaju uredivanje koda, sadrže niza alata za lakši i brži razvoj kao što su jednostavno pokretanje koda iz IDE-a, debug-iranje koda, pra´cenje ispisa i dr. 1.3.1

Spyder

Spyder (http://code.google.com/p/spyderlib/) je interaktivno razvojno okruženje za Python namjenjeno za znastvenu i inženjersku primjenu. Spyder je dostupan za ve´cinu platformi.

Slika 1.1: Spyder razvojno okruženje

1.3.2

PyDev

PyDev (http://pydev.org/) je dodatak za Eclipse (http://www.eclipse.org/) razvojno suˇcelje koji nudi mogu´cnosti za rad sa Pythonom.

6

uvod

1.3.3

Kate

Kate (http://kate-editor.org/) je mo´can tekstualni editor, iako radi i na Windows platformi, primarno je namjenjen za Linux platformu. Na openSUSE-u, Kate se može instalirati naredbom: user@machine:~> sudo zypper in kate

Slika 1.2: Kate tekstualni editor

2

PYTHON LJUSKA I .PY SKRIPTE

Python je interpretirani jezik, a jednostavni Python izrazi mogu se izvoditi u interaktivnom programskom okruženju pod nazivom ljuska. 2.1

pokretanje pythona

Najjednostavniji naˇcin za otvaranje Python ljuske (eng. shell) na Windows platformi je pokrenuti IDLE, dok je ne Linux platformi dovoljno pokrenuti Python naredbu u terminalu/konzoli. Nakon pokretanja Pythona prikazuju se osnovne informacije o Pythonu (verzija) te tzv. prompt koji je simboliziran sa tri strelice u desno (> > >). user@machine:~> python Python 2.7.3 (default, Apr 14 2012, 08:58:41) [GCC] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>>

2.2

python ljuska kao kalukulator

Python ljuska odmah izvršava unešene naredbe nakon pritiska na tipku Enter (Return). Najjednostavniji Python izrazi su matematiˇcke operacije pomo´cu kojih možemo koristiti Python ljusku kao kalkulator. Izraˇcun te ispis rezultata matematiˇckih izrazi dešava se u novom retku terminala ili IDLE-a: >>> 1+1 2 >>>

¯ Matematiˇcke operacije, naravno, možemo medusobno kombinirati i pri tome koristiti zagrade za definiranja redoslijeda operacija. >>> 1/5 0 >>> 1./5. 0.2 >>> 1./(5.+2) 0.14285714285714285 >>>

Ljuska može raditi i baziˇcne operacije sa tekstom tj. nizovima znakova (string). >>> "Kratki " + "probni " + "tekst." ’Kratki probni tekst.’ >>>

2.3

python skripte

Python skripte su tekstualne datoteke s ekstenzijom *.py koje sadrže Python kod. Izvršavanje .py skripte, zapravo, se pokre´ce linija po linija kao da se je unosi u Python ljusku. Ovo je oˇcita prednost, pogotovo prilikom pokretanja više od nekoliko naredbi. Datoteke sa ekstenzijom .py, osim kao skripte, koriste se i za definiranje vlastitih modula što je detaljnije opisano u poglavlju 2.4.

7

Oprez! Prilikom dijeljenja cijelih brojeva rezultat je cijeli broj! Kod decimalnih brojeva obavezno koristiti decimalnu toˇcku.

python ljuska i .py skripte

8

Osnovni naˇcin pokretanja python skripte je pokretanje Pythona sa specificiranim .py fajlom: user@machine:~$ python imeskripte.py

Nakon završetka ¯ izvodenja skripte pomo´cu python skripta.py Python se gasi!

Python c´ e se pokrenuti i izvršiti kod zapisan u skripti. Ako je prva linija skripte: 1

#!/usr/bin/python

tada se na Unix sustavima može izvršavati u terminalu. Za pokretanje skripte u terminalu nužno je da skripta koristi Unix oznaku za kraj reda te da ima dozvole za izvršavanje: user@machine:~$ chmod +x imeskripte.py

Ako je .py datoteka izvršna, tada se može direktno izvršavati: user@machine:~$ ./imeskripte.py

Na Windows sustavima datoteke s ekstenzijom *.py su kod intalacije Pythona pridružene programu python.exe. Python skripta se pokre´ce dvostrukim lijevim klikom miša na skriptu. 2.3.1

Upotreba posebnih znakova

Da bi se koristilo posebne znakove (npr. slova sa kvaˇcicama ili simboli) u stringovima, potrebno je u prvoj ili drugoj liniji skripte upisati poseban komentar: # -*- coding: utf-8 -*-

Izvorni kod 2.1: Podrška za posebne znakove u Python skriptama 1 2

#!/usr/bin/python # -*- coding: utf-8 -*-

3 4 5

print ’Sada možemo koristi slova sa kvaˇ cicama!’ print ’Ali i razne simbole kao što su ◦ & $’

2.4

moduli

¯ Modul je Python objekt, definiran u odredenoj datoteci, koji sadrži defini¯ cije varijabli, funkcija i klasa. Obiˇcno su varijable, funkcije i klase odredenog modula specijalizirane namjene, pa se module može interpretirati kao grupiranje koda i najˇceš´ce je taj kod sliˇcne namjene. ¯ u poglavlju 12.2) sadrži varijable pi i e koje Npr. modul math (obraden predstavljaju matematiˇcke konstante te niz matematiˇckih funkcija kao što su sqrt, log, pow, exp, sin, cos itd. ¯ Da bi se objekti odredenog modula mogli koristiti u kodu, potrebno je ¯ uˇcitati (importirati) modul ili uˇcitati odredeni objekt iz modula. Uˇcitavanje modula vrši se pomo´cu naredbe import cˇ ija je osnovna sintaksa import module_name

gdje je module_name ime modula. Nakon što je modul uˇcitan, može se koristiti objekte modula (varijable, funkcija i klase) tako da se unese ime modula, toˇcka te ime objekta koji se želi koristiti. Jednom naredbom import može se uˇcitati više modula na slijede´ci naˇcin:

2.4 moduli

import module1, modul2, modul3

Uˇcitanom modulu se može dodijeliti novo ime. To se može napraviti pomo´cu kljuˇcne rijeˇci as: import module_name as new_name

nakon cˇ ega se modul može koristiti pomo´cu novog imena. Moduli cˇ esto sadržavaju velik broj objekata, a njihovim uˇcitavanjem bespotrebno se troše memorijski i procesorski resursi. Kako bi se izbjeglo uˇcita¯ ¯ vanje cijelog modula, mogu´ce je iz odredenog modula uˇcitati samo odredene objekte: from module_name import object_name

Ako se direktno uˇcita objekte iz modula, tada ih se koristiti samo preko imena objekta. Kao i sam modul, mogu´ce je uˇcitati objekt nekog modula pod novim imenom: from module_name import object_name as object_new_name

¯ Za uˇcitavanje svih objekata odredenog modula koristi se: from module_name import *

Izvorni kod 2.2: Korištenje objekata modula 1

#!/usr/bin/python

2 3 4 5 6

# importiraj sys modula import sys print sys.platform # ispisi platformu (operaticni sustav) print sys.version # ispisi verziju Pythona

7 8 9 10 11

# importiraj modul math kao m import math as m print m.pi # ispisi vrijednost broja pi print m.sin(m.pi/2.0) # ispisi vrijednost sinusa kuta pi/2

12 13 14 15

# iz modula datetime importiraj objekt date from datetime import date print date.today() # ispisi danasnji datum

16 17 18 19

# iz modula random importiraj funkciju random kao nasumicni from random import random as nasumicni print nasumicni() # ispisi nasumicni broj

20 21 22 23 24 25

# Importiraj sve objekte iz modula string from string import * print uppercase # ispis svih velikih slova print lowercase # ispis svih velikih slova print digits # ispis svih znamenaka linux2 2.7.3 (default, Apr 14 2012, 08:58:41) [GCC] 3.14159265359 1.0 2013-03-05 0.952486831091 ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz 0123456789

9

3

T I P O V I P O D ATA K A

Varijable se ne moraju explicitno deklarirati. Naime, deklaracija se dešava prilikom pridruživanja vrijednosti varijabli. Odnosno, varijable se pridružuju memorijskim lokacijama na kojima je zapisana vrijednost. Znak jednakosti = se koristi za pridruživanje vrijednosti varijablama. Na primjer: 1

#!/usr/bin/python

2 3 4 5

brojac duljina ime

= 100 # Integer = 1000.0 # Float = ’Hrvoje’ # String

6 7 8 9

print brojac print duljina print ime

Ovdje su 100, 1000.0 i Hrvoje vrijednosti pridružene varijablama brojac, duljina i ime. Program c´ e producirati sljede´ci rezultat: 100 1000.0 Hrvoje

Mogu´ce je pridružiti jednu vrijednost u više varijabli. Tada sve varijable gledaju na istu memorijsku lokaciju. Odnosno: 1 2 3 4

#!/usr/bin/python a = b = c = 1 c = 5 print a

što rezultira 1

Varijable a, b ic gledaju na istu lokaciju u memoriji u kojoj piše 1. Brojevi su imutable varijable odnosno nepromjenjive pa kada promijenimo c=5 Python preusmjerava varijablu c na novu lokaciju u memoriji na kojoj piše broj 5, ¯ je mogu´ce a varijable a, b i dalje gledaju na isto mjesto kao i prije. Takoder pridružiti više vrijednosti u više varijabli. 1 2

#!/usr/bin/python a, b, c = 1, 2, ’Hrvoje’

Varijablama a i b se pridružuju memorijske lokacije na kojima su zapisane vrijednosi 1 i 2, dok je varijabli c pridružena memorijska lokacija na kojoj je zapisana vrijednost Hrvoje. Varijable te njihov memorijski prostor mogu´ce je pobrisati naredbom del. >>> a = 10 >>> print a 10 >>> del a >>> print a Traceback (most recent call last): File "", line 1, in NameError: name ’a’ is not defined >>> b = c = 2 >>> print b, c 2 2 >>> del b

11

12

tipovi podataka

>>> print b, c Traceback (most recent call last): File "", line 1, in NameError: name ’b’ is not defined >>> print c 2

Python podržava pet osnovnih tipova podataka; ? Numbers ? String ? List ? Tuple ? Dictionary ¯ Tip podataka odredene varijable može se dobiti naredbom type: >>> a=10 >>> b=11.2 >>> c=’Rijeka’ >>> type(a), type(b), type(c) (, , )

3.1

brojevi

To su nepromjenjivi(immutable) tipovi podataka, odnosno promjena vrijednosti rezultira novim alociranim objektom. Numeriˇcki tip podatka se kreira pridruživanjem vrijednosti varijabli. Odnosno 1 2 3

#!/usr/bin/python var1 = 1 var2 = 10

¯ je mogu´ce pobrisati referencu na numeriˇcki objekt koriste´ci del Takoder naredbu. Sintaksa izgleda ovako: del var1[,var2[,var3[....,varN]]]]

Primjer: 1 2 3

#!/usr/bin/python del var del var_a, var_b

Python podržava cˇ etiri numeriˇcka tipa ? int ? long ? float ? complex Nekoliko primjera oznaˇcavanja numeriˇckih podataka ja prikazana u Tablici 3.1. Mogu´ce je koristiti i malo slovo L za oznaku long, iako se takvo oznaˇcavanje ne preporuˇca zbog velike sliˇcnosti sa brojem 1.

3.2 string

int

long

float

complex

10

51924361L

0.0

3.14j

100

-0x19323L

15.20

45.j

-783

0122L

-21.9

9.322e-36j

-0490

0xDEFABCECBDAECBFBAEl

-90.

.876j

-0x260

535633629843L

-32.54e100

.6545+0J

0x69

-052318172735L

70.2-E12

4.53e-7j

13

Tablica 3.1: Primjeri oznaˇcavanja brojeva

3.2

string

¯ navodnika, jednostrukih Stringovi su definirani kao slijed znakova izmedu (apostrofi) ili dvostrukih. Jednom zadane stringove je nemogu´ce mijenjati jer su stringovi, u Pythonu, nepromjenjivi (imutable) tip podatka. Niz funkcija koje rade promjene nad string varijabama zapravo kreiraju kopije izvorne string varijable. Dijelove stringova (znakove ili niz znakova - string) je mogu´ce dohvatiti operatorima [] i [:] sa indeksima koji poˇcinju od 0 na poˇcetku stringa sve do -1 na kraju. Znak plus (+) oznaˇcava spajanje (concatenation), a asterisk (∗) je operator ponavljanja. Odnosno: 1

#!/usr/bin/python

2 3 4

str = ’Hello World!’ ime = "Rudi"

# zadavanje sa jednostrukim navodnicima # zadavanje sa dvostrukim navodnicima

print print print print print print

# # # # # #

5 6 7 8 9 10 11

str, ime str[0] str[2:5] str[2:] str * 2 str + ’TEST’

print print print print print print

cijelog stringa prvog znaka u stringu od treceg do petog znaka znakova od treceg do zadnjeg stringa dva puta concatenated string

Što c´ e rezultirati Hello World! Rudi H llo llo World! Hello World!Hello World! Hello World!TEST

Nad stringovima je mogu´ce izvoditi niz specijaliziranih operacija pomo´cu funkcija koje su dostupne za varijable tipa string. Funkcije za pretraživanje stringova: count(sub[, start[, end]]) endswith(suffix[, start[, end]]) find(sub[, start[, end]]) index(sub[, start[, end]]) rfind(sub [,start [,end]]) rindex(sub[, start[, end]]) startswith(prefix[, start[, end]])

Funkcije za mjenjanje znakova: expandtabs([tabsize]) replace(old, new[, count]) translate(table[, deletechars])

Iako je mogu´ce definirati string sa jednostrukim i dvostrukim navodnicima, preporuka je da se koriste jednostruki navodnici.

14

tipovi podataka

Funkcije za provjeru vrste znakova: isalnum() isalpha() isdigit() isspace()

Funkcije za rad sa velikim i malim slovima: capitalize() islower() istitle() isupper() lower() swapcase() title() upper()

Funkcije za poravnanje teksta: center(width[, fillchar] ljust(width[, fillchar]) rjust(width[, fillchar]) zfill(width)

Funkcije za spajanje i razdvajanje stringova: join(seq) partition(sep) rpartition(sep) split([sep [,maxsplit]]) splitlines([keepends]) rsplit([sep [,maxsplit]])

Funkcije za brisanje poˇcetnih i krajnjih znakova: lstrip([chars]) rstrip([chars]) strip([chars])

Funkcije za encoding stringova: decode([encoding[, errors]]) encode([encoding[,errors]])

3.3

Iako lista može biti heterogena (sadržavati razliˇcite tipove podataka), preporuka je koristiti listu kao spremnik homogenih podataka. Za heterogene podatke se preporuˇca tuple (poglavlje 3.4)

liste

¯ Lista sadrži podatke odvojene zarezima i omedene uglatim zagradama. Iako je sliˇcna listama u C jeziku, podaci python liste mogu biti razliˇcitog tipa. Kao i kod stringova, pristupanje vrijednostima u listi je mogu´ce pomo´cu operatora [ ] i [ : ] sa indeksima koji poˇcinju od 0 na poˇcetku stringa sve do -1 na kraju. Znak plus (+) se koristi za operator spajanja (concatenation) stirngova, a asterisk (∗) je operator ponavljanja 1

#!/usr/bin/python

2 3 4

list = [ ’abcd’, 786 , 2.23, ’hrvoje’, 70.2 ] tinylist = [123, ’hrvoje’]

5 6 7 8 9 10 11

print print print print print print

list # list[0] # list[1:3] # list[2:] # tinylist * 2 # list + tinylist

Što c´ e rezultirati

print cijele liste print prvog elementa liste print od drugog do treceg elementa liste print od treceg do zadnjeg elementa print liste dva puta # print concatenated lists

3.3 liste

[’abcd’, 786, 2.23, ’hrvoje’, 70.2] abcd [786, 2.23] [2.23, ’hrvoje’, 70.2] [123, ’hrvoje’, 123, ’hrvoje’] [’abcd’, 786, 2.23, ’hrvoje’, 70.2, 123, ’hrvoje’]

Za manipulaciju listama cˇ esto se koristi naredba len za provjeru broja elemenata liste, naredbom insert se ume´ce novi element u listu te naredba del kojom se brišu pojedini elementi iz liste. 1

#/user/bin/python

2 3 4 5 6 7 8 9

list = [2,3,4,5] print(len(list)) #broj elemnata u listi print list list.insert(0,1) #umetanje elementa 1 u listu na prvu poziciju print list del list[-1] #brisnje zadnjeg elementa iz liste print list 4 [2, 3, 4, 5] [1, 2, 3, 4, 5] [1, 2, 3, 4]

Naredbom range mogu´ce je stvoriti listu brojeva u aritmetiˇckom nizu što je cˇ esto potrebno kod korištenja for petlje (poglavlje 7.1). Sintaksa naredbe range je range(stop), range(start, stop), range(start, stop, step),

gdje je start prvi element, stop je gornja granica i step je korak aritmetickog niza. 1

#/user/bin/python

2 3 4 5 6 7 8

list=range(7) # aritmeticki niz 0,..,6 print list list = range(2,7) # aritmeticki niz 2,..,6 print list list = range(0,7,2) # aritmeticki niz s korakom 2 print list [0, 1, 2, 3, 4, 5, 6] [2, 3, 4, 5, 6] [0, 2, 4, 6]

Naredbe za dodavanje elemenata u listu su: append(x) insert(i, x) extend(L)

append dodaje element x na kraj liste, insert ubacuje element x na poziciju i a extend proširuje postoje´cu listu sa listom L.

Naredbe za brisanje elemenata iz liste su: remove(x) pop(i) del L[index]

remove briše prvi element koji ima vrijednost x a pop briše element na poziciji i. Naredba del L[index] briše element list L na indeksu index. Osim funkcija za brisanje i dodavanje elemenata, Python liste imaju još ¯ ugradenih praktiˇcnih funkcija. index vra´ca indeks prvog elementa koji ima

15

16

tipovi podataka

vrijednost x, count prebrojava sve elemente koji su jednaki x, sort sortira ¯ elemente liste a reverse rasporeduje elemente u obrnutom redosljedu od inicijalnog. index(x) count(x) sort() reverse()

Izvorni kod 3.1: Dodavanje i brisanje elemenata liste 1 2

ljudi = [’Marko’, ’Mirela’, ’Luka’] nadljudi = [’Chuck’,’Arnold’,’Steven’,’Silvester’]

3 4 5 6 7 8 9

ljudi.append(’Igor’) print ljudi nadljudi.insert(1,’Anita’) print ljudi nadljudi.extend(ljudi) print nadljudi

10 11 12 13 14 15 16

nadljudi.pop(1) print nadljudi nadljudi.remove(’Igor’) print nadljudi del nadljudi[4:] print nadljudi

17 18 19 20

print ljudi.index(’Marko’) ljudi.append(’Marko’) print ljudi.count(’Marko’)

21 22 23 24 25

nadljudi.sort() print nadljudi nadljudi.reverse() print nadljudi [’Marko’, ’Mirela’, ’Luka’, ’Igor’] [’Marko’, ’Mirela’, ’Luka’, ’Igor’] [’Chuck’, ’Anita’, ’Arnold’, ’Steven’, ’Silvester’, ’Marko’, ’Mirela’, ’Luka’, ’Igor’] [’Chuck’, ’Arnold’, ’Steven’, ’Silvester’, ’Marko’, ’Mirela’, ’Luka’, ’Igor’] [’Chuck’, ’Arnold’, ’Steven’, ’Silvester’, ’Marko’, ’Mirela’, ’Luka’] [’Chuck’, ’Arnold’, ’Steven’, ’Silvester’] 0 2 [’Arnold’, ’Chuck’, ’Silvester’, ’Steven’] [’Steven’, ’Silvester’, ’Chuck’, ’Arnold’]

3.4

tuple

Tuple je tip podatke sliˇcan listi. Sastoji se od vrijednosti odvojenih zarezom ¯ i za razliku od listi omeden zagradama (). Python dopušta fleksibilnost izostavljanja zagrada prilikom definiranja tuplea. Postoji mnogo sliˇcnosti sa listama, ali i nekoliko temeljnih razlika: ? pristupanje elementima liste i tuplea vrši se na identiˇcan naˇcin (preko indeksa) ? i list i tuple su iterabilni ? lista može mijenjati broj elemenata i vrijednosti elemenata, dok tuple ne može

3.5 dictionary

? nad tupleom se ne mogu provoditi operacije koje mjenjaju sam tuple (sort, remove i sl.) 1

#!/usr/bin/python

2 3 4

tuple = ( ’abcd’, 786 , 2.23, ’hrvoje’, 70.2 tinytuple = (123, ’hrvoje’)

)

5 6 7 8 9 10 11

print print print print print print

tuple tuple[0] tuple[1:3] tuple[2:] tinytuple * 2 tuple + tinytuple

# # # # # #

print liste prints prvog elementa liste print od drugog do treceg elementa liste print od treceg do zadnjeg elementa print liste dva puta print liste nastale spajanjem dvije liste

12 13 14

istotuple = 2, True, ’teskt’ print istotuple

# Zadavanje tuplea bez zagrada

Što c´ e rezultirati (’abcd’, 786, 2.23, ’hrvoje’, 70.200000000000003) abcd (786, 2.23) (2.23, ’hrvoje’, 70.200000000000003) (123, ’hrvoje’, 123, ’hrvoje’) (’abcd’, 786, 2.23, ’hrvoje’, 70.200000000000003, 123, ’hrvoje’) (2, True, ’teskt’)

Sljede´ci kod c´ e producirati grešku u liniji 5, jer smo pokušali promijeniti vrijednost u tupleu 1

#!/usr/bin/python

2 3 4 5 6

tuple = ( ’abcd’, 786 , 2.23, ’hrvoje’, 70.2 ) list = [ ’abcd’, 786 , 2.23, ’hrvoje’, 70.2 ] tuple[2] = 1000 # greska list[2] = 1000 # ok

Tuple se vrlo cˇ esto koristi za višestruko dodjeljivanje: >>> a, b, c = 3, 10, ’neki tekst’ >>> print a 3 >>> print b 10 >>> print c neki tekst

što se cˇ esto koristi prilikom vra´canja više vrijednosti iz funkcije (poglavlje 8.2) 3.5

dictionary

Dictionary možemo smatrati jednostavnim pridruživanjem odnosno preslikavanjem svih elemenata jednog skupa elementima drugog skupa. 1

#!/usr/bin/python

2 3 4 5

dict = {} dict[’jedan’] = ’Ovo je jedan’ dict[2] = ’Ovo je dva’

6 7

tinydict = {’ime’: ’hrvoje’,’code’:6734, ’odjel’: ’admin’}

8 9 10 11

print dict[’jedan’] print dict[2] print tinydict

# print vrijednosti ’jedan’ # print vrijednosti za 2 # print cijelog dictionary

17

18

tipovi podataka

12 13

print tinydict.keys() # print svih kljuceva print tinydict.values() # print svih vrijednosti

Što c´ e rezultirati Ovo je jedan Ovo je dva {’odjel’: ’admin’, ’code’: 6734, ’ime’: ’hrvoje’} [’odjel’, ’code’, ’ime’] [’admin’, 6734, ’hrvoje’]

Objekti tipa dict nemaju poredane elemente. 3.6

skupovi

>>> basket = [’apple’, ’orange’, ’apple’, ’pear’, ’orange’, ’banana’] >>> fruit = set(basket) # create a set without duplicates >>> fruit set([’orange’, ’pear’, ’apple’, ’banana’]) >>> ’orange’ in fruit # fast membership testing True >>> ’crabgrass’ in fruit False >>> # Demonstrate set operations on unique letters from two words ... >>> a = set(’abracadabra’) >>> b = set(’alacazam’) >>> a # unique letters in a set([’a’, ’r’, ’b’, ’c’, ’d’]) >>> a - b # letters in a but not in b set([’r’, ’d’, ’b’]) >>> a | b # letters in either a or b set([’a’, ’c’, ’r’, ’d’, ’b’, ’m’, ’z’, ’l’]) >>> a & b # letters in both a and b set([’a’, ’c’]) >>> a ^ b # letters in a or b but not both set([’r’, ’d’, ’b’, ’m’, ’z’, ’l’])

4

O P E R AT O R I

Operatori su osnovni dio Pythona i omogu´cuju operacije na varijablama (operandima). Najˇceš´ce se povezuju sa algebarskim matematiˇckim operaci¯ jama, medutim operatori mogu biti i “ne matematiˇcke” naravi. Python operatore možemo podjeliti prema namjeni: ? Aritmetiˇcki operatori ¯ ? Relacijski operatori ili operatori usporedivanja ? Operatori dodjeljivanja ? Logiˇcki operatori ? Bitovni operatori ˇ ? Clanski operatori ? Operatori identiteta ili s obzirom na broj operanada: ? Unarni operatori (jedan operand) ? Binarni operatori (dva operanada) 4.1

ˇ aritmeti cki operatori

Aritmetiˇcki operatori omogu´cuju osnovne matematiˇcke operacije na brojevima. Rezultat aritmetiˇckog operatora je uvijek broj tj. varijabla tipa float ili int, ovisno o tipovima operanada.. Operator

Opis

Primjer za x=9.0 i y=2.0

+

Zbrajanje

x+y daje 11

-

Oduzimanje

x-y daje 7

*

Množenje

x*y daje 18

*

Dijeljenje

x/y daje 4.5

%

Ostatak dijeljenja

x%y daje 1

//

Cjelobrojno dijeljenje

x//y daje 4

**

Potenciranje

x**y daje 81

Tablica 4.1: Aritmetiˇcki operatori

4.2

relacijski operatori ili operatori usporeðivanja)

¯ Relacijski operatori omogu´cavaju usporedivanje vrrijednosti varijabli. Rezultat relacijskih operatora je varijabla tipa bool i može poprimiti vrijednosti (True ili False).

19

20

operatori

Operator

Opis

Primjer za x=9.0 i y=2.0

==

Jednakost

x==y daje False

!=

Nejednakost, razliˇcitost

x!=y daje True



Nejednakost, razliˇcitost

xy daje True

>

Ve´ce

x>y daje True

>=

Ve´ce ili jednako

x>=y daje True

<

Manje

x c or not b > c print f False True True

4.5

ˇ clanski operatori

ˇ ¯ ¯ Clanski opratori služe za odredivanje pripadnosti odredenoj listi. Osnovni cˇ lanski operator je operator in, i može se proširiti sa logiˇckim operatorom not te rvot oprator not in. Rezultat cˇ lanskih opratora je bool varijabla koja daje saznanje da li zadani element pripada listi ili ne pripada list. >>> a >>> 2 True >>> 3 False >>> 5 True

= [1, 2, 3, 8, 6] in a

4.6

operatori identiteta

not in a not in a

¯ Operatori identita usporeduju da li su Python objekti zapisani na istom ¯ mjestu u memoriji. Postoji operator is i is not koji usporeduju id Python objekta. id Python objekta se može dohvatiti naredbom id. >>> a=[1, 2, 3] >>> b=[1, 2, 3] >>> id(a) 139967012502704 >>> id(b) 139967012502848 >>> a is b False >>> b=a >>> id(b) 139967012502704 >>> a is b

21

5

O S N O V N E N A R E D B E Z A U N O S I I S P I S P O D ATA K A

5.1

print

Iz Python koda mogu´ce je ispisivati poruke u konzolu pomo´cu naredbe print. Osnovna sintaksa za ispisivanje je print variable

gdje je variable ima varijable cˇ iju vrijednost se želi ispisati. Mogu´ce je ispisivati vrijednosti više varijabli: print variable1, variable2

Naprednije mogu´cnosti ispisa mogu´ce je kontrolirati pomo´cu ubacivanja vrijednosti varijabli u string pomo´cu printf formata. Simbolom % i pripada¯ ju´cim znakom za tip podatka može se u stringu odreduju pozicije na koje se želi ubaciti vrijednosti varijabli, a nakon stringa i simbola % slijede imena samih varijabli. >>> var_a=7 >>> var_b=13.54592 >>> var_str = ’a iznosi %d, b iznosi %f’ % (var_a, var_b) >>> print var_str a iznosi 7, b iznosi 13.545920

Primjer

Opis

%s

String

%d

Cijeli broj

%f

Decimalni broj

%.2f

Decimalni broj sa dvije decimale

%10.3d

Decimalni broj sa dvije decimale i rezerviranih najmanje 10 znakova Tablica 5.1: printf formatiranje

Više o oblikovanju stringova pomo´cu operatora % opisano je u poglavlju 10.1. Izvorni kod 5.1: Razliˇciti primjeri ispisa 1 2

print ’Ispisi ovo na ekranu!’ print ’Ispisi’ + ’ jos’ + ’ ovo.’

3 4 5 6 7 8 9 10

a=12 type(a) print a print ’a=’, a print ’a=’ + str(12) print ’Ovo je a:%d’ % (a) print ’Ovo je a:%.2d’ % (a)

11 12 13 14 15

b=15.365982 type(b) print ’Ovo je b:’,b print ’Ovo je b:’+str(b)

23

24

osnovne naredbe za unos i ispis podataka

16 17 18

print ’Ovo je b:%f’ % (b) print ’Ovo je b:%.2f’ % (b) print ’Ovo je b:%10.3f’ % (b)

19 20

print ’ovo je a: %d a ovo je b: %f’ % (a,b)

21 22 23 24

print ’a = {broj_a}, b = {broj_b}’.format(broj_a = a, broj_b = b) print ’a = {broj_a}, b = {broj_b:.2f}’.format(broj_a = a, broj_b = b) print ’a = {broj_a:8d}, b = {broj_b:8.2f}’.format(broj_a = a, broj_b = b) Ispisi ovo na ekranu! Ispisi jos ovo. 12 a= 12 a=12 Ovo je a:12 Ovo je a:12 Ovo je b: 15.365982 Ovo je b:15.365982 Ovo je b:15.365982 Ovo je b:15.37 Ovo je b: 15.366 ovo je a: 12 a ovo je b: 15.365982 a = 12, b = 15.365982 a = 12, b = 15.37 a = 12, b = 15.37

5.2

input

5.3

raw_input

6

UVJETNA GRANANJA

¯ Odredene naredbe ili djelove koda mogu´ce je izvršavati ili preskoˇciti ovisno o vrijednosti postavljenog logiˇckog uvjeta. 6.1

if

Ako uvijet nije zadovoljen

Logički uvjet

Ako je uvjet zadovoljen

Naredbe

Slika 6.1: Dijagram toka if naredbe

Slika 6.1 prikazuje jednostavno grananje u programskom kodu. Osnovna sintaksa if naredbe je if condition : command

Navedeni izraz uvjetuje izvršavanje naredbe command (ili više naredbi) na temelju logiˇckog uvjeta condition. Zadane naredbe c´ e se izvršiti samo ako je logiˇcki uvijet zadovoljen. Izvorni kod 6.1: Jednostavan primjer upotrebe if naredbe 1

#!/usr/bin/python

2 3 4 5

a = input("a: ") if a < 0: a = -a print a

Pokretanjem Izvornog koda 6.1 i utipkavanjem pozitivnog broja ispiše se utipkani broj: user@machine:~> python if_01.py a: 5 5

¯ Medutim, utipkavanjem negativnog broja zadovoljava se postavljeni logiˇcki uvjet i izvrši se operacija a = -a te se potom ispiše pozitivna vrijednost utipkanog broja: user@machine:~> python if_01.py a: -11 11

U sluˇcaju kad postoji više naredbi uvjetovanih istim logiˇckim uvjetom, naredbe možemo objediniti pod jednim uvjetom te ih odvojiti sa toˇckazarezom (;). Ako su uvjetovane naredbe kompleksne ili ih ima više, naredbe pišemo u uvuˇcenim recima nakon if naredbe. Sve uvuˇcene naredbe do prvog retka koji je poravnat sa if naredbom su uvjetovane.

25

26

uvjetna grananja

Izvorni kod 6.2: Pisanje složenijeg uvjetovanog grananja 1

#!/usr/bin/python

2 3 4 5

a = 0 b = input("b: ") c = input("c: ")

6 7 8

if b < 0: a = 1; b = -b print a, b

9 10 11 12 13 14 15

if c < b: a = 2 b = c - b c = c +1 a = b + c print a, b, c user@machine:~> python if_02.py b: -6 c: 4 1 6 3 -2 5

6.2

else

Ova naredba omogu´cuje složeniji oblik grananja od naredbe if. Naredba ima dvije grane koje se mogu izvršiti u ovisnosti o uvjetu. Svaka grana/mogu´cnost omogu´cuje izvršavanje pripadaju´cih naredbi (Slika 6.2). Ako je uvjet zadovoljen

Naredbe A

Logički uvjet

Ako uvijet nije zadovoljen

Naredbe B

Slika 6.2: if-else dijagram toka

else naredba koristi se u paru sa if i služi za grananje u sluˇcaju da uvjet nije zadovoljen. Sintaksa naredbe je: if condition : command1 else: command2

Izvorni kod 6.3: Primjer upotrebe else naredbe 1

#!/usr/bin/python

2 3 4

a = input("a: ") b = input("b: ")

5 6 7

if a < b: b = a

6.3 elif

8 9 10 11

a = 0 else: a = b b = 0

12 13

print a, b user@machine:~> python if_else_01.py a: 1 b: 8 0 1 user@machine:~> python if_else_01.py a: 5 b: 3 3 0

6.3

elif

Za dodatna grananja uvjetovana novim logiˇckim uvjetima (Slika 6.3) služi naredba elif. Iako se sa ugnježdenim grananjem može posti´ci isti rezultat, elif omogu´cuje jednostavnije i preglednije grananje algoritma. Naredba elif omogu´cuje grananje u alogritmu samo ako prethodni uvjeti (if ili elif) nisu zadovoljeni. Treba napomenuti da se u sluˇcaju korištenja if-elif-else grananja uvijek izvrši samo jedan set uvjetovanih naredbi. Iz same definicije dodatnog uvjetnog grananja, naredba elif uvijek dolazi u kombinaciji sa naredbom if, te se upotrebljava u sljede´coj osnovnoj sintaksi if condition1 : command1 elif condition2 : command2

Kao ni u sluˇcaju upotrebe else naredbe dodatno grananje se mora napisati u novom retku. Uobiˇcajeno je da se naredbe koje slijede nakon uvjeta pišu u novom uvuˇcenom retku. Proširena upotreba ukljuˇcuje kombinaciju više elif naredbi: if condition1 : command1 elif condition2 : command2 elif condition3 : command3

Grananje se može napraviti i kombinacijom sve tri navedene naredbe: if condition1 : command1 elif condition2 : command2 else : command2

U Izvornom kodu 6.4 napisan je jednostavan primjer grananja koriste´ci navedene naredbe. Izvorni kod 6.4: Primjer kombinacije naredbi if, elif i else 1

#!/usr/bin/python

2 3

a = input("a: ")

4 5 6 7 8 9 10

if a < 0: print ’a je negativan’ elif a > 0: print ’a je pozitivan’ else: print ’a je nula’

27

28

uvjetna grananja

Logički uvjet A

Ako je uvjet zadovoljen

Naredbe A

Ako uvijet nije zadovoljen

Logički uvjet B

Ako je uvjet zadovoljen

Naredbe B

Ako uvijet nije zadovoljen

Logički uvjet C

Ako je uvjet zadovoljen

Naredbe C

Ako uvijet nije zadovoljen Naredbe D

Slika 6.3: Dijagram toka za složeni uvjet grananja

Unosom pozitivnog broja izvršava se naredba koja je uvjetovana uvjetom pod elif naredbom: user@machine:~> python if_elif_else_01.py a: 33 a je pozitivan

7

PETLJE

7.1

for

Naredba for koristi se za iteriranje elemenata u nekom iterabilnom objektu (lista, tuple, string itd.). Njezina osnovna sintaksa je for iter in list : commands

Naredbe commands izvršavaju se jednom za svaki element iz niza list. Objekt iter je iterator koji pokazuje na elemente niza list. Za razliku od jezika C, C++ iter se ne briše nakon što for naredba završi. Izvorni kod 7.1: Upotreba for naredbe 1 2 3

#!/usr/bin/python for num in range(2, 5): print(num)

4 5

print(num) 2 3 4 4

Izvorni kod 7.2: Naredba for s listom stringova 1 2 3 4

#!/usr/bin/python text=[’ide’,’patka’,’preko’,’save’] for r in text: print(r) ide patka preko save

Izvorni kod 7.3: Naredba for i stirng 1 2

#!/usr/bin/python for c in ’patka’: print(c) p a t k a

Izvorni kodovi 7.2 i 7.3 prikazuju upotrebu stringova u for naredbi. Do indeksa elemenata u nizu može se do´ci korištenjem naredbi len i range (poglavlje ??) kao što se može vidjeti na primjeru Izvornog koda 7.4: Izvorni kod 7.4: Naredba for s listom stringova 1 2 3 4

#!/usr/bin/python text=[’ide’,’patka’,’preko’,’save’] for i in range(len(text)): print i, text[i]

29

30

petlje

0 1 2 3

ide patka preko save

7.2

while

Osnovne sintaksa naredbe while je while conditon : commands

Naredbe commands izvršavaju se dokle god je uvjet condition istinit. Naredbe

Ako je uvjet zadovoljen

Logički uvjet

Ako uvijet nije zadovoljen

Slika 7.1: Dijagram toka while petlje

Izvorni kod 7.5: Upotreba while naredbe 1 2 3 4 5

#!/usr/bin/python i=0 while i*i> a = [1, 2, 3, 4, 5] >>> b = [’a’, ’b’, ’c’] >>> print zip(a, b) [(1, ’a’), (2, ’b’), (3, ’c’)]

Broj argumenta funkcije zip može biti i više od dva a rezultat je analogan korištenju funkcije zip sa dva argumenta (Izvorni kod 7.10). Izvorni kod 7.10: Upotreba zip naredbe sa više lista. 1 2

#!/usr/bin/python # -*- coding: utf-8 -*-

3 4 5 6

imena = [’Vlatko’, ’Ivana’, ’Darko’, ’Igor’] prezimena = [’Hoorvat’, ’Bali’, ’Copljar’, ’Worry’] visine = [1.79, 1.86, 2.10, 2.03]

7 8 9

for i, p, v in zip(imena, prezimena, visine): print ’%s %s (%.2f m)’ % (i, p, v)

7.6 numeriranje liste

Vlatko Hoorvat (1.79 m) Ivana Bali (1.86 m) Darko Copljar (2.10 m) Igor Worry (2.03 m)

7.6

numeriranje liste

Funkcija enumerate omogu´cuje numeraciju elemenata liste na naˇcin da kreira iterabilni enumerate objekt koja sadrži tuplove elemenata izvorne liste te njihve indekse. Dodatno, enumerate može primiti argument koji ukazuje od kojeg broj poˇcinje numeracija. Izvorni kod 7.11: Numeriranje elemenata liste pomo´cu enumerate. 1 2

#!/usr/bin/python # -*- coding: utf-8 -*-

3 4

X = [12.3, 18.6, 2.1, 12.3]

5 6 7 8

print ’Iteriranje pomocu enumerate:’ for x in enumerate(X): print x

9 10 11 12

print ’Kreni od 0:’ for i, x in enumerate(X): print ’a[%d]: %f’ % (i, x)

13 14 15 16

print ’Kreni od 1:’ for i, x in enumerate(X, 1): print ’a[%d]: %f’ % (i, x) Iteriranje pomocu enumerate: (0, 12.3) (1, 18.6) (2, 2.1) (3, 12.3) Kreni od 0: a[0]: 12.300000 a[1]: 18.600000 a[2]: 2.100000 a[3]: 12.300000 Kreni od 1: a[1]: 12.300000 a[2]: 18.600000 a[3]: 2.100000 a[4]: 12.300000

33

8

FUNKCIJE

¯ Funkcije su grupirani dio koda koji izvodi odredeni zadatak. Prednosti upotrebe funkcija su: ? Smanjenje ponavljanja istog koda ? Pove´cavanje modularnosti koda - rašˇclanjivanje složenog koda na jednostavnije djelove ? Pove´canje cˇ itkosti koda. Rad sa funkcijama u Pythonu omogu´cuje veliku fleksibilnost. Funkcije ¯ mogu biti dodijeljene varijablama, spremljene u listama i prosljedivane kao argumenti drugim funkcijama. Razlikujemo dva osnovna tipa Python funkcija: ¯ ? Ugradene funkcije su funkcije koje su dio Python programskog jezika ? Funkcije definirane od strane korisnika. 8.1

definiranje i pozivanje funkcija

Kljuˇcna rijeˇc def omogu´cuje definiranje funkije. Najjednostavnija sintaksa koja omogu´cuje definiranje funkcije je: def functionname(): commands

gdje je functionname odabrano ime funkcije a commnds je naredba ili više naredbi koje funkcija izvršava. Prethodno definiranu funkciju možemo izvršiti pozivom te funkcije. Funkcija se poziva pomo´cu imena funkcije nakon kojeg slijede zagrade. Izvorni kod 8.1: Definicija i pozivanje jednostavne funkcije 1

#!/usr/bin/python

2 3 4

def pozdrav(): print ’Pozdrav!’

5 6

pozdrav() Pozdrav!

Funkciju je mogu´ce proširiti na naˇcin da prima jedan ili više argumenata. Argumenti se definiraju pomo´cu imena argumenata razdvojenih zarezom u zagradama nakon imena funkcije: def functionname(arg1, arg2, ... , argn): commands

Funkcija sa argumentima se poziva tako da se u zagradama nakon imena funkcije upišu vrijednosti argumenata. Argumenti se u pozivu funkcije razdvajaju zarezom kao i prilikom definicije funkcije.

35

Poziv funkcije uvijek mora biti nakon definicije funkcije. Ne može se pozvati funkcija koja prethodno nije definirana.

36

funkcije

Izvorni kod 8.2: Definicija funkcije koja prima argument 1

#!/usr/bin/python

2 3 4

def pozdrav( ime ): print ’Pozdrav’, ime, ’!’

5 6 7 8

def zbroji( a, b ): c = a + b print a, ’+’, b, ’=’, c

9 10 11

pozdrav(’Marko’) zbroji(2, 5) Pozdrav Marko ! 2 + 5 = 7

8.2

´ vra canje vrijednosti iz funkcije

Funkcija može vratiti vrijednost nakon poziva funkcije. Vrijednost koju funkcija vra´ca doslovno zamjenjuje funkciju u kontekstu u kojem je ona pozvana, a tip vra´cenog podatka može biti bilo koji Python objekt. Vra´canje vrijednosti se definira naredbom return nakon koje se zaustavlja izvršavanje funkcije: def functionname(arg1, arg2, ... , argn): commands return value

Izvorni kod 8.3: Definicija funkcije koja prima više argumenata i vra´ca vrijednost 1

#!/usr/bin/python

2 3 4 5

def zbroji(a, b): c = a + b return c

6 7 8

x = zbroji(2, 6) y = zbroji(x, -5)

9 10

print x, y 8 3

Funkcija može sadržavati više return naredbi (obiˇcno u razliˇcitim uvjetnim grananjima) i svaka može vratiti razliˇcit tip podatka (Izvorni kod 8.4). Izvorni kod 8.4: Funkcija koja vra´ca razliˇcite tipove 1

#!/usr/bin/python

2 3 4 5 6 7

def luda_funkcija(a, b): if(a > b): return a + b else: return ’malo teksta’

8 9 10

x = luda_funkcija(6, 2) y = luda_funkcija(x, 10)

11 12

print x, y 8 malo teksta

8.3 argumenti sa zadanim vrijednostima

Vrlo cˇ esto, javlja se potreba da funkcija vra´ca više vrijednosti. To se može ostvariti vra´canjem tuplea. Izvorni kod 8.5: Funkcija koja vra´ca više vrijednosti korsite´ci tuple 1

#!/usr/bin/python

2 3 4 5 6

def f(a, b): z = a + b r = a - b return z, r

7 8 9

x = f(6.0, 2.0) print x

10 11 12 13

c, d = f(6.0, 2.0) print c print d (8.0, 4.0) 8.0 4.0

8.3

argumenti sa zadanim vrijednostima

Funkcije mogu biti dfinirane i sa zadanim vrijednostima argumenata. Argumenti sa zadanim vrijednostima mooraju biti definirani nakon argumenata bez zadanih vrijednosti. def functionname(arg1=val1, arg2=val2, ... , argn=valn): commands return value

Prilikom poziva funkcije, mogu´ce je funkciju pozvati bez zadanih argumenata. Izvorni kod 8.6: Funkcija sa zadanim argumentom 1

#!/usr/bin/python

2 3 4 5 6 7

def f(a, b=0.0): if(a > b): return a - b else: return b

8 9 10 11

a = f(6.0, 2.0) b = f(20.0) c = f(-3.0)

12 13

print a, b, c 4.0 20.0 0.0

8.4

keyword i non-keyword argumenti

Funkciju se može pozivati na naˇcin da se, pomo´cu keyword argumenata, toˇcno specificiraju argumenti. Keyword argumenti su oni argumenti koji se, pri pozivu funkcije, zadaju imenom i vrijednoš´cu, za razliku od nonkeyword argumenata koji se zadaju samo kao vrijednost. Redosljed zadavanja keyword argumenata može biti proizvoljan dok kod kombinacije nonkeyword i keyword argumenata prvo moraju biti specificirani non-keyword argumenti.

37

38

funkcije

1 2 3

# Definiranje funkcije def f(x, a, b): return x*(a+b)

4 5 6

# Poziv funkcije sa keyword argumentima f(x=10, b=0, a=8)

7 8 9

# Poziv funkcije sa mjesovitim keyword i non-keyword argumentima f(10, b=0, a=8)

Posebna sintaksa definiranja funkcije pomo´cu * i ** omogu´cuje korištenje varijabilnog broja argumenata funkcije. Argument definiran sa jendom zvjezdicom, uobiˇcajeno *args, obuhva´ca sve non-keyword argumente u jedan tuple. Upotrebom dvostruke zvijezdice **kwargs omogu´cuje pohranu svih keyword argumenata u dictionary gdje su kljuˇcevi imena argumenata a vrijednosti argumenata su pohranjene u vrijednosti pod pripadaju´cim kljucˇ em. Izvorni kod 8.7: Funkcija sa *args i **kwargs argumentima 1 2

#!/usr/bin/python # -*- coding: utf-8 -*-

3 4 5 6

def funkcija(*args, **kwargs): print ’non-keyword argumenti:’, args print ’keyword argumenti:’, kwargs

7 8 9

for key, value in kwargs.iteritems(): print "%s = %s" % (key, value)

10 11

funkcija(10, ’bla bla’, a=3, b=True, c=(0,0)) non-keyword argumenti: (10, ’bla bla’) keyword argumenti: {’a’: 3, ’c’: (0, 0), ’b’: True} a = 3 c = (0, 0) b = True

Prilikom korištenja oba operatora za “raspakiravanje” argumenata (* i **) važno je poštivati redoslijed. I kod definicije funkcije i kod poziva funkcije prvo se koriste non-keyword argumenti a ond akeyword argumenti.

Osim prilikom definicije funkcije, sintaksa *args i **kwargs može se koristiti i pri pozivu funkcije. Zvijezdicom * se tuple vrijednosti “raspakiraju” u argumente funkcije. Analogno, keyword argumente definirane u dictionaryu može se proslijediti funkciji pomo´cu dvije zvijezdice **. U izvornom kodu 8.8 prikazano je korištenje *args i **kwargs prilikom poziva funkcije. Izvorni kod 8.8: *args i **kwargs argumenti prilikom poziva funkcije 1 2

#!/usr/bin/python # -*- coding: utf-8 -*-

3 4 5 6 7 8 9 10

def funkcija(a, b, c, d, e): print ’argumenti:’ print ’ a:’, a print ’ b:’, b print ’ c:’, c print ’ d:’, d print ’ e:’, e

11 12 13

a = (1, 2, 3, 4, 5) funkcija(*a)

14 15 16

kwa = {’d’:1, ’c’:2, ’a’:3, ’e’:4, ’b’:5} funkcija(**kwa)

17 18 19

a = (5, 4) kwa = {’e’:1, ’d’:2, ’c’:3}

8.5 ugnježdena definicija funkcije

20

funkcija(*a, **kwa) argumenti: a: 1 b: 2 c: 3 d: 4 e: 5 argumenti: a: 3 b: 5 c: 2 d: 1 e: 4 argumenti: a: 5 b: 4 c: 3 d: 2 e: 1

8.5

ugnježdena definicija funkcije

Ugnježdeno definiranje funkcije (eng. closure ili nested function definition) omogu´cuje definiciju funkcije u funkciji. Ugnježdena definicija funkcije je ¯ mogu´ca u Pythonu jer su funkcije objekti te ih je mogu´ce prosljedivati kao argumente drugim funkcijama te vra´cati kao rezultat funkcije. Ugnježdeno definirane funkcije mogu se pokazati korisne jer unutarnja funkcija može koristiti objekte definirane u vanjskoj: >>> ... ... ... ... >>> >>> 15 >>> 20

8.6

def vanjska(vanjski_argument): def unutarnja(unutarnji_argument): return vanjski_argument * unutarnji_argument return unutarnja f = vanjska(5) f(3) f(4)

anonimne funkcije

Lambda funkcije su funkcije bez imena tj. anonimne funkcije. Najˇceš´ce se koriste za definiranje vrlo jednostavnih i kratkih funkcija. Definiranje anonimne funkcije se vrši korištenjem kljuˇcne rijeˇci lambda: lambda argumenti: izraz

Upotrebu jednostavne funkcije koja vra´ca apsolutnu razliku dva broja 1 2

def diff(a, b): return abs(a - b)

3 4

print diff(7, 11) 4

može se zamjeniti lambda funkcijom: 1 2

>>> print (lambda a, b: abs(a - b))(7, 11) 4

39

40

funkcije

Anonimne funkcije se cˇ esto pokriste kao argumenti drugih funkcija koje oˇcekuju objekt tipa funkcija kao argument. sorted funkcija oˇcekuje argument key kao funkciju, koja je ve´cini sluˇcajeva veoma jednostavna funkcija i obiˇcno se koristi anonimna funkcija da se izbjegne posebno definiranje funkcije. U sljede´cem primjeru napravljeno je sortiranje liste tupleova po drugim cˇ lanovima tupleova: >>> sorted([(5, 5), (13, 2), (11, 6), (7, 4)], key=lambda a: a[1]) [(13, 2), (7, 4), (5, 5), (11, 6)]

Još jedan primjer upotrebe anonimnih funkcija je u ugnježdenim definicijama funkcijama. Izvorni kod 8.9: Primjer anonimne funkcije u ugnježdenoj definiciji 1 2

def poruka(ime): return lambda poruka: ime + ’: ’ + poruka

3 4 5 6

p = poruka(’Mario’) print p(’Bok!’) print p(’Kako ste?’) Mario: Bok! Mario: Kako ste?

8.7

rekurzivne funkcije

Do sada smo se ve´c susreli sa petljama i naˇcinom kako funkcionira iterativni postupak kao sukcesivno pove´cavanje indeksa, tj. brojˇcanika koji sudjeluje u operaciji koja u konaˇcnici daje finalni rezultat. Primjer je suma uzastopnih brojeva od 1 do 100. 1 2 3

suma = 0 for index in range(1,101): suma = suma + index

4 5

print suma

Znaˇci suma se postepeno pove´cava dok se ne iscrpi lista, tj. sekvenca indeksa definirana pozivom na range naredbu. index = 1 suma = index = 2 suma = index = 3 suma = index = 4 suma =

0 + 1 1 + 2 3 + 3 6 + 4

i tako dalje dok index ne postane 100. Drugim rijeˇcima postepeno se na varijablu nadodaju brojevi. Takoder je mogu´ce zapisati isti postupak prema koracima kako je vršeno sumiranje suma = (0) index = 1 : suma = ((0) + 1) index = 2 : suma = (((0) + 1) + 2) index = 3 : suma = ((((0) + 1) + 2) + 3) itd.

Kada bi indeksirali parcijalne sume tada bi dobili slijede´ci izraz sumaindex = sumaindex−1 + index

8.7 rekurzivne funkcije

41

. Tako zapisani izraz daje naslutiti kako je slijede´ca suma zapisana kao suma iz prethodnog koraka na koju se nadodaje vrijednost index iz trenutnog koraka iterativne petlje. Ovakav zapis u biti je obrnuti zapis od prirodnog sukcesivnog pove´cavanja indeksa: suma(100) = suma(99) + 100, gdje je suma(99) = suma(98) + 99, gdje je suma(98) = suma(97) + 98, i tako dalje sve do . . . suma(1) = suma(0) + 1

Tipiˇcna rekurzivna funkcija vrši poziv sama na sebe. Primjer je funkcija rsuma : 1 2

def rsuma(x): return rsuma(x)

No, kao što vidite ova funkcija vra´ca poziv na samu sebe koja vra´ca poziv na samu sebe koja vra´ca poziv na samu sebe i tako u beskonaˇcnost. Ovako definirana rekurzivna funkcija nema kraja, a program ulazi u beskonaˇcnu petlju (eng. infinite loop). A gdje je greška? Kako bi sprijeˇcili ovakvo ponašanje potrebno je uvesti uvjet prekida. To je graniˇcna vrijednost nakon koje funkcija više ne´ce vratiti sebe ve´c neku vrijednost. Ako se sada vratimo na sumu brojeva onda bi rekurzivna funkcija sume trebala izgledati ovako: 1 2

Mogu´cnost zapisa funkcije u obliku koji poziva istu funkciju nazivamo rekurzija, a takvu funkciju rekurzivna funkcija.

def rsuma(n): return rsuma(n - 1) + n

No oznaka prekida je suma(0)=0, tj. kada u 100-tom pozivu funkcije rsuma bude primila za argument 0 potrebno je zaustaviti daljnje pozive rsuma funkcije. To c´ emo posti´ci testiranjem vrijednosti n 1 2 3 4 5

def rsuma(n): if n = 0: return 0 else: return rsuma(n - 1) + n

Na taj naˇcin omogu´cili smo oznaku kraja rekurzivnim pozivima funkcije. Slijedi nekoliko primjera: Primjer 1. Proraˇcun faktorijela broja n. Faktorijel broja n je jednak : n! = 1 ∗ 2 ∗ 3 ∗ 4 ∗ ... ∗ n Ima rekurzivni zapis n! = (n − 1)! ∗ n 1 2 3 4 5

def factoriel(n): if n = 0: return 1 else: return factoriel(n - 1) * n

Primjer 2. Potenciranje broja x eksponentom n. ¯ je iterativni proces koji može biti zapisan rekurzivno Potenciranje takoder na slijede´ci naˇcin xn = xn−1 ∗ x Primjerice kub je jednak umnošku broja i kvadrata broja, x3 = x2 ∗ x

Rekurzivni zapis unosi konciznost i eleganciju u programski kod.

42

funkcije

1 2 3 4 5

def potencija(x,n): if n = 0: return 1 else: return potencija(x, n - 1) * x

Primjer 3. Korisniˇcki unos i formiranje liste Unose se brojevi koji se dodaju na listu dok se ne unese ’0’. 1 2

def rloop(): x = int(raw_input(’Unesi broj ili 0 za kraj’))

3 4

if x: return [x]+rloop()

5 6 7

else: return []

Dok su prethodni primjeri ovisili o smanjivanju broja n do oznake kraja, u ovom primjeru funkcija se poziva tako da ažurira listu novim vrijednostima. Za zakljuˇcak, potrebno je napomenuti da je rekurzivnu funkciju mogu´ce napraviti za svaki poziv petlje, no da li je nužno sve petlje pretvoriti u rekurzivne funkcije To ostaje na procijeni programeru koji mora odvagnuti koliˇcinu elegancije, hijerarhije, strukturiranosti te preglednosti koda.

9

OBJEKTNO-ORIJENTIRANO PROGRAMIRANJE

9.1

objektno-orijentirano programiranje

Python je inicijalno zamišljen kao objektno orijentirani programski jezik. Pojam objekt je kljuˇc za razumijevanje objektno-orijentiranog pristupa programiranju. Objekt je kompozicija stanja (atributi, varijable) i ponašanja (metode, funkcije). Stanja jednog objekta cˇ ine njegovi atributi (npr. objekt automobil može imati atribute promjer kotaˇca, snaga motora, trenutni prijenosni omjer) koji su u programu utjelovljeni kao varijable koje poprimaju odre¯ ¯ dene vrijednosti (stanja). Ponašanje ili aktivnosti odredenog objekta utjelov¯ ljene su u programu u obliku funkcija koje izvršavaju odredene radnje važne za objekt ili korisnike koji koriste objekte (npr. metode koje može izvršiti automobil su koˇcenje, ubrzavanje, mijenjanje brzine, skretanje). Tako definirani objekti omogu´cuju proširenje postoje´ce funkcionalnosti programskog ˇ jezika i time programeru olakšavaju pisanje programa. Cesto ih se može susresti prilikom izrade aplikacija sa grafiˇckim suˇceljem ili bilo kojoj drugoj aplikaciji cˇ iji korisnici moraju stvarati objekte, mijenjati njihova stanja i koristiti metode kako bi definirali ponašanje ili uzrokovali neku aktivnost vezanu uz objekt. Najlakše c´ e biti to shvatiti na slijede´cem primjeru. Primjer: "Aplikacija za pisanje teksta" omogu´cava korisniku slijede´ce funkcionalnosti: ? izradu novog dokumenta - (u programskom kodu dokument je objekt) ? mijenjanje sadržaja dokumenta (sadržaj je jedan od atributa objekta) ? mijenjanje naziva dokumenta (sadržaj je jedan od atributa objekta) ? zapis sadržaja dokumenta u datoteku (Save, Save As funkcije kao metode objekta dokumenta) ? otvaranje dokumenta iz datoteke (Open funkcija kao metoda objekta dokumenta) ? lijevo, centralno, podjednako i desno poravnanje teksta u sadržaju (Funkcije Left,Center,Right,Justify kao metode objekta dokumenta) ? itd. Pored ovih stanja i ponašanja jednog dokumenta kao objekta lako biste ¯ mogli poznavaju´ci MS Word ili neku drugu aplikaciju za uredivanje i editiranje teksta osmisliti ili se sjetiti još neke od mnogih stanja i ponašanja koje MS Word posjeduje. ¯ mora omogu´citi i izradu ili uˇcitavanje neAplikacija poput ove takoder ¯ koliko objekata kako bismo mogli usporedivati ili kopirati njihov sadržaj ili recimo spojiti više dokumenata u jedan. Da bi to omogu´cila aplikacija mora posjedovati naˇcin kako da omogu´ci istovremenu pojavu više dokumenata. Što to znaˇci u programu toˇcno. Dokument je opisan kao objekt u programskom kodu. Više dokumenata time cˇ ini više objekta gdje svaki može imati sadržaj, naziv kao svoje atribute te metode Open ,Save, Left, itd. kao ponašanja koja aplikacija omogu´cuje pojedinom dokumentu tj. objektu.

43

44

objektno-orijentirano programiranje

¯ Time dolazimo do problema što svi izradeni dokumenti imaju varijable kao stanja i funkcije kao metode koje su jednake za sve dokumente/objekte. Kako bi aplikacija svim dokumentima omogu´cila tako nešto, mora u aplikaciji postojati zapis koji definira kako c´ e se ponašati svaki pojedini objekt dokumenta te koje c´ e funkcionalnosti svakom dokumentu aplikacija omogu´citi. Taj zapis u objektno-orijentiranim programskim jezicima nazivamo Klasom, a svaki poziv na izradu novog objekta instanciranje. Time je svaki objekt definiran kao jedna instanca klase. 9.2

klase

Klase predstavljaju definiciju svih atributa i metoda koje c´ e instance te klase poprimiti. Za definiranje klase, tj. opisa objekta, koristi se izraz class ime_klase():

nakon kojeg slijede definicije atributa i metoda. Izvorni kod 9.1: Definicija klase 1 2

#!/usr/bin/python # -*- coding: utf-8 -*-

3 4 5 6 7

class Dokument: """ Klasa Dokument omogucuje instanciranje objekata Dokument """ >>> d1 = Dokument() >>> d2 = Dokument() >>> d1 >>> d2 >>>

Prikazani izvorni kod i output iz Python konzole pokazuju naˇcin definicije klase te naˇcin instanciranja dva objekta d1 i d2. Printanjem u konzoli objekata d1 i d2 mogu´ce je vidjeti da su oba objekta instance te da je svaka zasebno referencirana u memoriji na drugo adresno mjesto. 9.3

atributi

Atributi omogu´cuju dodjeljivanje stanja objekata. Njihova definicija nalazi se unutar klase i vrijedi za sve objekte instancirane iz klase. Postoje dvije vrste atributa ? Klasni (globalni) atributi ? Objektni (lokalni) atributi 9.3.1

Globalni atributi

Atributi koji pripadaju svim objektima zovu se klasni atributi, i definiraju se odmah poslije definicije klase. To su globalne varijable koje vrijede za sve objekte instancirane iz te klase. Npr. Izvorni kod 9.2: Primjer definicije klasnih (globalnih) atributa

9.3 atributi

1 2

#!/usr/bin/python # -*- coding: utf-8 -*-

3 4 5 6 7

class Dokument: """ Klasa Dokument omogu´ cuje instanciranje objekata Dokument """

8 9 10

ime=’Dokument1’ sadrzaj=’Ovo je prva linija u dokumentu’

11 12 13

d1=Dokument() d2=Dokument() >>> d1.ime ’Dokument1’ >>> d2.ime ’Dokument1’ >>> Dokument.ime ’Dokument1’

Atribut ’ime’ je stoga dostupan svim objektima kao i samoj klasi Dokument. Potrebno je napomenuti da je mogu´ce do´ci do pogreške ako objekt nastoji mijenjati vrijednost klasnom atributu. Naime, takvim cˇ inom nije iz¯ mijenjena vrijednost klasnom atributu ve´c je izraden novi atribut istoga imena, a koji pripada objektu. >>> d2.ime ’Dokument1’ >>> d2.ime=’Doc’ >>> Dokument.ime ’Dokument1’

Svrha postojanja globalnih atributa je u tome da omogu´ce identifikaciju objekata instanciranih iz jedne klase. Slijede´ci primjeri primjene dati su na klasi Parkirališta: ? identifikacijski broj objekta (npr. Parking01,Parking02,...) ? lista objekata (npr. [obj1,obj2,obj3]) ? kumulativne sume (npr. ukupan broj automobila parkiranih na svim parkiralištima) 9.3.2

Objektni atributi

Objektni atributi cˇ ine atribute definirane u klasi unutar posebne metode koja se zove __init__. Ova metoda pripada u kategoriju ’magiˇ cnih metoda klase’ jer omogu´cuju napredne mogu´cnosti. Inicijalizacija je u drugim programskim jezicima prisutna pod nazivom konstruktor. Ona ima za cilj omogu´citi definiciju atributa koji c´ e poprimati stanja definirana prilikom stvaranja objekta. Npr. Izvorni kod 9.3: Primjer definicije objektnog atributa 1 2

#!/usr/bin/python # -*- coding: utf-8 -*-

3 4 5 6 7 8

class Dokument: """ Klasa Dokument omogu´ cuje instanciranje objekata Dokument """ def __init__(self):

45

46

objektno-orijentirano programiranje

self.ime=’’ self.sadrzaj=’’

9 10 11 12 13

d1=Dokument() d2=Dokument()

14 15 16

d1.ime=’Prica01’ d1.sadrzaj=’Bio jednom jedan val.’

17 18 19 20

d2.ime=’ListaSerija’ d2.sadrzaj=’Lud, zbunjen, normalan.\n’ d2.sadrzaj+=’Sila\n’

¯ prihvat argumenata predanih Klasi Metoda __init__omogu´cuje, takoder, prilikom formiranja objekta. To cˇ inimo tako da u argument listu metode __init__predamo vrijednosti koje želimo da pojedini atributi tog objekta poprime. Npr. Izvorni kod 9.4: Inicijalizacija objekta 1 2

#!/usr/bin/python # -*- coding: utf-8 -*-

3 4 5 6 7 8 9 10

class Dokument: """ Klasa Dokument omogu´ cuje instanciranje objekata Dokument """ def __init__(self,name=’Dokument’,content=’’): self.ime=name self.sadrzaj=content

11 12 13 14 15

d1=Dokument(’Esej’,’Prva recenica’) d2=Dokument(’Blog01’) d3=Dokument()

Do ovog koraka ve´c sve uvidjeli da se pozivi atributa unutar metode __init__vrše pomo´cu specifiˇcne rijeˇci self. No, to c´ emo obraditi u sljede´cem poglavlju Metode. 9.4

metode

Metode su funkcije koje koristimo da u klasi definiramo promjenu stanja atributa, izvršimo neke aktivnosti ili obavimo neke druge radnje vezane uz ¯ odredeni objekt. Svaka metoda mora biti definirana kao funkcija i posjedovati minimalno jedan argument, a to je self kao opis objekta za kojega se izvršava metoda. Slijede´ci primjer definira metodu Info koja omogu´cuje printanje naziva i sadržaja objekta koji ju je pozvao. Obratite pažnju na korišteni globalni atribut DokumentList kao listu objekata koja se puni prilikom inicijalizacije. Izvorni kod 9.5: Definicija metode 1 2

#!/usr/bin/python # -*- coding: utf-8 -*-

3 4 5 6 7

class Dokument: """ Klasa Dokument omogucuje instanciranje objekata Dokument """

8 9 10

DokumentList=[]

9.5 preopterecivanje

11 12 13 14

def __init__(self,name=’Dokument’,content=’’): self.ime=name self.sadrzaj=content Dokument.DokumentList.append(self)

15 16 17 18

def Info(self): print ’Ime dokumenta:’,self.ime print ’Sadrzaj:\n’,self.sadrzaj

19 20 21 22

d1=Dokument(’Esej’,’Prva recenica’) d2=Dokument(’Blog01’) d3=Dokument()

23 24 25 26

for d in Dokument.DokumentList: d.Info() print ’\n’

Self prvi put dobiva znaˇcaj kao prvi cˇ lan argument liste metode __init__(def __init__(self,arg1,arg2,...)). Unutar same metode svaki od atributa koji se koriste mora biti zapisan uz pomo´c ’self.’ prefiksa. Možemo to gledati na drugaˇciji naˇcin. Zamislite da je klasa modul koji ima svoje pod-funkcije (metode). Svaka od tih pod-funkcija ima mogu´cnost mijenjati atribute nekom objektu. To je ostvarivo samo ako pod-funkcija može pristupiti objektu i njegovim atributima. Upravo to cˇ inimo predaju´ci self metodi __init__. Predajemo objekt u obliku rijeˇci self, te nakon toga vrijednosti koje želimo dodijeliti atributima. No u stvarnosti Python dozvoljava pozivanje funkcija bez davanja sebe kao prvog cˇ lana argument liste. ¯ Na slijede´cem primjeru usporedujemo dva istovjetna poziva metode gdje je prva na naˇcin da objekt poziva metodu, a druga da Klasnoj metodi predamo objekt kao prvi cˇ lan argument liste te nakon njega sve ostale argumente. >>> d1.Info() Ime dokumenta: Esej Sadrzaj: Prva recenica >>> Dokument.Info(d1) Ime dokumenta: Esej Sadrzaj: Prva recenica

Znaˇci d1.Info() je isto što i Dokument.Info(d1). Prvi omogu´cava jednostavniji poziv metode dok drugi ukazuje naˇcin kako Python ustvari radi, tj. predaje metodi objekt koji u deklaraciji metode stoji kao self. 9.5

preopterecivanje

Jedna od osobina objektno-orjentiranog programiranja je mogu´cnost preoptere´civanja funkcija i operatora kako bi i objektima omogu´cili istu funkcionalnost kao i klasiˇcnim varijablama poput int, float, bool, string, list, itd. Takva osobina cˇ esto je i nužnost kako bi operatore mogli dovoditi u odre¯ dene odnose i operacije ili nad objektima izvršiti radnje poput printanja. ˇ Cesto se za evaluaciju ili grananje služimo operatorima usporedbe (>,>=,p2 p1>=p2 p1=’ ? __lt__ - Manje od - ’p2 p1>=p2 p1 other.a: if self.b > other.b: self.Area -= other.Area # oduzima površinu drugoga self.a -= other.a # oduzima dužinu drugoga self.b = float(self.Area)/self.a # izraˇ cunava novu širinu print ’Stolovi oduzeti!’ else: print ’Sirina b je duža kod drugog stola.’ else: print ’Duzina a je duza kod drugog stola.’ else: print ’Povrsina drugog je veca od prvog stola.’

43 44 45 46 47 48 49 50 51 52 53 54

t1=Table(10,20) t2=Table(20,40) print t1 print t2 t1-t2 t2-t1 t1+t2 t1.Rotate() t1-t2 print t1 print t2

9.6 nasljeðivanje

Table = 10.0 x 20.0 Area = 200.00 Table = 20.0 x 40.0 Area = 800.00 Povrsina drugog je veca od prvog stola. Stolovi oduzeti! Stolovi spojeni! Stol zarotiran! Sirina b je duza kod drugog stola. Table = 40.0 x 20.0 Area = 800.00 Table = 10.0 x 60.0 Area = 600.00

Postoji još mnogo specijalnih metoda, ali njihovo izuˇcavanje prepuštamo vama da ih istražite ako smatrate potrebnim. 9.6

nasljeðivanje

Objekti koje je mogu´ce susresti u stvarnom životu najˇceš´ce su kategorizirani u neke grupacije ili klastere, ili su dio neke hijerarhijske strukture. Rijetko ˇ da je neki objekt jedinstven u svoj svojoj unutrašnjosti. Covjek jede, životinja jede, a i biljke jedu tj. izvršavaju jednu od svojih najvažnijih funkcija. Bicikl je kopneno vozilo, kao i automobil, dok je avion ili balon na vru´ci zrak zraˇcno vozilo, a podmornica ili brod pomorsko vozilo. Sva ova prometala su vozila. Na taj naˇcin slijedi hijerarhija koja definira pripadnost pojedinih objekata. Postoje i rekurzivne hijerarhijske veze poput obiteljskih stabala ili svake strukture koja za svoj rezultat ima potomstvo novih objekata. ¯ Nasljedivanje je u pravilu proces kojim od viših hijerarhijskih razina ili grupacija poprimamo neke osobine ili funkcije. ¯ Objektno-orjentirano programiranje omogu´cuje naslijedivanje atributa i ¯ metoda iz nadredenih klasa. Deklaracija klase koja posjeduje nadklasu data je u slijede´coj liniji koda: class Sudoku(Igra):

¯ Klasa Sudoku naslijeduje metode od svoje nadklase Igra koja se cˇ esto zove i bazna (osnovna) klasa. Kao što je Igra nadklasa klasi Sudoku tako je Sudoku klasi Igra podklasa. U slijede´cem primjeru dana je nadklasa Road koja inicijalizira naziv ceste name i duljinu ceste length te definira sadržaj metode Info() koja služi za ispis vrijednosti atributa svakog instanciranog objekta bilo podklase Highway, MainRoad, LoaclRoad ili osnovne nadklase Road. ¯ Naslijedivanje ima još jednu prednost koja se oˇcituje u sistematizaciji izvornog koda. Kada ne bi imali nadklasu, svaka od podklasa trebala bi sama inicijalizirati svoje atribute kao i definirati svoju funkciju Info(). Na taj naˇcin izvorni kod bi bio predugaˇcak, nejasan i neˇcitljiv. ¯ Izvorni kod 9.9: Naslijedivanje 1 2

# -*- coding: utf-8 -*"""

51

52

objektno-orijentirano programiranje

3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18

Created on Sat Jun 1 20:07:45 2013 """ class Road: def __init__(self,name,length): self.name=name self.length=length def Info(self): print "Road definition" print "Ime:\t %15s" % self.name print "Length:\t %15s" % self.length class Highway(Road): pass # Bez lokalnih definicija class MainRoad(Road): pass # Bez lokalnih definicija class LocalRoad(Road): pass # Bez lokalnih definicija

19 20 21 22 23 24 25

h1=Highway(’A1’,1000) m1=MainRoad(’E54’,540) l1=LocalRoad(’S16’,125) h1.Info() m1.Info() l1.Info() Road definition Ime: Length: Road definition Ime: Length: Road definition Ime: Length:

A1 1000 E54 540 S16 125

U situaciji kada pojedina podklasa ipak zahtjeva prilikom inicijalizacije definirati neki vlastiti atribut tada definicija __init__unutar podklase predefinira (override) __init__metodu nadklase. U tom sluˇcaju je potrebno pozvati inicijalizacijsku metodu nadklase unutar inicijalizacijske metode podklase. ¯ Izvorni kod 9.10: Naslijedivanje override __init__metode 1 2 3 4 5 6 7 8

# -*- coding: utf-8 -*""" Created on Sat Jun 1 20:07:45 2013 """ class Road: def __init__(self,name,length): self.name=name self.length=length

9 10 11 12 13

def Info(self): print "Road definition" print "Ime:\t %15s" % self.name print "Length:\t %15s" % self.length

14 15 16 17 18 19 20 21 22 23 24 25 26

class Highway(Road): def __init__(self,name,length): # override __init__ nadklase Road.__init__(self,name,length) # invokacija __init__ metode nadklase self.type=’highway’ self.toll=50 # Kn/100km class MainRoad(Road): def __init__(self,name,length): # override __init__ nadklase Road.__init__(self,name,length) # invokacija __init__ metode nadklase self.type=’mainroad’ class LocalRoad(Road): def __init__(self,name,length): # override __init__ nadklase Road.__init__(self,name,length) # invokacija __init__ metode nadklase

9.6 nasljeðivanje

self.type=’localroad’

27 28 29 30 31

h1=Highway(’A1’,1000) m1=MainRoad(’E54’,540) l1=LocalRoad(’S16’,125)

32 33

print h1.toll 50

¯ ¯ Pored jednostavnih naslijedivanja mogu´ca su i višestruka naslijedivanja iz više nadklasa i definiraju se na slijede´ci naˇcin: class Smartphone(Mobile_device,Computer):

53

10

O B L I K O VA N J E S T R I N G O VA

10.1

oblikovanje sa operatorom %

¯ String objekti imaju ugradeni operator (%) koji omogu´cava ubacivanje vrijednosti unutar stringa na posebno oznaˇcena mjesta. Mjesta na koja treba ¯ ubaciti odredenu vrijednost u stringu oznaˇcavaju se znakom % i posebnim oznakama koje detaljnije definiraju formatiranje ubaˇcene vrijednosti. Nakon stringa i operatora % (Nije isto što i oznaka u samom stringu) u tupleu ili dictionaryju se zadaju vrijenosti ili varijable koje treba umetnuti u string. Izraz koji definira format ubaˇcene vrijednosti sastoji se od: ? znak % koji oznaˇcava poˇcetak izraza za definiranje formata, ? kljuˇc mapiranja (neobavezno) koji definira ime (kljuˇc) vrijednosti koja se ubacuje u string, ? konverzijske opcije (neobavezno), ? minimalni broj rezerviranih znakova (neobavezno), ? preciznost (neobavezno), oznaˇcava broj decimalnih mjesta koje se prikazuju i piše se nakon znaka .. ? tip konverzije. Ako se koristi kljuˇc mapiranja onda vrijednosti treba zadati u dictionaryju dok se inaˇce zadaju u tupleu. Konverzijske opcije se definiraju pomo´cu znakova opisanih u tablici 10.1. Simbol

Opis

’0’

Prazne znakove popunjuje sa nulama

’-’

Poravnanje u lijevo

’ ’

Nezauzete znakove popunjuje razmacima

’+’

Uvijek postavlja predznak (+ ili -) Tablica 10.1: Opcije konverzije

Pomo´cu operatora % u string je mogu´ce ubaciti razne numeriˇcke (i string) formate koji se definiraju pomo´cu simobla danih u tablici 10.2. Primjer u izvornom kodu 10.1 prikazuje ubacivanje i formatiranje decimalnog i cijelog broja u string. Primjer obuhva´ca primjenu tupleova bez kljuˇca mapiranja te na istom primjeru primjenu dictionaryja sa kljuˇcevima mapiranja. Izvorni kod 10.1: Primjer formatiranja numeriˇckih podataka sa tupleom i dictionaryjem >>> >>> a = >>> >>> a = >>> >>> a =

s = ’a = print s 12.37, b s = ’a = print s 12.37, b s = ’a = print s 12.37, a

%.2f, b = %d’ % (12.365, 18) = 18 %(a).2f, b = %(b)d’ % {’a’: 12.365, ’b’: 18} = 18 %(a).2f, a = %(a)+.1f’ % {’a’: 12.365} = +12.4

55

Upotrebom kljuˇceva mapiranja zadavanje argumenata u dictionaryju ne mora biti u istom redosljedu kao i pozicije ubacivanja u samom stringu. Na ovaj se naˇcin argumenti mogu upotrijebiti više puta, bez potrebe da ih se višestruko puta zapisuje unutar dictionaryja.

56

oblikovanje stringova

Simbol

Tip

’d’

Cijeli broj

’o’

Oktalni broj

’x’

Heksadecimalni broj

’e’

Decimalni broj u eksponencijanom obliku

’f’

Decimalni broj

’c’

Tekstualni znak

’s’

String

’%’

Nema konverzije argumenta, rezultat sadrži znak ’%’ Tablica 10.2: Definiranje tipova podataka

Razliˇcite primjene konverzijskih opcija prikazane su u izvornom kodu 10.2. Izvorni kod 10.2: Primjer formatiranja numeriˇckih podataka sa tupleom i dictionaryjem >>> x = >>> x = >>> x = >>> x = >>> x = >>> x = >>> x = >>> x =

print ’x = [%5.2f, %5.2f]’ % (11.14, 7.88) [11.14, 7.88] print ’x = [%f, %f]’ % (11.14, 7.88) [11.140000, 7.880000] print ’x = [%10f, %10f]’ % (11.14, 7.88) [ 11.140000, 7.880000] print ’x = [%010f, %010f]’ % (11.14, 7.88) [011.140000, 007.880000] print ’x = [%+10f, %+10f]’ % (11.14, 7.88) [+11.140000, +7.880000] print ’x = [%-+10f, %-+10f]’ % (11.14, 7.88) [+11.140000, +7.880000 ] print ’x = [%-+10.2f, %-+10.2f]’ % (11.14, 7.88) [+11.14 , +7.88 ] print ’x = [%+10.2f, %+10.2f]’ % (11.14, 7.88) [ +11.14, +7.88]

Izvorni kod 10.3: Primjer formatiranja numeriˇckih podataka za ispis u stupcima 1

from math import sqrt, sin

2 3

l = range(1, 11)

4 5 6 7 8

for i in range(len(l)): s = ’%03d %4.1f %6.1f %5.2f %+6.3f’ % \ (i+1, l[i], l[i]**2.0, sqrt(l[i]), sin(l[i])) print s 001 1.0 002 2.0 003 3.0 004 4.0 005 5.0 006 6.0 007 7.0 008 8.0 009 9.0 010 10.0

1.0 4.0 9.0 16.0 25.0 36.0 49.0 64.0 81.0 100.0

1.00 1.41 1.73 2.00 2.24 2.45 2.65 2.83 3.00 3.16

+0.841 +0.909 +0.141 -0.757 -0.959 -0.279 +0.657 +0.989 +0.412 -0.544

10.2 oblikovanje sa metodom format

10.2

oblikovanje sa metodom format

Svi string objekti sadže metodu format koja omogu´cuje napredno formatiranje i kontrolu stringova.

57

11

R A D S A D AT O T E K A M A

11.1

otvaranje i zatvaranje datoteka

Osnovna manipulacija sa sadržajem datoteka u Pythonu je omogu´cena korištenjem file objekta. ¯ Python ima ugradenu funkciju open za otvaranje postoje´cih ili stvaranje novih datoteka na disku. Funkcija open vra´ca file objekt, koji sadrži metode i atribute za pristup i manipulaciju informacija i sadržaja otvorene datoteke. Sintaksa otvaranja datoteka je: f = open(ime\_datoteke, vrsta\_pristupa, buffering)

gdje je ime_datoteke sting koji sadrži relativnu ili apsolutnu putanju datoteke, vrsta_pristupa je string koji sadrži mod pristupa, buffering je ¯ integer koji oznaˇcava veliˇcinu medupohrane. Argumenti vrsta_pristupa i buffering nisu obavezni. f je novonastali file objekt kreiran pozivom funkcije open. Mod pristupa se definira kao string koji sadrži znakove: ? ’r’, ’w’ ili ’a’ kojima se definira da li c´ e se vršiti cˇ itanje (read), pisanje (write) ili dodavanje (append) ? ’b’ oznaˇcava binarni oblik datoteke. Ako nije specificiran onda je oblik datoteke takstualni (’t’). ? ’+’ omogu´cuje istodobno cˇ itanje i pisanje (ili dodavanje) datoteke. Nakon obavljanja željenih manipulacija, koje su objašnjene u narednim poglavljima, datoteku je potrebno zatvoriti. Za zatvaranje datoteke koristi se close metoda koju ima svaki file objekt: f.close()

Nakon zatvaranja nisu mogu´ce nikakve operacije na datoteci. 11.2

pisanje u datoteke

Za zapisivanje informacija u datoteku koriste se metode write i writelines klase file. write metoda prima string varijablu koju zapisuje u prethodno otvorenu datoteku u modu za pisanje (’w’) ili dodavanje (’a’). Ovu naredbu može se ponavljati kako bi se dodalo još teksta u datoteku. f.write(tekst)

Izvorni kod 11.1: Primjer kreiranja tekstualne datoteke 1 2

#!/usr/bin/python # -*- coding: utf-8 -*-

3 4

datoteka = open(’info.txt’, ’w’)

5 6 7 8

datoteka.write(’Tehniˇ cki fakultet’) datoteka.write(’, Rijeka’) datoteka.write(’\nVukovarska 58’)

9 10

datoteka.close()

59

Poˇcetna pozicija unutar datoteke razlikuje se ovisno o opciji ’r’, ’w’ (poˇcetak datoteke) ili ’a’ (kraj datoteke).

60

rad sa datotekama

Tehniˇ cki fakultet, Rijeka Vukovarska 58

Iako njeno ime na to upu´cuje, writelines ne zapisuje svaki element liste u novi redak!

Funkcija writelines zapisuje listu stringova u datoteku. Postignuti efekt je isti kao da se pozove write za svaki element liste. f.writelines(lista_stringova) l = [’malo’, ’ ’, ’teksta’] f.writelines(l) # isto što i for s in l: f.write(s)

11.3

ˇ citanje iz datoteka

Za cˇ itanje datoteke potrebno je željenu datoteku otvoriti u modu za cˇ itanje ¯ (’r’). Osnovni naˇcin za proˇcitati sadržaj odredene datoteke je preko funkcija: ? read koja vra´ca sadržaj datoteke (od trenutne pozicije) željene veliˇcine u obliku stringa, ? readline koja vra´ca sadržaj trenutne linije u obliku stringa, ? readlines koja vra´ca listu stringova koji predstavljaju pojedine linije datoteke Sintaks metode read je: f.read(size)

Kod cˇ itanja datoteka vrlo cˇ esto je bitna trenutna pozicija u samoj datoteci što je objašnjeno u poglavlju 11.4

gdje je size veliˇcina sadržaja koji treba proˇcitati. Za binarnu datoteku size oznaˇcava broj bitova a za tekstualnu broj znakova. Ukoliko je size negativan ili nije zadan, cˇ ita se cijeli sadržaj datoteke. f.readline(size)

Metoda readline cˇ ita jednu liniju u datoteci i to od trenutne pozicije do kraja lnije (do znaka ’ n’). Argument size definira maksimalnu veliˇcinu proˇcitanih podataka. Za prazne lnije metoda vra´ca string koji sadrži znak za novu liniju ’ n’. Kad je trenutna pozicija na kraju datoteke, metoda vra´ca prazan string. f.readlines(size)

readlines vra´ca sadržaj datoteke kao listu linija. size ima jednak uˇcinak

kao i na dvije prethodno objašnjene metode. Za potrebe primjera, zadana je datoteka test.txt sljede´ceg sadržaja: 123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ 3. linija 4. linija zadnja!

U izvornom kodu 11.2 dani su primjeri upotrebe navedenih funkcija za cˇ itanje sadržaja datoteke.

11.4 pozicioniranje u datoteci

ˇ Izvorni kod 11.2: Citanje sadržaja tekstualne datoteke 1 2 3 4 5 6

data = open(’test.txt’, ’r’) print data.read(5) print data.readline() print data.readline(6) print data.readlines() data.close() 12345 6789 ABCDEF [’GHIJKLMNOPQRSTUVWXYZ\n’, ’3. linija\n’, ’4. linija\n’, ’zadnja!’]

Osim pomo´cu navedenih funkcija, postoji još jedan naˇcin pristupanju linijama neke tekstualne datotetke, a to je iteriraju´ci kroz file objekt kao što je prikazano u izvornom kodu 11.3. Izvorni kod 11.3: Pristupanje sadržaju datoteke preko iteriranja po file objektu 1 2 3 4 5 6

data = open(’test.txt’, ’r’) s = ’’ for line in data: s += line print s data.close() 123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ 3. linija 4. linija zadnja!

11.4

pozicioniranje u datoteci

Trenutnu poziciju u datoteci može se saznati preko metode tell: f.tell()

Metoda tell daje broj bitova (znakova) trenutne pozicije od poˇcetka datoteke (Izvorni kod 11.4). seek momogu´cuje micanje trenutne pozicije u datoteci. Sintaksa metode je: f.seek(offset, from)

offset je broj koim definiramo pomak pozicije. Pozitivan je u naprijed a negativan u nazad. Argumentom from se definira od kuda c´ e se pomak

raˇcunati (0 za poˇcetak datoteke, 1 za trenutni položaj i 2 za kraj datoteke). Izvorni kod 11.4: Dohva´canje trenutne pozicije u datoteci 1 2 3 4 5 6 7 8 9 10 11

data = open(’test.txt’, ’r’) print data.readline() print ’pozicija:’,data.tell() print data.read(3) print ’pozicija:’,data.tell() data.seek(6,1) print data.read(3) data.seek(-3,1) print data.read(5) data.seek(0,0) print data.read(5)

61

62

rad sa datotekama

12 13 14

data.seek(-5,2) print data.read(5) data.close() 123456789 pozicija: 10 ABC pozicija: 13 JKL JKLMN 12345 dnja!

11.5

preimenovanje, kopiranje i brisanje datoteka

http://docs.python.org/2/library/shutil.html

Izvorni kod 11.5: Kopiranje, micanje i preimenovanje datoteka 1 2 3

# simply import os os.rename(’a.txt’,’b.kml’)

4 5 6 7

# or import shutil shutil.move(’a.txt’, ’b.kml’)

8 9 10 11 12

# or if you want to copy.. import shutil shutil.copy(’a.txt’, ’b.kml’)

11.6

1 2 3 4 5 6

arhiviranje

from shutil import make_archive import os archive_name = os.path.expanduser(os.path.join(’~’, ’myarchive’)) root_dir = os.path.expanduser(os.path.join(’~’, ’.ssh’)) make_archive(archive_name, ’gztar’, root_dir) ’/Users/tarek/myarchive.tar.gz’

12

P Y T H O N S TA N D A R D L I B R A R Y

http://docs.python.org/2/library/index.html

12.1

informacije o platformi i operacijskom sustavu

http://www.pythonforbeginners.com/systems-programming/how-to-use-the-platform-module-in-python/

12.2

ˇ matemati cke funkcije

Python modul math sadrži standardne matematiˇcke funkcije za realne brojeve koje su definirane C standrdom, s kojima se najˇceš´ce susre´cemo prilikom pisanja nekog programa. Funkcija

Opis

math.fabs(x)

Funkcija vra´ca apsolutnu vrijednost realnog broja x.

math.fsum(niz)

Funkcija vra´ca sumu elemenata nekog niza brojeva.

math.isnan(x)

Funkcija vra´ca True ako je x tipa NaN.

math.exp(x)

Exponencijalna funkcija ex .

math.log(x, b)

Funkcija logb (x) odnosno ln(x) ako se ne zada b.

math.cos(x)

Funkcija vra´ca kosinus kuta x zadanog u radijanima.

math.acos(x)

Inverz funkcije kosinus.

math.e

Matematiˇcka konstanta e=2.718281828459045... Tablica 12.1: Opis nekih funkcija math modula

Primjer upotrebe nekih funkcija math modula: 1 2 3 4

#!/usr/bin/python from math import log,e,fsum print log(e) print fsum([1,2,3]) 1. 6.

Python modul cmath sadrži standardne matematiˇcke funkcija nad poljem kompleksnih brojeva. Argumenti funkcija mogu biti tipa float ili complex. Funkcija

Opis

cmath.polar(x)Funkcija vra´ca polranu (r,φ) reprezentaciju kompleksnog broja x. cmath.sqrt(x) Funkcija vra´ca korijen kompleksnog broja Tablica 12.2: Opis nekih funkcija cmath modula

Primjer upotrebe nekih funkcija cmath modula: 1 2

from cmath import sqrt sqrt(1.+2.j) (1.272019649514069+0.7861513777574233j)

63

64

python standard library

Python modul decimal omogu´cuje raˇcunanje i pravilno zaokruživanje realnih brojeva u aritmetici s proizvoljnim brojem decimalnih mjesta. Primjer upotrebe nekih funkcija math modula: 1 2 3 4 5 6

#!/usr/bin/python from decimal import * getcontext().prec = 6 print Decimal(1) / Decimal(3) getcontext().prec =30 print Decimal(1) / Decimal(3) 0.333333 0.333333333333333333333333333333

12.3

datum i vrijeme

http://www.tutorialspoint.com/python/python_date_time.htm

12.4

vrijeme izvršavanja

¯ Uˇcinkovitost odredenog algoritma, djela izvornog koda ili pak cijelog izvornog koda vrlo je bitan faktor ukupne kvalitete raˇcunalnog programa. Uˇcin¯ kovitost odredenog izvornog koda se, prije svega, može mjeriti vremenom ¯ izvodenja tog koda. ¯ Treba imati na umu da vrijeme izvodenja ovisi o hardverskim resursima raˇcunala pa su stoga rezultati razliˇciti ovisn o raˇcunalu na kojem se testiranje vrši. Vrijeme izvršavanja ovisi i o trenutnom optere´cenju hardverskih resursa (operativni sustav, sistemski servisi i pokrenute aplikacije), pa c´ e, u manjoj mjeri, testiranja na istom raˇcunalu biti razliˇcita. ¯ Vrlo elegantan naˇcin za mjerenje vremena izvršavanja odredenog djela koda je upotrebom funkcija clock i time iz modula time. time funkcija daje trenutno vrijeme u sekundama od 00:00 1. sijeˇcnja 1970. godine. Funkcija clock je preciznija i primjerenija mjerenju vremena izvršavanja, ali razliˇcito funkcionira na Linux (Unix) i MS Windows platformama:

time.clock() ili time.time() se

? na Linux platofrmi, time.clock() daje utrošeno procesorsko vrijeme, tj. koliko je sekundi procesor bio optere´cen,

mogu pozivati više puta te na taj naˇcin mjeriti vrijeme izvršavanja više djelova izvornog koda.

? na MS Windows platformi, time.clock() daje “ukupno” utrošeno vrijeme koje obuhva´ca vrijeme raˇcunanja (procesor) ali i utrošeno vrijeme na cˇ itanje datoteka (disk) ili npr. utoršeno vrijeme na uspostavljanje konekcije preko nekog mrežnog protokola. Kod mjerenja izvršavanja koda koji radi sa cˇ itanje ili pisanjem datoteka ili koji vrši komunikaciju preko mrežnih protokola, rezultati c´ e biti ovisni i o platformi na kojoj se kod izvršava. Izvorni kod 12.1: Primjer mjerenja vremena izvršavanje algoritma 1 2

#!/usr/bin/python # -*- coding: utf-8 -*-

3 4

import time

5 6 7 8

# dohvati vrijeme poˇ cetka start_c = time.clock() start_t = time.time()

12.4 vrijeme izvršavanja

9 10

print ’Start clock: %.5f’ % start_c print ’Start time: %.5f’ % start_t

11 12 13 14 15 16 17

# Algoritam a = 0.0 for i in range(1000): for j in range(i): a = a + (i - j)**0.3

18 19 20 21 22 23

# dohvati vrijeme završetka stop_c = time.clock() stop_t = time.time() print ’Stop clock: %.5f’ % stop_c print ’Stop time: %.5f’ % stop_t

24 25 26 27

print ’Rezultat: %.2f’ % a print ’Vrijeme izvrsavanja (clock): %.3f ms’ % (stop_c - start_c) print ’Vrijeme izvrsavanja (time): %.3f ms’ % (stop_t - start_t) Start clock: 0.01000 Start time: 1373797428.12780 Stop clock: 0.12000 Stop time: 1373797428.23620 Rezultat: 2656321.74 Vrijeme izvrsavanja (clock): 0.110 ms Vrijeme izvrsavanja (time): 0.109 ms

Python Standard Library sadrži klasu Timer koja omogu´cuje mjerenje vremena izvršavanja Python izraza. ¯ Izvorni kod 12.2: Primjer upotrebe Timer klase za mjerenje vremena izvodenja funkcije 1 2

#!/usr/bin/python # -*- coding: utf-8 -*-

3 4 5

import timeit from math import sqrt

6 7 8 9 10 11

# Algoritam def f(x): s = 0.0 for i in range(x): s = s * sqrt(s+x)

12 13

t = timeit.Timer(stmt=’f(500)’, setup=’from __main__ import f’)

14 15 16

r1 = t.timeit(number=1000) print ’Potrebno vrijeme za 1000 poziva funkcije f(500): %.5f’ % r1

17 18 19 20 21

r5 = t.repeat(number=1000, repeat=5) print ’\nPonavljanje testa (5 puta):’ for r in r5: print ’Potrebno vrijeme za 1000 poziva funkcije f(500): %.5f’ % r Potrebno vrijeme za 1000 poziva funkcije f(500): 0.05833 Ponavljanje testa (5 puta): Potrebno vrijeme za 1000 poziva Potrebno vrijeme za 1000 poziva Potrebno vrijeme za 1000 poziva Potrebno vrijeme za 1000 poziva Potrebno vrijeme za 1000 poziva

funkcije funkcije funkcije funkcije funkcije

f(500): f(500): f(500): f(500): f(500):

0.05900 0.05927 0.05888 0.05953 0.05925

65

13

GREŠKE U PYTHON KODU

13.1

tipovi grešaka

¯ Ve´cina programskih jezika posjeduje odredene usluge prema korisniku koje omogu´cuju identificiranje i manipulaciju grešaka u pisanom izvornom kodu te davaju korisna objašnjenja vezana uz izvor greške ili naˇcin kako ih ukloniti. Python slijedi takvu logiku i omogu´cuje prijavljivanje dva tipa grešaka: ? Sintaksne greške Syntax Error i ? Iznimke (eng. Exceptions) ¯ ¯ Obje greške utvrduju se iskljuˇcivo tijekom izvodenja tj. interpretiranja ¯ koda: sintaksne greške na poˇcetku izvodenja koda, a iznimke za svaki iz¯ vršeni red koda. Nakon što Python identificira prvu grešku na koju naide program stane sa izvršavanjem i objavi poruku slijede´ceg izgleda >>> print c Traceback (most recent call last): File "", line 1, in NameError: name ’c’ is not defined

¯ Traceback obavještava korisnika o tome gdje je greška pronadena i daje opis greške pomo´cu sintaksne greške ili iznimke (eng. exception) koja objašnjava razlog prekida izvršavanja programa. U navedenom primjeru NameError je iznimka koja opisuje grešku pri pozivu imena ’c’. ¯ Sintaksne greške testiraju svaku liniju koda netom prije izvodenja cijelog ¯ programa i utvrduju svaku nepravilnost u sintaksi programskog jezika. Npr. 1

j=1

2 3 4 5 6 7

if j 10 * (1/0) Traceback (most recent call last): File "", line 1, in ? ZeroDivisionError: integer division or modulo by zero

? NameError pokušaj operacije sa varijablom cˇ ije ime (name) nije u popisu imena (namespace) >>> 4 + i*3 Traceback (most recent call last): File "", line 1, in ? NameError: name ’i’ is not defined

? TypeError Pokušaj izvršavanja operacije na krivom tipu podataka >>> ’2’ + 2 Traceback (most recent call last): File "", line 1, in ? TypeError: cannot concatenate ’str’ and ’int’ objects

Postoji još mnogo iznimaka te ih je mogu´ce prona´ci na http://docs.python.org/ . No, iznimkama možemo manipulirati, tj. mogu´ce je ugraditi u kod identifikaciju greške te djelovanje sukladno tome. O tome više u slijede´cem poglavlju. 2/library/exceptions.html#bltin-exceptions

13.2

manipulacija greškama - exception handling

Iznimkama možemo manipulirati, tj. možemo prihvatiti informaciju o greški te djelovati u skladu sa njom ili granati kod tako da nastavi sa izvršavanjem unatoˇc greški. Razmotrimo primjer kada korisnik unosi brojeve na konzoli pomo´cu raw_input naredbe. 1 2 3

var=raw_input(’Unesi broj:’) a=int(var) print a

Python vra´ca iznimku ValueError jer nije u stanju pretvoriti preuzeti string u cjelobrojnu vrijednost.

13.3 ispravljanje grešaka - debugging

Unesi broj:z Traceback (most recent call last): File "/home/flood/untitled0.py", line 9, in a=int(var) ValueError: invalid literal for int() with base 10: ’z’

Kako bi izbjegli takvu grešku i prihvatili iznimku poslužiti c´ emo se sa try - except formulacijom: 1

var = raw_input(’Unesi broj:’)

2 3 4 5 6 7 8 9

try: a = int(var) print ’SUCCESS’ except ValueError: print ’Nije unešen broj!’ print ’Broj postavljen na defaultnu vrijednost 0.’ a = 0

10 11

print a

U ovom kodu izvršen je prihvat iznimke na naˇcin da je: ? unešena kljuˇcna rijeˇc try cˇ ije se tijelo prvo izvršava ¯ na iznimku tada program preskaˇce dio tijela ? ako program ne naide koji pripada except sekciji i nastavlja sa kodom (’print a’). ¯ na iznimku u try sekciji koda tada se zaustavlja na ? ako program naide mjestu gdje je našao grešku, ne nastavlja dalje sa preostalim djelom koda (’print SUCCESS’) ve´c skaˇce na except sekciju koja odgovara iznimki koju je uhvatio (u ovom sluˇcaju ValueError) te potom nastavlja sa kodom (’print a’) ¯ na vrstu iznimke opisanu u except sekciji ? ukoliko program ne naide tada izbaci grešku u obliku neuhva´cene iznimke (eng. unhandled exception) Pored ovog osnovnog koncepta primjene prihvata iznimaka, mogu´ce je podi´ci iznimku prema korisniˇckoj želji te izraditi korisniˇcki definirane iznimke. Ove funkcionalnosti nadilaze osnove i cˇ itatelj je slobodan potražiti više informacija na http://docs.python.org/2/tutorial/errors.html. 13.3

ispravljanje grešaka - debugging

Python ima modul pdb („Python DeBugger") koji pomaže kod otkrivanja i ispravljanja grešaka u kodu skripte. Ako ne koristite neki specijalizirani editor unutar nekog razvojnog okruženja tada je potrebno pozvati pdb modul na poˇcetku skripte: 1

import pdb

Na nekom kljuˇcnom mjestu u kodu na kojem se želite zaustaviti morate staviti naredbu: 1

pdb.set_trace()

na primjeru 13.1 može se vidjeti upotreba pdb modula. Ako koristite editor Spyder tada nije nužno pozvati pdb modul. Dovoljno je postaviti prekide u kodu dvostrukim lijevim klikom na lijevoj strani dokumenta i pokrenuti skriptu u Debug naˇcinu rada. (Pdb)

69

70

greške u python kodu

Unutar pdb modula mogu´ce je kontrolirati izvršavanje koda, a najˇceš´ce se koriste naredbe: ? n (next) izvršava se sljede´ca naredba u skripti, ? c (continue) izvrešava se ostatak skripte do sljede´ceg prekida, ? s (step into) pdb ulazi u podprogram ili funkciju, ? r (return) sliˇcno kao naredba c, ali pdb izvršava ostatak podprograma ili funkcije do izlaza iz podprograma, ? p var (print) pdb istpis stanja varijable var ? ENTER pdb izvršava zadnju naredbu koja mu je poslana, ? q (quit) zaustavlja izvršavanje skripte. Izvorni kod 13.1: Upotreba dbg modula 1 2

#!/usr/bin/python import pdb

3 4 5 6 7 8 9 10 11 12

pdb.set_trace() a=0 b=1 c=2 pdb.set_trace() a=b+c pdb.set_trace() a=b-c print ’kraj’

Dio II N U M P Y P O L J A I M AT R I C E

14

Z A D AVA N J E P O L J A U N U M P Y- U

Bazni objekt u NumPy-u, ndarray, je homogeno multidimenzionalno polje. Homogenost polja podrazumijeva da su svi podaci u polju istog tipa. U NumPy-u, dimenzije se nazivaju axes a broj dimenzija rank. Elementi polja su indeksirani pozitivnim cijelim brojevima. NumPy polja se mogu zadavati na više naˇcina. Baziˇcno, zadavanje polja se može podjeliti na ruˇcni unos pomo´cu naredbe array te na automatsko generiranje polja. NumPy polja mogu se automatski generirati pomo´cu neke od naredbi za generiranje polja. 14.1

array

Naredba array omogu´cava kreiranje NumPy polja iz obiˇcnih Python listi ili tuple-ova. Prilikom kreiranja polja pomo´cu array naredbe, u argument funkcije upisuju se elementi matrice i to na naˇcin da svaka dimnezija zapoˇcinje otvornemo uglatom zagradom ([) i završava zatvorenom uglatom zagradom (]) dok su elementi razdvojeni zarezom. Najjednostavnija sintaksa naredbe array je: array(object)

Ako je argument naredbe array tuple, onda pojedina dimenzija zapoˇcinje i završava sa zagradama. Pri tome treba paziti da je argumnet naredbe array samo jedan tuple (cijeli tuple mora biti u jednim zagradama). Mogu´ce je kombinirati Python liste i tuple-ove prilikom zadavanja matrice. >>> from numpy import * >>> M1 = array([[1, 2, 3],[4, 5, 6]]) >>> M1 array([[1, 2, 3], [4, 5, 6]]) >>> M2 = array( ( (6,7,8), (9,10,11) ) ) >>> M2 array([[ 6, 7, 8], [ 9, 10, 11]]) >>> M3 = array( ( [6,7,8], (9,10,11) ) ) >>> M3 array([[ 6, 7, 8], [ 9, 10, 11]])

Dodatni, neobavezni argumenti naredbe array su: dtype - željeni tip podataka za elemente polja. Ako argument nije zadan, elementi polja c´ e preuzeti minimalni tip potreban za pohranu podataka iz objekta object. Ovaj argument se može koristiti samo za ’pove´cati’ (eng. upcast) tip zadanog objekta. Za ’smanjiti’ (eng. downcast) tip koristiti .astype(t) naredbu. ¯ copy - bool varijabla (True ili False) koja odreduje da li se objekt kopira. ¯ order - odreduje naˇcin na koji se polje pohranjuje u memoriji. Polje može biti pohranjeno na tri naˇcina: ? ’C’ - elementi polja c´ e biti poredani u memoriji na naˇcin da zadnji indeks varira najbrže (C-povezani poredak) ? ’F’ - elementi polja c´ e biti poredani u memoriji na naˇcin da prvi indeks varira najbrže (Fortran-povezani poredak)

73

74

zadavanje polja u numpy-u

? ’A’ - elementi polja ne´ce imati definiran poredak u memoriji (C-povezani poredak, Fortran-povezani poredak ili cˇ ak nepovezani poredak) subok : bool, optional If True, then sub-classes will be passed-through, otherwise the returned array will be forced to be a base-class array (default). ndmin - minimalni broj dimenzija generiranog polja. Prema potrebi, broj dimenzija c´ e biti pove´can na naˇcina da c´ e jedinice biti dodane u shape polja.

14.2

arange

Naredba arange omogu´cuje kreiranje jednodimenzionalnog polja koje sadrži aritmetiˇcki niz definiran sa prvim cˇ lanom, zadnjim cˇ lanom te korakom. Sintaksa naredbe je arange(start, stop, step, type)

Oprez! Prilikom korištenja ne-cjelobrojnih koraka niza rezultat naredbe array može biti nekonzistentan. U takvim sluˇcajevima bolje je koristiti naredbu linspace (14.3).

gdje je start poˇcetak niza, stop kraj niza, step korak niza a type je tip podataka sadržanih u nizu. Svi argumennti naredbe arange osim stop su neobavezni i ukoliko nisu uneseni imaju zadane vrijednosti: ? start ima zadanu vrijednost 0 ? step ima zadanu vrijednost 1 te zahtijeva i zadavanje argumenta start ? type ako nije zadan, postavlja se tipa na temelju ostalih argumenata. >>> M1 = arange(10, 30, 3) >>> M1 array([10, 13, 16, 19, 22, 25, 28]) >>> M2 = arange(-2, 3) >>> M2 array([-2, -1, 0, 1, 2]) >>> M3 = arange(5) >>> M3 array([0, 1, 2, 3, 4])

14.3

linspace

Naredba linspace ima sliˇcnu namjenu kao i naredba arange (kreiranje aritmetiˇckog niza) samo što se umjesto koraka niza zadaje broj cˇ lanova niza. I sintaksa naredbe je vrlo sliˇcna naredbi arange: linspace(start, stop, num=50, endpoint=True, retstep=False)

gdje je start poˇcetak niza, stop kraj niza, num broj elemenata niza, endpoint je opcija ukljuˇcivanja zadnjeg elementa a retstep je opcija vra´canja korištenog koraka niza. >>> M1=linspace(0,10,21) >>> M1 array([ 0. , 0.5, 1. , 1.5, 2. , 2.5, 3. , 3.5, 4. , 4.5, 5. , 5.5, 6. , 6.5, 7. , 7.5, 8. , 8.5, 9. , 9.5, 10. ]) >>> M2 = linspace(0, 5, 10, endpoint=False) >>> M2 array([ 0. , 0.5, 1. , 1.5, 2. , 2.5, 3. , 3.5, 4. , 4.5]) >>> M3, step = linspace(0, 1, retstep=True) >>> M3 array([ 0. , 0.02040816, 0.04081633, 0.06122449, 0.08163265, 0.10204082, 0.12244898, 0.14285714, 0.16326531, 0.18367347, 0.20408163, 0.2244898 , 0.24489796, 0.26530612, 0.28571429,

14.4 zeros

0.30612245, 0.40816327, 0.51020408, 0.6122449 , 0.71428571, 0.81632653, 0.91836735, >>> step 0.02040816326530612

14.4

0.32653061, 0.42857143, 0.53061224, 0.63265306, 0.73469388, 0.83673469, 0.93877551,

0.34693878, 0.44897959, 0.55102041, 0.65306122, 0.75510204, 0.85714286, 0.95918367,

0.36734694, 0.46938776, 0.57142857, 0.67346939, 0.7755102 , 0.87755102, 0.97959184,

75

0.3877551 , 0.48979592, 0.59183673, 0.69387755, 0.79591837, 0.89795918, 1. ])

zeros

Naredba zeros omogu´cava generiranje polja koje sadrži nule. Osnovna sintaksa naredbe zeros je zeros(shape)

gdje je shape lista koja sadrži veliˇcine dimenzija. Osim veliˇcine dimnezija, postoje i dodatni neobavezni argumenti za definiranje tipa podataka te naˇcina spremanja polja u memoriju: zeros(shape, dtype=float, order=’C’)

Za generiranje polja nula može poslužiti i naredba zeros_like koja generira polje nula istih dimenzija kao neko postoje´ce polje. Sintaksa naredbe je: zeros_like(a)

gdje je a matrica cˇ ije dimenzije treba preuzeti. >>> from numpy import * >>> a = zeros([3, 5]) >>> print a [[ 0. 0. 0. 0. 0.] [ 0. 0. 0. 0. 0.] [ 0. 0. 0. 0. 0.]] >>> b = array([2, 5, 6, 0]) >>> print b [2 5 6 0] >>> c = zeros_like(b) >>> print c [0 0 0 0]

14.5

Naredba zeros_like ima

dodatne argumente dtype i order. dtype omogu´cuje nametanje tipa podataka za generirano polje, a ako nije specificiran onda generirano polje ¯ nasljeduje tip podataka od argumenta a. order omogu´cuje mijenjanje rasporeda spremanja polja u memoriju.

ones

Za generiranje matrice zadanih dimenzija koja sadrži jedinice koristi se naredba ones. Sintaksa naredbe je vrlo ista kao i kod naredbe zeros: ones(shape, dtype=float, order=’C’)

Za kreiranje matrice, koja sadrži jedinice istih dimenzija kao neka postoje´ca matrice, koristi se ones_like naredba: ones_like(a)

gdje je a matrica cˇ ije dimenzije treba preuzeti. >>> from numpy import * >>> a = ones([2,4]) >>> print a [[ 1. 1. 1. 1.] [ 1. 1. 1. 1.]] >>> b = ones([3, 2],dtype=int) >>> print b

Naredba ones_like ima dodatne argumente dtype i order koji funkcioniraju jednako kao što je opisano za naredbu zeros_like.

76

zadavanje polja u numpy-u

[[1 1] [1 1] [1 1]] >>> c = array([5, 8]) >>> d = ones_like(c) >>> print d [1 1]

14.6

eye

Generiranje dvodimenzionalne jediniˇcne matrice (sadrži jedinice na dijagonali a ostalo su nule) mogu´ce je sa naredbom eye. Potpuna sintaksa naredbe eye je:

Naredba eye omogu´cuje generiranje iskljuˇcivo dvodimenzionalnih jediniˇcnih matrica.

eye(N, M=None, k=0, dtype=)

gdje je N broj redaka generiranog polja, M broj stupaca generiranog polja (ako nije zadano, broj stupaca je jednak broju redaka), k indeks dijagonale (0 je glavna dijagonala, pozitivna vrijednost se odnosi na dijagonale iznad a negativna na dijagonale ispod glavne dijagonale) dok je dtype tip podataka generiranog polja. >>> from numpy import * >>> a = eye(4) >>> print a [[ 1. 0. 0. 0.] [ 0. 1. 0. 0.] [ 0. 0. 1. 0.] [ 0. 0. 0. 1.]] >>> b = eye(5, 3) >>> print b [[ 1. 0. 0.] [ 0. 1. 0.] [ 0. 0. 1.] [ 0. 0. 0.] [ 0. 0. 0.]] >>> c = eye(3, 5, 1) >>> print c [[ 0. 1. 0. 0. 0.] [ 0. 0. 1. 0. 0.] [ 0. 0. 0. 1. 0.]]

14.7

diag

ˇ Cesto su brojevi na dijagonali matrice važni u proraˇcunu i javlja se potreba da ih se spremi u zasebnu varijablu. Naredba diag omogu´cuje upravo to: generira vektor koji sadrži elemenate dijagonale zadane matrice. Sintaksa naredbe je vrlo jednostavna. Funkcija diag obavezno prima, kao argument, matricu iz koje se želi preuzeti dijagonala. Dodatni argument, k, specificira položaj (indeks) dijagonale: 0 je glavna dijagonala, pozitivna vrijednost se odnosi na dijagonale iznad a negativna na dijagonale ispod glavne dijagonale. diag(v, k=0)

Izvorni kod 14.1: Spremanje elemenata dijagonale matrice u vektor 1 2 3 4

from M1 = v1 = v2 =

numpy import * array([[1, 2, 3],[4, 5, 6],[7, 8, 9]]) diag(M1) diag(M1,1)

14.8 meshgrid

5 6 7 8

print M1 print v1 print v2 user@machine:~> python diag01.py [[1 2 3] [4 5 6] [7 8 9]] [1 5 9] [2 6]

14.8

meshgrid

Naredba meshgrid služi za generiranje matrice koordinata na temelju vektora koordinata. >>> import numpy as np >>> x = np.linspace(0, 5, 6) >>> y = np.linspace(10, 50, 5) >>> X, Y = np.meshgrid(x, y) >>> print x [ 0. 1. 2. 3. 4. 5.] >>> print y [ 10. 20. 30. 40. 50.] >>> print X [[ 0. 1. 2. 3. 4. 5.] [ 0. 1. 2. 3. 4. 5.] [ 0. 1. 2. 3. 4. 5.] [ 0. 1. 2. 3. 4. 5.] [ 0. 1. 2. 3. 4. 5.]] >>> print Y [[ 10. 10. 10. 10. 10. 10.] [ 20. 20. 20. 20. 20. 20.] [ 30. 30. 30. 30. 30. 30.] [ 40. 40. 40. 40. 40. 40.] [ 50. 50. 50. 50. 50. 50.]]

meshgrid je vrlo korisna kod evaluacije funkcija na mreži toˇcaka: >>> import numpy >>> x = numpy.linspace(0, 3, 4) >>> y = numpy.linspace(0, 5, 6) >>> xx, yy = numpy.meshgrid(x, y, sparse=True) >>> z = numpy.cos(xx + yy**2) - numpy.sin(xx**2 - yy) >>> z array([[ 1. , -0.30116868, 0.34065566, -1.40211098], [ 1.38177329, -0.41614684, -1.1311125 , -1.64300187], [ 0.25565381, 1.12513317, 0.05087286, 0.09691566], [-0.77001025, 0.0702259 , -0.83704529, 1.12326946], [-1.71446198, -0.13404333, 0.66031671, 1.94762889], [ 0.03227854, -0.10988317, 0.54933218, -0.20580337]])

77

15

INFORMACIJE O POLJU I INDEKSIRANJE

15.1

informacije o polju

Svako NumPy polje ima definiran broj dimenzija, koji se lako može provjeriti pomo´cu ndim atributa polja. ndarray.ndim

ili pomo´cu naredbe ndim ndim(ndarray)

gdje je ndarray numpy polje. ¯ broj elemenata polja. Za svaku dimenziju, polje ima rezerviran odreden Broj elemenata po dimenzijma polja cˇ ini niz koji se može dobiti preko atributa shape ndarray.shape

ili preko naredbe shape shape(ndarray)

gdje je ndarray numpy polje. ¯ Ukupan broj elemenata u polju se odreduje naredbom size size(ndarray)

ili atributom numpy polja ndarray.size

gdje je ndarray numpy polje. Izvorni kod 15.1: Osnovne informacije o NumPy polju 1

from numpy import *

2 3

M1 = array([[1, 2, 3], [4, 5, 6]])

4 5 6 7 8 9 10

print print print print print print

M1.ndim ndim(M1) M1.shape shape(M1) M1.size size(M1)

2 2 (2, 3) (2, 3) 6 6

15.2

indeksiranje polja

Pristupanje elementima Numpy polja vrši se pomo´cu indeksa na sliˇcan nacˇ in kao i sa listama. Indeks oznaˇcuje poziciju elementa polja i to pomo´cu cijelog broja poˇcevši od nule. Kod jednodimenzionalnih polja (vektori), vrijednostima se pristupa preko jednog indeksa upisanog u uglate zagrade.

79

80

informacije o polju i indeksiranje

Svaki sljede´ci element vektora ima indeks za jedan ve´ci od prethodnog, što znaˇci da je indeks zadnjeg elementa jednak ukupnom broju elemenata vektora umanjenom za jedan. Svaki indeks koji je jedank ili ve´ci broju elemenata vektora je indeks nepostoje´ceg elementa vektora i korištenje tog indeksa c´ e prouzroˇciti grešku. >>> import numpy as np >>> V = np.array([6.0, 2.2, 3.0, 5.8, 5.4, 0.8]) >>> n = np.size(V) >>> print n 6 >>> indeksi = range(n) >>> print indeksi [0, 1, 2, 3, 4, 5] >>> for i in indeksi: ... print V[i] ... 6.0 2.2 3.0 5.8 5.4 0.8 >>> print V[6] Traceback (most recent call last): File "", line 1, in IndexError: index out of bounds

Indeksi u jednom paru uglatih zagrada (npr. M[2,4]) su zapravo tuple, pa se pristupanju ¯ odredenom elementa može vršiti i preko tuplea indeksa (poz = (3, 1); print M[poz]).

Indeksiranje višedimenzionalnih polja je analogno jednodimenzionalnim poljima, za svaku dimenziju se koristi po jedan indeks. Elementima polja se može pristupati sa indeksima svake dimenzije upisanim u uglate zagrade ili sa indeksima upisanim u jedne uglate zagrade a razmaknutim sa zarezima. Izvorni kod 15.2: Manipulacije sa poljima pomo´cu indeksa 1

# -*- coding: utf-8 -*-

2 3

import numpy as np

4 5 6 7 8 9

M = np.array([[ 1, 2, 3, 4, [ 6, 7, 8, 9, [11, 12, 13, 14, [16, 17, 18, 19, [21, 22, 23, 24,

5], 10], 15], 20], 25]])

10 11 12 13

print M[2, 4] poz = (3, 2) print M[poz]

# ispiši element na poziciji 2,4 # definiraj poziciju 3,2 # ispiši element na poziciji poz

print M[1:-1,1:-1] print M[:,::-1] print M[::2]

# ispiši dio polja bez prvih i zadnjih redaka i stupaca # ispiši polje sa obrnutim redoslijedom stupaca # Ispiši svaki drugi redak polja

14 15 16 17

15 18 [[ 7 [12 [17 [[ 5 [10 [15 [20 [25 [[ 1 [11 [21

8 13 18 4 9 14 19 24 2 12 22

9] 14] 19]] 3 2 8 7 13 12 18 17 23 22 3 4 13 14 23 24

1] 6] 11] 16] 21]] 5] 15] 25]]

16

MANIPULACIJE SA NUMPY POLJIMA

16.1

manipulacije sa dimenzijama polja

¯ Elementi NumPy polja odredenih dimenzija, mogu se presložiti u NumPy polje drukˇcijih dimenzija. Preslagivanje polja na druge dimenzije vrši se pomo´cu naredbe reshape: reshape(a, newshape, order=’C’)

gdje je a izvorno polje, newshape vektor novih dimenzija a order je naˇcin spremanja polja u matricu. Uvijet za reshape je da broj elemenata polja ostane isti tj. umnožak veliˇcina dimenzija mora biti konstantan. Specifiˇcni sluˇcaj mijenjanja dimenzija polja je kada inicijalno polje želimo transformirati u jednodimenzionalno polje tj. vektor. Iako je to mogu´ce napraviti sa naredbom reshape, postoji specijelizirana naredba ravel za transformaciju n-dimnezionalnih polja u jednodimenzionalna polja. Sintaksa naredba je vrlo sliˇcna kao i za reshape osim što nije potrebno specificirati vektor veliˇcina dimenzija jer je rezultat uvijek jednodimenzionalno polje. ravel(a, order=’C’)

Za pretvorbu matrice u vektor koristi se i naredba flatten. Razlika je što je ovo funkcija ndarray objekta i uvijek kreira kopiju polja. flatten(order=’C’)

Izvorni kod 16.1: Mijenjanje dimenzija polja 1

from numpy import *

2 3 4

M1 = arange(0, 20) print M1

5 6 7 8 9

M2 = reshape(M1, [4, 5]) print M2 M3 = reshape(M2, [2, -1]) print M3

10 11 12

print ravel(M2) print M3.flatten() [ 0 [[ 0 [ 5 [10 [15 [[ 0 [10 [ 0 [ 0

1 1 6 11 16 1 11 1 1

2 2 7 12 17 2 12 2 2

3 3 8 13 18 3 13 3 3

4 5 4] 9] 14] 19]] 4 5 14 15 4 5 4 5

6

7

8

9 10 11 12 13 14 15 16 17 18 19]

6 7 8 9] 16 17 18 19]] 6 7 8 9 10 11 12 13 14 15 16 17 18 19] 6 7 8 9 10 11 12 13 14 15 16 17 18 19]

Brisanje jediniˇcnih dimenzija matrice, koje vrlo cˇ esto znaju biti suvišne, može se napraviti funkcijom squeeze. Izvorni kod 16.2: Mijenjanje dimenzija polja 1

from numpy import *

81

Ukoliko se, kod poziva naredbe reshape, veliˇcina jedna od dimenzija ne specificira, tada se ona automatski raˇcuna na temelju ostalih veliˇcina dimenzija i ukupnog broja elemenata inicijalne matrice.

82

manipulacije sa numpy poljima

2 3

M1 = arange(0, 20)

4 5 6

M2 = reshape(M1, [4, 1, 1, 5]) print M2.shape

7 8 9

M3 = squeeze(M2) print M3.shape (4, 1, 1, 5) (4, 5)

16.2

transponiranje

Transponiranje matrica mogu´ce je izvesti na dva naˇcina: ? funkcijom transpose ? atributom T Izvorni kod 16.3: Transponiranje matrica 1

from numpy import *

2 3 4 5 6 7

M1 = array([ [1, 0, 3, 4], [2, 2, 7 ,8], [6, 8, 3, 0], [9, 8, 2, 1]])

8 9 10

M2 = M1.T print M2

11 12 13

M3 = transpose(M1) print M3 [[1 [0 [3 [4 [[1 [0 [3 [4

2 2 7 8 2 2 7 8

16.3

6 8 3 0 6 8 3 0

9] 8] 2] 1]] 9] 8] 2] 1]]

dodavanje i brisanje elemenata polja

17

ˇ I TAVA N J E I S P R E M A N J E N U M P Y P O L J A UC

Vrlo se cˇ esto dešava da se rezultati raznih proraˇcuna ili mjerenja spremaju u tekstualne datoteke. Takve datoteke, svaka zapisana u svom formatu cˇ esto se uˇcitavaju u Python za daljnju obradu, vizualizaciju ili provjeru. Numpy pruža gotove funkcije za automatizirano uˇcitavanja tabliˇcnih podataka u NumPy polja. Jednako bitno je i mogu´cnost spremanja podataka iz NumPy polja u tekstualne datoteke. Osim tekstualnih datoteka, uˇcitavanje i spremanje NumPy polja mogu´ce je i sa binarnim datotekama. 17.1

ˇ u citavanje iz tekstualnih datoteka

Uˇcitavanje numeriˇckih vrijednosti iz tekstualnih datoteka u numpy polja vrši se sa naredbom loadtxt. Podrazumijeva se da su brojevi u tekstualnoj datoteci zapisani u retcima koji svi imaju jednak broj zapisanih vrijednosti. ¯ Arumenti naredbe loadtxt omogu´cuju detaljnije odredivanje uˇcitavanja tek¯ stualne datoteke pomo´cu razdvojnika, komentara, odredivanja pasivnih pocˇ etnih redaka te odabir stupaca za uˇcitavanje i dr. Sintaksa naredbe sa najˇceš´ce korištenim argumentima je: loadtxt(fname, comments, delimiter, skiprows, usecols)

gdje je fname ime datoteke iz koje se uˇcitavaju podaci, comments je simbol kojim zapoˇcinju pasivni retci (komentari), delimiter je simbol(i) kojim su razdvojene vrijednosti u retcima, skiprows je broj poˇcetnih redaka koji se preskaˇcu prilikom uˇcitavanja a usecols je lista indeksa stupaca koji se uˇcitavaju. Izvorni kod 17.1: Sadržaj datoteke data.txt 1 2

Tehniˇ cki fakultet Zavod za mehaniku fluida i raˇ cunarko inženjerstvo

3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18

1 2 3 4 5

8.14 28.72 8.37 26.79 4.41 26.55 6.74 22.48 5.30 24.30 * ovo je komentar 6 6.11 22.14 7 2.10 25.96 7.40 24.40 *8 9 0.07 22.04 10 8.45 23.07 11 2.91 22.07 12 9.14 20.70 13 7.62 23.83

-0.12 -0.47 -0.44 -0.55 -0.70

126.04 130.96 125.82 133.24 137.91

5 9 2 0 9

-0.87 -0.90 -0.03 -0.73 -0.47 -0.07 -0.10 -0.51

102.43 137.88 122.03 143.81 137.48 116.26 132.36 111.39

7 2 1 2 0 6 9 1

Izvorni kod 17.2: Uˇcitavanje iz tekstualne datoteke 1

# -*- coding: utf-8 -*-

2 3

from numpy import *

83

Zadana vrijednost argumenta delimiter je None što znaˇci da se redak dijeli na temelju razmaka (podrazumijeva i tabulatore) i više uzastopnih razmaka smatra kao jedan razmak.

ˇ u citavanje i spremanje numpy polja

84

4 5 6

M = loadtxt(’data.txt’, skiprows=4, comments=’*’, usecols=(1, 3, 5)) print M [[ [ [ [ [ [ [ [ [ [ [ [

8.14 8.37 4.41 6.74 5.3 6.11 2.1 0.07 8.45 2.91 9.14 7.62

-0.12 -0.47 -0.44 -0.55 -0.7 -0.87 -0.9 -0.73 -0.47 -0.07 -0.1 -0.51

5. 9. 2. 0. 9. 7. 2. 2. 0. 6. 9. 1.

] ] ] ] ] ] ] ] ] ] ] ]]

Naprednije mogu´cnosti pri uˇcitavanju NumPy polja iz tekstualnih datoteka pruža naredba genfromtxt. http://penandpants.com/2012/03/09/reading-text-tables-with-python/

17.2

spremanje u tekstualne datoteke

Naredba savetxt omogu´cuje jednostavno spremanje NumPy polja u tekstualne datoteke. savetxt(fname, X, fmt, delimiter, newline, header, footer, comments)

18

ˇ NI RAC ˇ UN M AT R I C

18.1

rješavanje sustava linearnih jednadžbi

Za rješavanje sustava linearnih jednadžbi A·x = b

(18.1)

koristi se NumPy naredba solve: solve(a, b)

gdje je a matrica sustava a b vektor slobodnih cˇ lanova. Izvorni kod 18.1: Rješavanje sustava linearnih jednadžbi 1

from numpy import *

2 3 4 5 6 7 8

A = array([ [ 1.0, 3.0, 6.0], [-2.0, 0.0, 3.0], [ 8.0, -2.0, 0.0] ]) b = array([2.0, 6.0, 0.0])

9 10

x = linalg.solve(A, b)

11 12

print x [-0.58823529 -2.35294118

1.60784314]

85

Dio III PRIPREMA, OBRADA I VIZUALIZACIJA P O D ATA K A

19

OSNOVNI 2D GRAFOVI

Terminologija: ? Figure = prozor ? Axes = prostor crtanja ? Axis = osi

Prozor Prostor crtanja

Prostor crtanja

Os y

Os y

Os x

Os x

Slika 19.1: Matplotlib elementi

19.1

linijski grafovi

Osnovna naredba u matplotlibu je plot i služi za crtanje grafova pomo´cu linija ili toˇcaka. Osnovna sintaksa naredbe je plot(y) plot(x, y)

gdje su x i y vektori koordinata toˇcaka koje želimo vizualizirati. U sluˇcaju da vektor x koordinata nije zadan, koristi se uniformni vektor [0, 1, 2, ..., n] gdje je n broj cˇ lanova vektora y. U sluˇcaju da su zadani i vektor x i vektor y, tada oni moraju imati isti broj cˇ lanova. Više uzastopnih plot naredbi c´ e nacrtati više linija na istom grafu. Naredba plot ne prikazuje graf, graf se iscrtava na ekranu pozivom funkcije show. Izvorni kod 19.1 kreira dva linijska grafa koriste´ci naredbu plot a potom, naredbom show, graf prikaže na ekranu (Slika 19.2) Izvorni kod 19.1: Jednostavan graf 1 2

from pylab import * from numpy import *

3 4

plot([3, 6, 3, 2, 4])

5

89

90

osnovni 2d grafovi

6 7 8

x = linspace(0, 4, 100) y = 5*cos(x)/(1 + x**2) plot(x, y)

9 10

show()

¯ Slika 19.2: Prozor sa grafom napravljen izvodenjem izvrnog koda 19.1

Dodatni argument naredbe plot omogu´cuje definiranje izgleda linije i markera pomo´cu znakova. Znakovi za definiranje vrste linije, boje linije te ¯ vrste markera kombiniraju se u stringu koji se prosljeduje funkciji plot. Simboli za definiranje vrste linije, boje linije i vrste markera prikazani su u tablicama 19.1, 19.2 i 19.3. Simboli se mogu kombinirati u proizvoljnom redoslijedu. Ako je izostavljen simbol za boju, primjenjuje se zadana vrijednost boje. Markeri se ne prikazuju izostavljanjem simobla za vrstu markera. Izostavljanjem simbola za vrstu linije, ako je zadana vrsta markera linija se ne prikazuje a puna linija se iscrtava u sluˇcaju da vrsta markera nije zadana. Simbol

Vrsta linije

’-’

Puna linija

’-’

Crtkana linija

’-.’

Crta-toˇcka

’:’

Toˇckasta linija Tablica 19.1: Vrste linija

19.1 linijski grafovi

Simbol

Boja

’b’

Plava

’r’

Crvena

’g’

Zelena

’c’

Cijan

’m’

Magenta

’y’

Žuta

’k’

Crna

’w’

Bijela Tablica 19.2: Simboli boja

Detaljnije i fleksibilnije definiranje boja opisano je u poglavlju (19.2.1). Simbol

Vrsta markera

’.’

Toˇckasti

’,’

Piksel

’o’

Kružni

’v’

Trokutasti prema dolje

’ˆ’

Trokutasti prema gore

’’

Trokutasti prema desno

’s’

Kvadratni

’p’

Peterokutni

’*’

Zvijezdasti

’h’

Šesterokutni 1

’H’

Šesterokutni 2

’+’

Plus

’x’

Križi´c

’D’

Romb

’d’

Tanki romb

’|’

Vertikalna linija

’_’

Horizontalna linija Tablica 19.3: Vrste markera

U izvornom kodu 19.2 upotrebljene su razliˇcite varijante linija, markera i boja (Slika 19.3). Izvorni kod 19.2: Kontrola linija i markera 1 2

from pylab import * from numpy import *

3 4 5 6 7

plot([1, plot([3, plot([2, plot([5,

8 9

show()

6, 2, 3, 4,

3, 1, 5, 2,

2, 3, 6, 4,

4], ’r--o’) 1], ’g-.D’) 2],’r-.x’) 5],’ks:’)

91

92

osnovni 2d grafovi

6 5 4 3 2 10.0

0.5

1.0

1.5

2.0

2.5

3.0

3.5

4.0

¯ Slika 19.3: Graf napravljen izvodenjem izvornog koda 19.2

19.2

naprednija kontrola linijskih grafova

Bolju kontrolu izgleda linijskih grafova u matplotlibu mogu´ce je ostvariti sa dodatnim parametrima naredbe plot. 19.2.1

Boje

Argumentom color (ili skra´ceno c) mogu´ce je preciznije definirati boju linije: plot(x, plot(x, plot(x, plot(x,

y, y, y, y,

color color color color

= = = =

gray_string) hex_string) rgb_tuple) html_string)

gdje je ? gray_string string koji specificira nijansu sive boje kao udio bijele (npr. color = ’0.72’) ? hex_string string koji specificira heksidecimalni zapis RGB boje (npr. color = ’#FF8C00’) ? rgb_tuple tuple kojim se specificiraju udjeli crvene, zelemne i plave (RGB) boje (npr. color = (0.1, 0.5, 0.3)) ? html_string string koji sadrži HTML naziv boje (npr. color=’Cyan’, color=’Crimson’) 19.2.2

Markeri

Izgled markera se može detaljnije specificirati pomo´cu više parametara naredbe plot:

19.2 naprednija kontrola linijskih grafova

? marker za definiranje vrste tj. oblika markera, ? markersize ili ms za definiranje veliˇcine markera, ? markeredgecolor ili mec za definiranje boje ruba markera, ? markeredgewidth ili mew za definiranje debljine ruba markera, ? markerfacecolor ili mfc za definiranje boje lica markera ? markerfacecoloralt ili mfcalt za definiranje izmjenjuju´ce boje lica markera, ? markerevery za definiranje koliko toˇcaka c´ e biti prikazane (npr. svaka peta). 1 2 3 4 5 6

plot(x, y, markeredgecolor = ’r’, markeredgewidth = 2, markerfacecolor = ’b’, markerfacecoloralt = ’g’, markersize = 4, markerevery = 5)

# # # # # #

Boja ruba markera - crvena Debljina ruba Boja lica - plava Izmjenjuju´ ca boja lica - zelena Velicina markera Crtaj svaki peti marker

Argumentom label omogu´cuje se oznaka tj. opis krivulje, koji se prikazuje u legendi grafa. U izvornom kodu 19.3 upotrebljene su razliˇcite varijante linija, markera i boja (Slika 19.4). Izvorni kod 19.3: Naprednija kontrola linija i markera 1 2

from pylab import * from numpy import *

3 4 5 6 7 8 9 10 11

X = np.linspace(-np.pi, np.pi, 256,endpoint=True) C,S = np.cos(X), np.sin(X) X2=[-3, -2, -0.5, 1.2, 2.8] Y2=[0.3, 0.9, 0.5, 0.1, 0.62] plot(X, C, color="blue", linewidth=2.5, linestyle="-") plot(X, S, color="red", linewidth=2.5, linestyle="-") plot(X2, Y2, color="green", linestyle="-", marker="o", markersize=10) show()

93

94

osnovni 2d grafovi

1.0

0.5

0.0

0.5

1.0 4

3

2

1

0

1

2

3

4

¯ Slika 19.4: Graf napravljen izvodenjem izvornog koda 19.3

19.3 Stvaranje prvog prozora nije nužno. Naredbe za crtanje grafova (npr. plot) same c´ e kreirati prozora ako ve´c ne postoji.

svojstva prozora, prostora crtanja i osi

Novi prozor se stvara pomo´cu funkcije figure, koja vra´ca handle na prozor a po potrebi može primati dodatne argumente figure() fig1 = figure() fig1 = figure(figsize = (12, 10), dpi = 300)

Dva argumenta koji se najˇceš´ce koriste su figsize i dpi. figsize prima tuple koji specificira širinu i visinu prozora u inˇcima a pomo´cu argumenta dpi (dots per inch) regulira se rezolucija koja je posebno bitna kod spremanja grafova u raster format ili pri spremanju animacija u video format. Naredbama xlabel i ylabel mogu´ce je dodati naslove osi. Sintaksa obje naredbe je identiˇcna: xlabel(’Opis x osi’) ylabel(’Opis y osi’)

¯ Naredbama xlim i ylim odreduju se granice intervala koji se prikazuje na prostoru crtanja. Sintaksa naredbe je: xlim( (xmin, xmax) ) xlim( xmin, xmax )

Dodaju li se izvornom kodu 19.3 sljede´ce linije, 1 2

xlim(X.min()*1.1, X.max()*1.1) ylim(C.min()*1.1, C.max()*1.1)

mogu´ce je dobiti sljede´ci rezultat:

19.3 svojstva prozora, prostora crtanja i osi

1.0

0.5

0.0

0.5

1.0 3

2

1

0

1

2

3

Slika 19.5: Izmijenjene granice grafa

1 2 3

xlim(0, 5) # Donja i gornja granica ylim(ymax=1) # Samo gornja granica ylim(ymin=-1) # Samo donja granica

Mogu´ce je promijeniti i ticks. U sluˇcaju da je potrebno i izvornom kodu 19.3 prikazati vrijednosti od x os od −π do π s korakom od π/2 i y os od -1 od 1 s korakom od 1, potrebno je dodati sljede´ce linije: 1 2

xticks( [-np.pi, -np.pi/2, 0, np.pi/2, np.pi]) yticks([-1, 0, +1])

Rezultat je prikazan na sljede´coj slici.

95

96

osnovni 2d grafovi

1

0

1 3.142

1.571

0.000

1.571

3.142

Slika 19.6: Custom ticks

Još je potrebno promijeniti oznake na osima: 1 2 3 4

xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi], [r’$-\pi$’, r’$-\pi/2$’, r’$0$’, r’$+\pi/2$’, r’$+\pi$’]) yticks([-1, 0, +1], [r’$-1$’, r’$0$’, r’$+1$’])

što rezultira sljede´cim grafom:

+1

0

−1

−π

−π/2

0

Slika 19.7: Custom ticks

U nekim situacijama je korisno pomaknuti osi:

+ π/2



19.3 svojstva prozora, prostora crtanja i osi

1 2 3 4 5 6 7

ax = gca() ax.spines[’right’].set_color(’none’) ax.spines[’top’].set_color(’none’) ax.xaxis.set_ticks_position(’bottom’) ax.spines[’bottom’].set_position((’data’,0)) ax.yaxis.set_ticks_position(’left’) ax.spines[’left’].set_position((’data’,0))

+1

−π

−π/2

0

0

+ π/2



−1

Slika 19.8: Spines

Oznake na osima su prekrivene linijama s(Slika 19.8) te ih je potrebno uˇciniti cˇ itljivijima: 1 2 3

for label in ax.get_xticklabels() + ax.get_yticklabels(): label.set_fontsize(16) label.set_bbox(dict(facecolor=’white’, edgecolor=’None’, alpha=0.65))

97

98

osnovni 2d grafovi

+1

−π

−π/2

00

+ π/2



−1

Slika 19.9: Formatiranje oznaka na osima

Ukljuˇcivanje i iskljuˇcivanje mreže pomo´cnih linija na prostoru crtanja vrši se naredbom grid. grid(b=None, which=’major’, axis=’both’, **kwargs)

b je argument kojim se kontrolira da li se iskljuˇcuje ili ukljuˇcuje mreža pomo´cnih linija i može poprimiti vrijednosti true ili false ali i ’on’ ili ’off’ (kao i MATLAB). which može biti ’major’, ’minor’ ili ’both’ i služi za kontrolu glavne ili sporedne mreže pomo´cnih linija. Argumentom axis kontorilra se za koje c´ e osi biti postavljena mreža pomo´cnih linija. Vrijednosti za axis mogu biti ’both’, ’x’ ili ’y’. grid može primati dodatne argumente za detaljniju kontrolu mreže pomo´cnih linija: 1

grid(color=’k’, linestyle=’:’, linewidth=0.2)

Dodavanje naslova na prostor crtanja vrši se naredbom title: title(’Text naslova’)

Prikazivanje legende na na prostoru crtanja vrši se pomo´cu naredbe legend uz prethodno definirane opise krivulja (label). legend()

Ako u prethodno nacrtanim grafovima nije specificiran label, legendu se može napraviti i pomo´cu handleova na plotove. U tom sluˇcaju, funkcija legend prima listu handleova i listu pripadaju´cih opisa. plt1, = plot([1,2,3]) plt2, = plot([3,2,1]) legend([plt2, plt1], ["line 2", "line 1"])

¯ Dodatnim keyword argumentom loc odreduje se pozicija legende na prozoru. Vrijednosti koje se daju argumentu loc mogu biti cijeli brojevi ili stringovi koji specificiraju poziciju legende na prozoru (Tablica 19.4).

19.4 spremanje grafova

Pozicija

Broj

String

Gore desno

1

’upper right’

Gore lijevo

2

’upper left’

Dolje lijevo

3

’lower left’

Dolje desno

4

’lower right’

Desno

5

’right’

Na sredini lijevo

6

’center left’

Na sredini desno

7

’center right’

Dolje u sredini

8

’lower center’

Gore u sredini

9

’upper center’

U sredini

10

’center’

Tablica 19.4: Pozicija legende

Izvorni kod 19.4: Prikaz legende na grafu 1 2

from pylab import * from numpy import *

3 4 5 6

x = linspace(0, 10, 100) y1 = sin(x) y2 = cos(x)

7 8 9 10 11 12

figure(1, [8, 2]) plot(x, y1, label=’sinus’) plot(x, y2, label=’kosinus’) legend(loc=’upper center’) # Postavlja legendu gore na sredinu show()

1.0 0.5 0.0 0.5 1.00

sinus kosinus

4

2

6

8

10

Slika 19.10: Prikaz legende na grafu

19.4

spremanje grafova

19.5

podgrafovi

Podgrafovi omogu´cavaju postavljanje grafova u mrežu grafova. Potrebno je specificirati broj redaka i stupaca. Izvorni kod 19.5: Primjer crtanja podgrafova 1 2 3 4 5 6 7

from pylab import * from numpy import * def myticks(): xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi], [r’$-\pi$’, r’$-\pi/2$’, r’$0$’, r’$+\pi/2$’, r’$+\pi$’]) yticks([-1, 0, +1], [r’$-1$’, r’$0$’, r’$+1$’])

99

100

osnovni 2d grafovi

8 9 10

X = np.linspace(-np.pi, np.pi, 256,endpoint=True) C,S = np.cos(X), np.sin(X)

11 12 13 14 15 16 17 18

figure(1) subplot(211) plot(X, C, color="blue", linewidth=2.5, linestyle="-") myticks() subplot(212) plot(X, S, color="red", linewidth=2.5, linestyle="-") myticks()

19 20

show()

+1

0

−1

−π

−π/2

0

+ π/2



−π

−π/2

0

+ π/2



+1

0

−1

Slika 19.11: Podgrafovi nastali izvršavanjem izvornog koda 19.5

Podgrafovi se iscrtavaju u slici (figure) koja se sastoji od dva grafa. Naredba subplot definira broj redaka, broj stupaca i broj grafa, koji mora biti broj 1 < fignum < numrows ∗ numcols. Varijable ne moraju biti odvojene zarezom ako vrijedi numrows ∗ numcols < 10. Odnosno, subplot(211) je ekvivalentan izrazu subplot(2,1,1). 19.6

polarni grafovi

Izvorni kod 19.6: Primjer crtanja grafa u polarnom koordinatnom sustavu 1 2

from pylab import * from numpy import *

3 4 5

fig = figure(figsize=[8,8]) ax = fig.add_subplot(111, polar=True)

6 7

subplots_adjust(bottom=0.1,top=0.9,left=0.1,right=0.9)

8 9 10

r = arange(0,1,0.001) theta = 2*2*pi*r

19.7 tips and tricks

11 12 13 14

ax.plot(theta,r, lw=2) grid(True) show()

90°

135°

45°

0.2

180°

0.4

0.6

225°

Slika 19.12: Graf u polarnom koordinatnom sustavu

tips and tricks

Use matplotlib’s calls that won’t block: Using draw(): 1 2 3 4

from matplotlib import plot, draw, show plot([1,2,3]) draw() print ’continue computation’

5 6 7

# at the end call show to ensure window won’t close. show()

Using interactive mode: 1 2 3

from matplotlib import plot, ion, show ion() # enables interactive mode plot([1,2,3]) # result shows immediatelly (implicit draw())

4 5

print ’continue computation’

6 7 8

# at the end call show to ensure window won’t close. show()

1.0



315°

270°

19.7

0.8

101

20

SLOŽENIJI 2D GRAFOVI

20.1

izolinije

Prilikom vizualizacije ovisnosti funkcije (ili podataka) o dvije varijable (2D) cˇ esto se koriste izolinije. Izolinije su krivulje koje povezuju toˇcke iste (skalarne) vrijednosti. Izolinija je skup rješenja jednadžbe f(x, y) = ci

(20.1)

¯ gdje je ci konstanta za koju se odreduje izolinija. Ako za dani ci postoji rješenje jednadžbe (20.1), to rješenje predstavlja jednu ili više krivulja u ravnini x − y. Za više parametara c = (c1 , c2 , ..., cn ) dobiva se familija krivulja koje služe za 2D vizualizaciju funkcija dvije varijable. ¯ Matplotlib nudi mogu´cnost naprednog uredivanja i kontrolabilnost izolinijskih grafova. Funkcija contour služi za crtanje izolinija a countourf za ¯ izolinija. bojanje površina izmedu matplotlib.pyplot.contour matplotlib.pyplot.contourf

Obje navedene funkcije imaju identiˇcnu osnovnu sintaksu, a razlikuju se u svega nekoliko argumenta koji su specifiˇcni za stiliziranje linija odnsno bojanje ploha. U najjednostavnijoj varijanti, funkcije primaju jedan argumenti i to ma¯ tricu Z na temelju cˇ ijih vrijednosti se crtaju izolinije i plohe. Razmaci izmedu ¯ redaka i stupaca su jednaki 1 a broj izolinija se odreduje automatski. matplotlib.pyplot.contour(Z) matplotlib.pyplot.contourf(Z)

Broj nivo linija se može specificirati cijelim brojem n ili se mogu odrediti željene vrijednosti pomo´cu vektora V za koje c´ e se crtati izolinije. matplotlib.pyplot.contour(Z, n) matplotlib.pyplot.contourf(Z, n) matplotlib.pyplot.contour(Z, V) matplotlib.pyplot.contourf(Z, V)

¯ stupaca i redaka mogu se zadati pomo´cu matrica X i Y: Razmaci izmedu matplotlib.pyplot.contour(X, Y, Z) matplotlib.pyplot.contour(X, Y, Z, n) matplotlib.pyplot.contourf(X, Y, Z, n) matplotlib.pyplot.contour(X, Y, Z, V) matplotlib.pyplot.contourf(X, Y, Z, V)

Matrice X i Y sadrže x i y kordinate pripadaju´cih elemenata u matrici Z te sve tri matrice moraju biti istog oblika/dimenzija. Za jednostavljeno kreiranje takvih matrica na temelju vektora koordinata koristi se funkcija meshgrid (vidi poglavlje 14.8). 20.1.1

Mapa boja

Mapa boja (eng. colormap) je naˇcin na koji se numeriˇcka vrijednost sa intervala [0, 1] pretvara u RGBA (Red, Green, Blue, Alpha) specifikaciju boje kojom se definira udio crvene, zelene i plave boje te prozirnost.

103

104

složeniji 2d grafovi

Mapiranje boja se odvija u dva koraka: podaci koje treba vizualizirati su prvo mapirani na interval [0, 1] koriste´ci klasu matplotlib.colors.Normalize ili neku od njenih podklasa; onda se broj sa intervala [0, 1] mapira u odre¯ denu boju koriste´ci mapu boja. Matplotlib sadrži unaprijed definirane mape boja koje se nalaze u matplotlib.pyplot.cm modulu (Slika 20.1). Accent BrBG BuPu Dark2 Greens OrRd PRGn Pastel1 PiYG PuBuGn PuRd RdBu RdPu RdYlGn Set1 Set3 YlGn YlOrBr afmhot binary brg cool copper flag gist_gray gist_ncar gist_stern gnuplot gray hsv nipy_spectral pink rainbow spectral summer

Blues BuGn CMRmap GnBu Greys Oranges Paired Pastel2 PuBu PuOr Purples RdGy RdYlBu Reds Set2 Spectral YlGnBu YlOrRd autumn bone bwr coolwarm cubehelix gist_earth gist_heat gist_rainbow gist_yarg gnuplot2 hot jet ocean prism seismic spring terrain

Slika 20.1: Predefinirane mape boja u matplotlibu

Mapa boja se postavlja pomo´cu keyword argumenta cmap: matplotlib.pyplot.contour(X, Y, Z, cmap=matplotlib.pyplot.cm.hot)

Osim predefiniranih mapa boja, mogu se koristiti i ruˇcno definirane mape boja. 20.1.2

Detaljnije podešavanje grafa izolinija

Podešavanje boja u grafovima izolinija mogu´ce je se keyword argumentom colors u contour i contourf funkcijama. U funkciji contour boje se aplici¯ raju na izolinije a u funkciji contourf boje se apliciraju na površine izmedu

izolinija. Tri su osnovna naˇcina zadavanja boje: ? colors = None, boje se preuzimaju iz postavljene mape boja (vidi 20.1.1) ? colors = ’r’, postavlja se jedna boja za sve izolinije ili površine iz¯ izolinija. medu

20.1 izolinije

? colors = [’r’, ’g’, ’b’], postavlja se lista (ili tuple) boja. Boje iz liste se ponavljaju, ako ima više izolinija nego specificiranih boja. Pojedinu boju ili boju u listi se može zadavati na više naˇcina, kao što je opisano u poglavlju (19.2.1). Kada u istom prostoru crtanja postoji više grafova, bolja vidljivost svih ¯ njih grafova se postiže prozirnoš´cu. Prozirnost izolinija ili površina izmedu postavlja se pomo´cu keyword argumenta alpha. alpha može primiti decimalni broj sa intervala [0, 1] gdje je 0 potpuno prozirno (nevidljivo) a 1 je potpuno neprozirna boja. 20.1.3

Primjer

Izvorni kod 20.1: Primjer vizualizacije izolinija 1 2 3

# -*- coding: utf-8 -*import numpy as np import matplotlib.pyplot as pl

4 5 6 7

# Definiranje funckije def f(x,y): return (1 - np.sin(x) - np.sin(y)**3) * np.exp(-np.cos(x) -np.sin(y)**2)

8 9 10

# Gusto´ ca vizualizacijskih toˇ caka (po svakoj dimenziji) n = 256

11 12 13 14 15

# Diskretizacija x = np.linspace(-4, 0, n) y = np.linspace(-3, 1, n) X,Y = np.meshgrid(x, y)

16 17 18

# Ukljuˇ civanje mreže pomo´ cnih linija pl.grid()

19 20 21 22

# Crtanje površina izme¯ du izolinija # 8 - broj izolinija, alpha - prozirnost, cmap - kolormapa Cf = pl.contourf(X, Y, f(X, Y), 8, alpha=.75, cmap=pl.cm.jet)

23 24 25 26

# Crtanje izolinija # colors - boja linija, linewidth - debljina linija Cl = pl.contour(X, Y, f(X, Y), 8, colors=’black’, linewidth=.5)

27 28 29

# Dodavanje oznaka na izolinije pl.clabel(Cl, inline=1, fontsize=10)

30 31

pl.show()

105

složeniji 2d grafovi

0 0.50

0.0

3.500

00

0 2.50

0.5

1.5 00

0.5

0

0.00

3.0

1.0

1.0 1.5 2.0

0

00

3.5

3.0

2.5

2.0

1.5

1.0

0

3.0

0.50

00

3.0 4.0

00 1.0

2.0

1.000

2.5

2.50

106

0.5

¯ Slika 20.2: Graf napravljen izvodenjem izvornog koda 20.1

0.0

21

IZRADA ANIMACIJA

Izvorni kod 21.1: Jednostavan primjer animacije 1 2 3 4

# -*- coding: utf-8 -*""" Nelder-Mead metoda """

5 6 7 8

import numpy as np import matplotlib.pyplot as plt from matplotlib import animation

9 10 11 12 13

fig = plt.figure() linija, = plt.plot([], [], ’-o’) plt.xlim([0, 10]) plt.ylim([-1, 1])

14 15 16 17

def init(): linija, = plt.plot([], [], ’-o’)

18 19

return linija

20 21

def draw_frame(it):

22 23 24 25

xline = np.linspace(0.0,10.0,50) yline = np.sin(xline + it/10.0)/(1.0 +xline**2.0) linija.set_data(xline, yline)

26 27

return linija

28 29 30

Writer = animation.writers[’ffmpeg’] writer = Writer(fps=5, metadata=dict(artist=’sim.riteh.hr’), bitrate=3600)

31 32 33

anim = animation.FuncAnimation(fig, draw_frame, init_func=init, frames=500, interval=2, repeat=False)

34 35 36

anim.save(’nelder-mead.avi’, writer=writer) plt.show()

107

Dio IV ˇ KE METODE NUMERIC

22

R J E Š AVA N J E N E L I N E A R N I H J E D N A D Ž B I

Cilj numeriˇckih metoda za rješavnje nelinearnih jednadžbi (eng. root finding) je odrediti nultoˇcku neprekidne realne funkcije f : R → R to jest riješiti jednadžbu f(x) = 0.

(22.1)

Mogu´ce je da funkcija f ima više realnih nultoˇcaka i da su neke višestruke. ¯ funkcija f možda uop´ce nema realnih nultoˇcaka. Takoder, Ako za neprekidnu funkciju vrijedi f(a) f(b) 6 0 tada funkcija na intervalu [a, b] mijenja predznak pa postoji barem jedna nultoˇcka na odabranom intervalu. Ako je poznato da je funkcija i monotona na intervalu [a, b] tada je nultoˇcka jedinstvena. Osnovni korak numeriˇckih metoda je separirati jedan korijen ξ jednadžbe (22.1). Nakon što smo izolirali jedno rješenje, nekom odabranom numeriˇckom metodom formiramo niz aproksimacija xi → ξ. Numeriˇcku metodu zaustavljamo kada je zadovoljen zadani kriterij toˇcnosti |ξ − xi | < . Postoji više numeriˇckih metoda za rješavanje nelinearnih funkcija, a neko¯ liko najznaˇcajnijih c´ e biti obradeno u ovom poglavlju. Numeriˇcke metode se razlikuju po stabilnosti, naˇcinu primjene i brzini konvergencije (red konvergencije). Definicija 22.1 Neka niz (xi ), dobiven nekom iterativnom metodom, konvergira prema ξ Ako postoje dvije pozitivne konstante C, r takve da vrijedi |ξ − xi+1 | 6C i→∞ |ξ − xi |r lim

tada kažemo da metoda ima red konvergencije r. S obzirom na red konvergencije r, iterativna numeriˇcka metoda konvergira: 1. linearno ako je r = 1, 2. superlinearno ako je 1 < r < 2, 3. kvadratiˇcno ako je r = 2, 4. kubiˇcno ako je r = 2. 22.1

metoda bisekcije

Metoda bisekcije namjenjena je rješavnju jednadžbe f(x) = 0 na intervalu ¯ [xl , xd ] koriste´ci ogradivanje (eng. bracketing) Da bi se metoda mogla primjeniti, funkcija f(x) mora biti neprekidna te mora vrijediti f(xl ) · f(xd ) 6 0.

111

112

rješavanje nelinearnih jednadžbi

Zbog navedenih uvjeta, funkcija f(x) ima bar jedan korijen x0 na intervalu [xl , xd ]. ¯ Biskecija je jedna od metoda ogradivanja, u kojoj se u svakom koraku raˇcuna vrijednost funkcije na polovici intervala.

xs =

xl + xd 2

Na temelju vrijednosti funkcije u rubnim toˇckama te u centralnoj toˇcki, ¯ odreduje se novi, dvostruko uži, interval. Ako je f(xl ) · f(xs ) < 0 tada je x0 ∈ [xl , xs ], a ako je f(xs ) · f(xd ) < 0 tada je x0 ∈ [xs , xd ]. Prepolavljanje se iterativno ponavlja (Slika 22.1). U sluˇcaju da je f(xs ) = 0, ¯ traženi korijen funkcije. tada je pronaden

f(x)

xd xl

x f(x)

Slika 22.1: Skica metode biskecije

Metoda biskecije, ako su navedeni uvjeti zadovoljeni, c´ e sigurno konvergirati u jedan od korijena funkcije f(x) na intervalu [xl , xd ]. Apsolutna greška se prepolavlja u svakom koraku iteracije pa metoda konvegira linearno, što je, u odnosu na druge metode, relativno sporo. Osnovna sintaksa: bisect(f, a, b)

gdje je f funkcija, a a i b su granice intervala na kojem se traži korijen funkcije. Dodatni argumenti omogu´cuju kontrolu i pregled konvergencije:

optimize.bisect

poziva _zeros._bisect,

args=() xtol=1e-12 rtol=4.4408920985006262e-16 maxiter=100 full_output=False disp=True

koja je implementirana u C-u.

gdje je xtol apsolutna tolerancija, rtol relativna tolerancija, maxiter maksimalni broj iteracija, full_output omogu´cuje dohva´canje dodatnih informacija o konvergenciji i disp omogu´cuje podizanje RuntimeError u sluˇcaju da metoda ne konvergira. Izvorni kod 22.1: Primjer pronalaženja nultoˇcke funkcije metodom biskecije 1 2 3

#!/usr/bin/python import scipy.optimize as optimize from numpy import cos

4 5

def f(x):

22.2 newton-raphsonova metoda

6

113

return cos(x)**2 + 6 - x

7 8 9 10 11 12

# 0 T_-1 = T_0 dT0/dt = k*(T_1 - 2*T_0 +T_-1)/dx^2 = k*(T_1 - T_0)/dx^2 """ A[0,0] = -1 A[0,1] = 1

28 29 30 31 32

""" Zadnja toˇ cka: fiksna temperatura dT/dt = 0 """ A[-1,-1] = 0

33 34 35 36 37 38

dx=0.1; k=0.01; nt = 11 t = linspace(0.0, 100., nt)

39 40 41

T0 = sin(x*pi) print shape(dot(A,T0))

42 43 44 45 46 47 48

""" Postavi sustav ODJ """ def dT_dt(T, t): dT = (k/dx**2.0)*dot(A,T) return dT

49 50 51 52

""" Rješi sustav ODJ """

metoda linija

53

rez = odeint(dT_dt, T0, t)

54 55 56 57 58 59 60

""" Crtanje i animacija rješenja """ fig1 = figure() lineGeom, = plot([], [], ’r-’, lw=2) titl = title(’’)

61 62 63 64 65 66

def update_line(i): lineGeom.set_data(x, rez[i,:]) titl.set_text(’t=%f’ % t[i]) #fig1.savefig(’img_%03d.png’ % i) return

67 68 69

anim = FuncAnimation(fig1, update_line, nt, interval=1000, repeat_delay=0) show()

161

Dio VI OPTIMIZACIJSKE METODE

33

DEFINICIJA OPTIMIZACIJSKOG PROBLEMA Optimizacijski problem se može postaviti kao pronalaženje vektora x∗ = (x∗1 , x∗2 , ..., x∗n ) za koji vrijedi f(x∗ ) 6 f(x), ∀x ∈ Ω

(33.1)

gdje je f funkcija cilja, x = (x1 , x2 , ..., xn ) vekor optimizacijskih varijabli a x∗ vektor rješenja optimizacijskog problema. Ω je prostor pretraživanja. Izraz (33.1) pretpostavlja da je rijeˇc o minimizacijskom problemu. U slucˇ aju maksimizacije, problem se definira kao f(x∗ ) > f(x), ∀x ∈ Ω 33.1

(33.2)

optimizacijske varijable

Optimizacijske varijable (eng. optimization variables, design variables, design parameters, decision variables) su varijable cˇ ije vrijednosti treba odrediti a da zadovoljavaju ciljeve i ograniˇcenja optimizacijskog problema. Zbog jednostavnosti zapisa, cˇ esto se koristi vektor optimizacijskih varijabli (eng. design vector): x = (x1 , x2 , ..., xn )

(33.3)

gdje je n broj optimizacijskih varijabli. ¯ Domena pretraživanja ili prostor pretraživanja odreduje mogu´ce vrijed¯ je s obzirom na tip varijabli (kontinosti optimizacijskih varijabli; a odreden nuirane ili diskretne) te s obzirom na propisane granice varijabli. Prostor pretraživanja ¯ Za optimizaciju sa kontinuiranim neomedenim varijablama vrijedi x ∈ Rn

(33.4)

¯ ¯ Uvodenjem omedenosti, prostor pretraživanja sužava se na Ω x ∈ Ω ⊂ Rn

(33.5)

¯ Omedenost (bound) kontinuiranih optimizacijskih varijabli je postavljanje granica varijabli tj. definiranje dopuštenog intervala varijabli. Za svaku kontinuiranu varijablu xi može se postaviti donja granica (lower bound) xmin te i gornja granica (upper bound) xmax i onda vrijedi: i i h xi ∈ xmin , xmax , ∀i = 1, . . . , n (33.6) i i ¯ Uvodenjem diskretnih varijabli, najˇceš´ce indeksiranih pomo´cu cijelih ili prirodnih brojeva, prostor pretraživanja se definira na skupu cijelih brojeva x ∈ Zn

(33.7)

ili na skupu prirodnih brojeva x ∈ Nn

(33.8)

165

166

definicija optimizacijskog problema

U relanim primjenama, diskretne varijable su gotovo uvijek definirane na konaˇcnom skupu brojeva xi ∈ {i = 1, 2, . . . , ki } , ∀i = 1, . . . , n

(33.9)

gdje je ki broj mogu´cih vrijednsoti diskretne varijable xi . Optimizacijske probleme, s obzirom na tip optimizacijskih varijabli, možemo klasificirati na: ? kontinuirane ? diskretne ? mješovite ¯ a s obizirom na omedenost na: ¯ ? omedene (bounded) i ¯ ? neomedene (unbounded). 33.2

ciljevi optimizacije i funkcija cilja f(x)

33.3

ˇ ograni cenja

(33.10)

34

LINEARNO PROGRAMIRANJE

Linearno programiranje je matematiˇcka metoda pronalaska optimuma linearne funkcije više varijabli poštuju´ci ograniˇcenja zadana linearnim nejednakostima i jednakostima. Linearno programiranje je razvijeno kao disciplina u 1940-ima, u poˇcetku motivirano zbog potrebe za rješavanje složenih problema planiranja u ratnim operacijama. Njegov razvoj ubrzano raste u poslijeratnom razdoblju, kad mnoge industrije pronalaze korisne primjene linearnog programiranja. Iako je problem linearnog programiranja formulirao još Furier, jedna od prvih praktiˇcnih upotreba imao je ruski matematiˇcar Kantoroviˇc ([5]) u pokušaju poboljšanja ekonomskih planiranja 1939. godine u SSSR-u. 34.1

definicija lp problema

Problem linearnog programiranje može se razluˇciti na funkciju cilja te na ograniˇcenja. Funkcija cilja je linerna jednadžba n varijabli (x1 , x2 , ..., xn ) definirana koeficijetima c1 , c2 , ..., cn . f(x1 , x2 , ..., xn ) =

n X

ci · xi

(34.1)

i=1

Jednadžba (34.1) može se zapisati u vektorskom obliku: f(x) = c · x

(34.2)

gdje je x = (x1 , x2 , ..., xn ) vekor varijabli a c = (c1 , c2 , ..., cn ) vektor koeficijenata linearne jednadžbe. Vektor x ∈ Ω ⊂ Rn predstavlja optimizacijske varijable za koje se traži optimalno rješenje x∗ za koje vrijedi f(x∗ ) 6 f(x), ∀x ∈ Ω

(34.3)

Ograniˇcenja problema se mogu zadati kao sustav linearnih nejednadžbi: a11 · x1 + a12 · x2 + . . . + a1n · xn

> b1

a21 · x1 + a22 · x2 + . . . + a2n · xn .. .

> b2 .. .

am1 · x1 + am2 · x2 + . . . + amn · xn

> bm

gdje je m broj ograniˇcenja. Sustav linearnih nejednadžbi (34.6) se može jednostavnije zapisati vektorski A·x > b

(34.4)

167

Nejednadžbe se mogu zadavati sa razliˇcitim operatorima ¯ usporedivanja (> i 6), a mjenjanje operatora se može posti´ci množenjem cijele nejednandžbe sa -1.

168

linearno programiranje

Osim ograniˇcenja zadanih nejednakostima, ograniˇcenja se mogu zadati i lineanrim jednadžbama d11 · x1 + d12 · x2 + . . . + d1n · xn

= e1

d21 · x1 + d22 · x2 + . . . + d2n · xn .. .

= e2 .. .

dp1 · x1 + dp2 · x2 + . . . + dpn · xn

= ep

gdje je p broj ograniˇcenja. U vektorskom zapisu sustav linearnih jednadžbi (34.6) glasi

Ograniˇcenja zadan jednakostima mogu se zadavati i kao dvije identiˇcne nejednakosti sa suprotnim znakom nejednakosti (npr. x1 + x2 > 0 i x1 + x2 6 0 je isto što i x1 + x2 = 0)

D·x = E 34.2

(34.5)

simpleks metoda

George Dantzig je 1947. godine, zajedno sa suradnicima iz ameriˇckog ratnog zrakoplovstva razvio simpleks metodu [15, 16]. 34.3

´ modula pulp rješavanje lp problema pomo cu

http://code.google.com/p/pulp-or/

Kako instaliraty PuLP: user@machine:~>sudo pip install pulp user@machine:~>sudo zypper in glpk

Izvorni kod 34.1: Primjer rješavanja LP problema pomo´cu modula PuLP 1

# -*- coding: utf-8 -*-

2 3

from pulp import *

4 5 6 7

# Varijable x = LpVariable("x", 0, 3) y = LpVariable("y", 0, 1)

8 9 10

# LP problem prob = LpProblem("myProblem", LpMinimize)

11 12 13

# Cilj prob += -4*x + y

14 15 16 17

# Ogranicenja prob += x + y
View more...

Comments

Copyright ©2017 KUPDF Inc.
SUPPORT KUPDF