Upload
frankavuletic
View
204
Download
21
Embed Size (px)
DESCRIPTION
phyton
Citation preview
P Y T H O N U R A C U N A R S K O M I N E N J E R S T V U
stefan ivic , bojan crnkovic , jerko kific i marko cavrak
Numericke metode, priprema, obrada i vizualizacija podataka
12. rujna 2014. v0.1
Stefan Ivic, Bojan Crnkovic, Jerko kific i Marko Cavrak: Python u racunar-skom inenjerstvu, Numericke metode, priprema, obrada i vizualizacija po-dataka, c 12. rujna 2014.
S A D R A J
I osnove pythona 11 uvod 3
1.1 Instalacija . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31.1.1 Instalacija na Linux platformi . . . . . . . . . . . . . . . . . . . . 31.1.2 Instalacija na Windows platformi . . . . . . . . . . . . . . . . . . 3
1.2 Dodatni paketi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41.2.1 Dodatni paketi na Linux platformi . . . . . . . . . . . . . . . . . . 41.2.2 Dodatni paketi na Windows platformi . . . . . . . . . . . . . . . . 41.2.3 Instalacija pomocu upravitelja paketa . . . . . . . . . . . . . . . . . 4
1.3 Editori i razvojna okruenja . . . . . . . . . . . . . . . . . . . . . . . 51.3.1 Spyder . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51.3.2 PyDev . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51.3.3 Kate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2 python ljuska i .py skripte 72.1 Pokretanje Pythona . . . . . . . . . . . . . . . . . . . . . . . . . . . 72.2 Python ljuska kao kalukulator . . . . . . . . . . . . . . . . . . . . . . 72.3 Python skripte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.3.1 Upotreba posebnih znakova . . . . . . . . . . . . . . . . . . . . 82.4 Moduli . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
3 tipovi podataka 113.1 Brojevi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123.2 String . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133.3 Liste . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143.4 Tuple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163.5 Dictionary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173.6 Skupovi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
4 operatori 194.1 Aritmeticki operatori . . . . . . . . . . . . . . . . . . . . . . . . . . 194.2 Relacijski operatori ili operatori usporedivanja) . . . . . . . . . . . . . . 194.3 Operatori dodjeljivanja . . . . . . . . . . . . . . . . . . . . . . . . . 204.4 Logicki operatori . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204.5 Clanski operatori . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214.6 Operatori identiteta . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
5 osnovne naredbe za unos i ispis podataka 235.1 print . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235.2 input . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245.3 raw_input . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
6 uvjetna grananja 256.1 if . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256.2 else . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266.3 elif . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
7 petlje 297.1 for . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297.2 while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 307.3 break . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 307.4 continue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317.5 Paraleleno iteriranje . . . . . . . . . . . . . . . . . . . . . . . . . . . 327.6 Numeriranje liste . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
iii
iv sadraj
8 funkcije 358.1 Definiranje i pozivanje funkcija . . . . . . . . . . . . . . . . . . . . . . 358.2 Vracanje vrijednosti iz funkcije . . . . . . . . . . . . . . . . . . . . . . 368.3 Argumenti sa zadanim vrijednostima . . . . . . . . . . . . . . . . . . . 378.4 Keyword i non-keyword argumenti . . . . . . . . . . . . . . . . . . . . 378.5 Ugnjedena definicija funkcije . . . . . . . . . . . . . . . . . . . . . . 398.6 Anonimne funkcije . . . . . . . . . . . . . . . . . . . . . . . . . . . 398.7 Rekurzivne funkcije . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
9 objektno-orijentirano programiranje 439.1 Objektno-orijentirano programiranje . . . . . . . . . . . . . . . . . . . 439.2 Klase . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 449.3 Atributi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
9.3.1 Globalni atributi . . . . . . . . . . . . . . . . . . . . . . . . . 449.3.2 Objektni atributi . . . . . . . . . . . . . . . . . . . . . . . . . 45
9.4 Metode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 469.5 Preopterecivanje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
9.5.1 Preopterecivanje funkcija . . . . . . . . . . . . . . . . . . . . . . 489.5.2 Preopterecivanje operatora . . . . . . . . . . . . . . . . . . . . . 49
9.6 Nasljedivanje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5110 oblikovanje stringova 55
10.1 Oblikovanje sa operatorom % . . . . . . . . . . . . . . . . . . . . . . 5510.2 Oblikovanje sa metodom format . . . . . . . . . . . . . . . . . . . . . 57
11 rad sa datotekama 5911.1 Otvaranje i zatvaranje datoteka . . . . . . . . . . . . . . . . . . . . . . 5911.2 Pisanje u datoteke . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5911.3 Citanje iz datoteka . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6011.4 Pozicioniranje u datoteci . . . . . . . . . . . . . . . . . . . . . . . . . 6111.5 Preimenovanje, kopiranje i brisanje datoteka . . . . . . . . . . . . . . . 6211.6 Arhiviranje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
12 python standard library 6312.1 Informacije o platformi i operacijskom sustavu . . . . . . . . . . . . . . 6312.2 Matematicke funkcije . . . . . . . . . . . . . . . . . . . . . . . . . . 6312.3 Datum i vrijeme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6412.4 Vrijeme izvravanja . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
13 greke u python kodu 6713.1 Tipovi greaka . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6713.2 Manipulacija grekama - Exception handling . . . . . . . . . . . . . . . . 6813.3 Ispravljanje greaka - DeBugging . . . . . . . . . . . . . . . . . . . . . 69
II numpy polja i matrice 7114 zadavanje polja u numpy-u 73
14.1 array . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7314.2 arange . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7414.3 linspace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7414.4 zeros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7514.5 ones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7514.6 eye . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7614.7 diag . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7614.8 meshgrid . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
15 informacije o polju i indeksiranje 7915.1 Informacije o polju . . . . . . . . . . . . . . . . . . . . . . . . . . . 7915.2 Indeksiranje polja . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
16 manipulacije sa numpy poljima 81
sadraj v
16.1 Manipulacije sa dimenzijama polja . . . . . . . . . . . . . . . . . . . . 8116.2 Transponiranje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8216.3 Dodavanje i brisanje elemenata polja . . . . . . . . . . . . . . . . . . . 82
17 ucitavanje i spremanje numpy polja 8317.1 Ucitavanje iz tekstualnih datoteka . . . . . . . . . . . . . . . . . . . . 8317.2 Spremanje u tekstualne datoteke . . . . . . . . . . . . . . . . . . . . . 84
18 matricni racun 8518.1 Rjeavanje sustava linearnih jednadbi . . . . . . . . . . . . . . . . . . 85
III priprema , obrada i vizualizacija podataka 8719 osnovni 2d grafovi 89
19.1 Linijski grafovi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8919.2 Naprednija kontrola linijskih grafova . . . . . . . . . . . . . . . . . . . 92
19.2.1 Boje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9219.2.2 Markeri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
19.3 Svojstva prozora, prostora crtanja i osi . . . . . . . . . . . . . . . . . . 9419.4 Spremanje grafova . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9919.5 Podgrafovi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9919.6 Polarni grafovi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10019.7 tips and tricks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
20 sloeniji 2d grafovi 10320.1 Izolinije . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
20.1.1 Mapa boja . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10320.1.2 Detaljnije podeavanje grafa izolinija . . . . . . . . . . . . . . . . . 10420.1.3 Primjer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
21 izrada animacija 107
IV numericke metode 10922 rjeavanje nelinearnih jednadbi 111
22.1 Metoda bisekcije . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11122.2 Newton-Raphsonova metoda . . . . . . . . . . . . . . . . . . . . . . . 11322.3 Sekanta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11422.4 Brentova metoda . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11422.5 Zadaci . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
23 interpolacije 11723.1 1D interpolacija . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11723.2 2D i N-D interpolacija . . . . . . . . . . . . . . . . . . . . . . . . . . 118
24 regresije 12124.1 Metoda najmanjih kvadrata . . . . . . . . . . . . . . . . . . . . . . . 12124.2 Linearna regresija . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12124.3 Zadaci . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
25 rjeavanje sustava linearnih jednadbi 12525.1 Metoda Gaussove eliminacije . . . . . . . . . . . . . . . . . . . . . . . 12525.2 LU dekompozicija . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
26 numericko integriranje 12926.1 Trapezna formula . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12926.2 Simpsonove formule . . . . . . . . . . . . . . . . . . . . . . . . . . . 13126.3 Naprednije metode . . . . . . . . . . . . . . . . . . . . . . . . . . . 13226.4 Zadaci . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
V rjeavanje modela temeljenih na odj i pdj 13527 numericke metode za rjeavanje obicnih diferencijalnih jed-
nadbi 137
vi sadraj
27.1 Obicne diferencijalne jednadbe 1. reda . . . . . . . . . . . . . . . . . . 13727.1.1 Eulerova metoda . . . . . . . . . . . . . . . . . . . . . . . . . 13727.1.2 Runge-Kutta metode . . . . . . . . . . . . . . . . . . . . . . . 13727.1.3 Rjeavanje pomocu scipy-a . . . . . . . . . . . . . . . . . . . . . 137
27.2 Sustavi obicnih diferencijalnih jednadbi 1. reda . . . . . . . . . . . . . . 13827.3 Obicne diferencijalne jednadbe vieg reda . . . . . . . . . . . . . . . . 138
28 pocetni problemi 13928.1 Modeliranje otvorenog vodotoka . . . . . . . . . . . . . . . . . . . . . 139
28.1.1 Stacionarno strujanje . . . . . . . . . . . . . . . . . . . . . . . 14028.1.2 Maningova formula . . . . . . . . . . . . . . . . . . . . . . . . 14128.1.3 Uniformno strujanje i normalna dubina . . . . . . . . . . . . . . . . 14228.1.4 Kriticna dubina . . . . . . . . . . . . . . . . . . . . . . . . . . 14328.1.5 Hidraulicki skok . . . . . . . . . . . . . . . . . . . . . . . . . 14428.1.6 Numericko rjeavanje . . . . . . . . . . . . . . . . . . . . . . . 145
29 rubni problemi 14929.1 Savijanje grede . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14929.2 Stacionarno provodenje topline u tapu . . . . . . . . . . . . . . . . . . 151
30 klasifikacija parcijalnih diferencijalnih jednadbi 15331 elipticke parcijalne diferencijalne jednadbe 155
31.1 Progib ploce . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15532 metoda linija 159
VI optimizacijske metode 16333 definicija optimizacijskog problema 165
33.1 Optimizacijske varijable . . . . . . . . . . . . . . . . . . . . . . . . . 16533.2 Ciljevi optimizacije i funkcija cilja . . . . . . . . . . . . . . . . . . . . 16633.3 Ogranicenja . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166
34 linearno programiranje 16734.1 Definicija LP problema . . . . . . . . . . . . . . . . . . . . . . . . . . 16734.2 Simpleks metoda . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16834.3 Rjeavanje LP problema pomocu modula PuLP . . . . . . . . . . . . . . 16834.4 Prakticni primjeri LP problema . . . . . . . . . . . . . . . . . . . . . . 168
34.4.1 Teretni zrakoplov . . . . . . . . . . . . . . . . . . . . . . . . . 16935 nelder-mead metoda 173
35.1 Algoritam . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17335.2 Nelder-Mead metoda za optimizaciju funkcije dviju varijabli . . . . . . . . 174
36 simulirano kaljenje 17936.1 Algoritam . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17936.2 Primjer simuliranog kaljenja pomocu modula inspyred . . . . . . . . . . 179
37 optimizacija rojem cestica 18337.1 Razvoj metode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18337.2 Koritenje PSO metode pomocu modula inspyred . . . . . . . . . . . . . 184
38 geneticki algoritmi 18738.1 Evolucijski algoritmi . . . . . . . . . . . . . . . . . . . . . . . . . . . 18738.2 Koritenje DEAP modula . . . . . . . . . . . . . . . . . . . . . . . . 188
VII dodaci 195a korisne naredbe u linux operativnom sustavu 197
a.1 Kreiranje videa iz skupa slika . . . . . . . . . . . . . . . . . . . . . . 197a.2 Pracenje promjena tekstualnih datoteka . . . . . . . . . . . . . . . . . . 197
b bibliografija 199
P O P I S S L I K A
Slika 1.1 Spyder razvojno okruenje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5Slika 1.2 Kate tekstualni editor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6Slika 6.1 Dijagram toka if naredbe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25Slika 6.2 if-else dijagram toka . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26Slika 6.3 Dijagram toka za sloeni uvjet grananja . . . . . . . . . . . . . . . . . . . . . . . 28Slika 7.1 Dijagram toka while petlje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30Slika 7.2 Dijagram toka while petlje sa else blokom . . . . . . . . . . . . . . . . . . . . . 31Slika 7.3 Dijagram toka while petlje sa continue naredbom . . . . . . . . . . . . . . . . . 31Slika 19.1 Matplotlib elementi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89Slika 19.2 Prozor sa grafom napravljen izvodenjem izvrnog koda 19.1 . . . . . . . . . . . 90Slika 19.3 Graf napravljen izvodenjem izvornog koda 19.2 . . . . . . . . . . . . . . . . . . 92Slika 19.4 Graf napravljen izvodenjem izvornog koda 19.3 . . . . . . . . . . . . . . . . . . 94Slika 19.5 Izmijenjene granice grafa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95Slika 19.6 Custom ticks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96Slika 19.7 Custom ticks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96Slika 19.8 Spines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97Slika 19.9 Formatiranje oznaka na osima . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98Slika 19.10 Prikaz legende na grafu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99Slika 19.11 Podgrafovi nastali izvravanjem izvornog koda 19.5 . . . . . . . . . . . . . . . 100Slika 19.12 Graf u polarnom koordinatnom sustavu . . . . . . . . . . . . . . . . . . . . . . 101Slika 20.1 Predefinirane mape boja u matplotlibu . . . . . . . . . . . . . . . . . . . . . . . 104Slika 20.2 Graf napravljen izvodenjem izvornog koda 20.1 . . . . . . . . . . . . . . . . . . 106Slika 22.1 Skica metode biskecije . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112Slika 22.2 Newton-Raphsonova metoda . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113Slika 23.1 Primjer razlicitih 1D interpolacija . . . . . . . . . . . . . . . . . . . . . . . . . . 118Slika 23.2 Primjer 2D interpolacije . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119Slika 24.1 Regresijski pravac dobiven izvornim kodom 24.1 . . . . . . . . . . . . . . . . . 122Slika 26.1 Trapezi na cjelom intervalu [a,b] i na tri podintervala. . . . . . . . . . . . . . . 129Slika 26.2 Racunanje povrine ispod krivulje pomocu trapeza (Izvorni kod 26.1) . . . . . 131Slika 27.1 Vizualizacija rjeenja iz izvornog koda 27.1. . . . . . . . . . . . . . . . . . . . . 138Slika 28.1 Skica poprecnog presjeka otvorenog vodotoka . . . . . . . . . . . . . . . . . . . 139Slika 28.2 Energetske linije u strujanju fluida otvorenim vodotokom . . . . . . . . . . . . 139Slika 28.3 Pravokutni poprecni presjek kanala . . . . . . . . . . . . . . . . . . . . . . . . . 142Slika 28.4 Trapezni poprecni presjek kanala . . . . . . . . . . . . . . . . . . . . . . . . . . . 143Slika 28.5 M-krivulje vodnog lica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145Slika 28.6 S-krivulje vodnog lica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145Slika 28.7 Numericko rjeenje strujanja u otvorenom kanalu pravokutnog presjeka . . . . 147Slika 29.1 Savijanje grede . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149Slika 29.2 Rubni uvjeti za razlicite oslonce grede . . . . . . . . . . . . . . . . . . . . . . . . 150Slika 29.3 Progib elasticne linije grede . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151Slika 31.1 Ploca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155Slika 32.1 Diskretizacija . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159Slika 35.1 Tocke refleksije, ekspanzije, kontrakcije i redukcije kod Nelder-Mead metode
optimizacije za funkciju dvije varijable. Tocke refleksije, ekspanzije ili kontrak-cije mjenjaju najgoru tocku simpleksa, dok tocke redukcije mjenjaju dvije na-gore tocke simpleksa. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174
Slika 35.2 Izgled simpleksa u 5 iteraciji (za izvorni kod 35.1). . . . . . . . . . . . . . . . . 177Slika 36.1 Konvergencija optimizacije pomocu simuliranog kaljenja . . . . . . . . . . . . . 181Slika 37.1 Ponaanje jedinki u Reynoldsovom modelu. Odvajanje, usmjeravanje i kohezija. . 183Slika 37.2 Utjecaj gnjezda na jedinke jata. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184Slika 38.1 Konvergencija optimizacije genetickim algoritmom (Izvorni kod 38.1) . . . . . 193
vii
P O P I S TA B L I C A
Tablica 3.1 Primjeri oznacavanja brojeva . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13Tablica 4.1 Aritmeticki operatori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19Tablica 4.2 Relacijski operatori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20Tablica 4.3 Operatori dodjeljivanja . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20Tablica 4.4 Logicki operatori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21Tablica 5.1 printf formatiranje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23Tablica 10.1 Opcije konverzije . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55Tablica 10.2 Definiranje tipova podataka . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56Tablica 12.1 Opis nekih funkcija math modula . . . . . . . . . . . . . . . . . . . . . . . . . . . 63Tablica 12.2 Opis nekih funkcija cmath modula . . . . . . . . . . . . . . . . . . . . . . . . . . 63Tablica 19.1 Vrste linija . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90Tablica 19.2 Simboli boja . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91Tablica 19.3 Vrste markera . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91Tablica 19.4 Pozicija legende . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99Tablica 28.1 Vrijednosti Manningovog koeficijenta za razlicite izvedbe kanala. . . . . . . . . 141
viii
P O P I S I Z V O R N O G K O D A
Izvorni kod 2.1 Podrka za posebne znakove u Python skriptama . . . . . . . . . . . . . . . . . 8Izvorni kod 2.2 Koritenje objekata modula . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9Izvorni kod 3.1 Dodavanje i brisanje elemenata liste . . . . . . . . . . . . . . . . . . . . . . . . . 16Izvorni kod 4.1 Primjer kombiniranje operatora dodjeljivanja, operatora usporedivanja i logic-
kih operatora . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20Izvorni kod 5.1 Razliciti primjeri ispisa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23Izvorni kod 6.1 Jednostavan primjer upotrebe if naredbe . . . . . . . . . . . . . . . . . . . . . . 25Izvorni kod 6.2 Pisanje sloenijeg uvjetovanog grananja . . . . . . . . . . . . . . . . . . . . . . . 26Izvorni kod 6.3 Primjer upotrebe else naredbe . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26Izvorni kod 6.4 Primjer kombinacije naredbi if, elif i else . . . . . . . . . . . . . . . . . . . . 27Izvorni kod 7.1 Upotreba for naredbe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29Izvorni kod 7.2 Naredba for s listom stringova . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29Izvorni kod 7.3 Naredba for i stirng . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29Izvorni kod 7.4 Naredba for s listom stringova . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29Izvorni kod 7.5 Upotreba while naredbe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30Izvorni kod 7.6 Upotreba else naredbe u petlji . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30Izvorni kod 7.7 Upotreba break naredbe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31Izvorni kod 7.8 Upotreba continue naredbe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32Izvorni kod 7.9 Upotreba zip naredbe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32Izvorni kod 7.10 Upotreba zip naredbe sa vie lista. . . . . . . . . . . . . . . . . . . . . . . . . . . 32Izvorni kod 7.11 Numeriranje elemenata liste pomocu enumerate. . . . . . . . . . . . . . . . . . 33Izvorni kod 8.1 Definicija i pozivanje jednostavne funkcije . . . . . . . . . . . . . . . . . . . . . 35Izvorni kod 8.2 Definicija funkcije koja prima argument . . . . . . . . . . . . . . . . . . . . . . . 36Izvorni kod 8.3 Definicija funkcije koja prima vie argumenata i vraca vrijednost . . . . . . . . 36Izvorni kod 8.4 Funkcija koja vraca razlicite tipove . . . . . . . . . . . . . . . . . . . . . . . . . . 36Izvorni kod 8.5 Funkcija koja vraca vie vrijednosti korsiteci tuple . . . . . . . . . . . . . . . . 37Izvorni kod 8.6 Funkcija sa zadanim argumentom . . . . . . . . . . . . . . . . . . . . . . . . . . 37Izvorni kod 8.7 Funkcija sa *args i **kwargs argumentima . . . . . . . . . . . . . . . . . . . . . 38Izvorni kod 8.8 *args i **kwargs argumenti prilikom poziva funkcije . . . . . . . . . . . . . . . 38Izvorni kod 8.9 Primjer anonimne funkcije u ugnjedenoj definiciji . . . . . . . . . . . . . . . . 40Izvorni kod 9.1 Definicija klase . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44Izvorni kod 9.2 Primjer definicije klasnih (globalnih) atributa . . . . . . . . . . . . . . . . . . . . 44Izvorni kod 9.3 Primjer definicije objektnog atributa . . . . . . . . . . . . . . . . . . . . . . . . . 45Izvorni kod 9.4 Inicijalizacija objekta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46Izvorni kod 9.5 Definicija metode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46Izvorni kod 9.6 Preopterecivanje funkcije print . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48Izvorni kod 9.7 Preopterecivanje funkcije print . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49Izvorni kod 9.8 Preopterecivanje funkcije print . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50Izvorni kod 9.9 Naslijedivanje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51Izvorni kod 9.10 Naslijedivanje override __init__metode . . . . . . . . . . . . . . . . . . . . . . . 52Izvorni kod 10.1 Primjer formatiranja numerickih podataka sa tupleom i dictionaryjem . . . . . 55Izvorni kod 10.2 Primjer formatiranja numerickih podataka sa tupleom i dictionaryjem . . . . . 56Izvorni kod 10.3 Primjer formatiranja numerickih podataka za ispis u stupcima . . . . . . . . . 56Izvorni kod 11.1 Primjer kreiranja tekstualne datoteke . . . . . . . . . . . . . . . . . . . . . . . . 59gfx/RadSaDatotekama/info.txt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60gfx/RadSaDatotekama/test.txt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60Izvorni kod 11.2 Citanje sadraja tekstualne datoteke . . . . . . . . . . . . . . . . . . . . . . . . . 61Izvorni kod 11.3 Pristupanje sadraju datoteke preko iteriranja po file objektu . . . . . . . . . 61gfx/RadSaDatotekama/test.txt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61Izvorni kod 11.4 Dohvacanje trenutne pozicije u datoteci . . . . . . . . . . . . . . . . . . . . . . . 61Izvorni kod 11.5 Kopiranje, micanje i preimenovanje datoteka . . . . . . . . . . . . . . . . . . . . 62Izvorni kod 12.1 Primjer mjerenja vremena izvravanje algoritma . . . . . . . . . . . . . . . . . . 64Izvorni kod 12.2 Primjer upotrebe Timer klase za mjerenje vremena izvodenja funkcije . . . . . 65Izvorni kod 13.1 Upotreba dbg modula . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70Izvorni kod 14.1 Spremanje elemenata dijagonale matrice u vektor . . . . . . . . . . . . . . . . . 76Izvorni kod 15.1 Osnovne informacije o NumPy polju . . . . . . . . . . . . . . . . . . . . . . . . 79Izvorni kod 15.2 Manipulacije sa poljima pomocu indeksa . . . . . . . . . . . . . . . . . . . . . . 80Izvorni kod 16.1 Mijenjanje dimenzija polja . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81Izvorni kod 16.2 Mijenjanje dimenzija polja . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81Izvorni kod 16.3 Transponiranje matrica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82Izvorni kod 17.1 Sadraj datoteke data.txt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83Izvorni kod 17.2 Ucitavanje iz tekstualne datoteke . . . . . . . . . . . . . . . . . . . . . . . . . . . 83Izvorni kod 18.1 Rjeavanje sustava linearnih jednadbi . . . . . . . . . . . . . . . . . . . . . . . 85Izvorni kod 19.1 Jednostavan graf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89Izvorni kod 19.2 Kontrola linija i markera . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91Izvorni kod 19.3 Naprednija kontrola linija i markera . . . . . . . . . . . . . . . . . . . . . . . . . 93Izvorni kod 19.4 Prikaz legende na grafu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99Izvorni kod 19.5 Primjer crtanja podgrafova . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99Izvorni kod 19.6 Primjer crtanja grafa u polarnom koordinatnom sustavu . . . . . . . . . . . . . 100Izvorni kod 20.1 Primjer vizualizacije izolinija . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105Izvorni kod 21.1 Jednostavan primjer animacije . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107Izvorni kod 22.1 Primjer pronalaenja nultocke funkcije metodom biskecije . . . . . . . . . . . . 112Izvorni kod 22.2 Primjer pronalaenja nultocke funkcije metodom tangente . . . . . . . . . . . . 114Izvorni kod 23.1 Primjer razlicitih 1D interpolacija . . . . . . . . . . . . . . . . . . . . . . . . . . 117Izvorni kod 23.2 Primjer linearne i kubicne 2D interpolacije . . . . . . . . . . . . . . . . . . . . . 118
ix
x Popis izvornog koda
Izvorni kod 24.1 Primjer linearne regresije . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121gfx/RjesavanjeSustavaLinJed/A.txt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125gfx/RjesavanjeSustavaLinJed/B.txt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125Izvorni kod 25.1 Primjer naivne Gaussove eliminacije . . . . . . . . . . . . . . . . . . . . . . . . . 126Izvorni kod 25.2 Primjer LU dekompozicije . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126Izvorni kod 26.1 Primjer racunanja odredenog inegrala pomocu trapezne formule . . . . . . . . 130Izvorni kod 26.2 Upotreba Simpsonove 1/3 formule . . . . . . . . . . . . . . . . . . . . . . . . . 132Izvorni kod 26.3 Numericko integriranje pomocu quad funkcije . . . . . . . . . . . . . . . . . . . 133Izvorni kod 27.1 Primjer rjeavanja obicnih diferencijalnih jednadbi 1. reda. . . . . . . . . . . . 137Izvorni kod 28.1 Strujanje u pravokutnom kanalu . . . . . . . . . . . . . . . . . . . . . . . . . . . 145Izvorni kod 29.1 Rjeavanje elasticne linije savijanja . . . . . . . . . . . . . . . . . . . . . . . . . . 150Izvorni kod 31.1 Rjeavanje problema progiba ploce pomocu metode konacnih razlika . . . . . 156Izvorni kod 32.1 Primjer rjeavanje provodenja topline kroz tap pomocu metode linija . . . . . 160Izvorni kod 34.1 Primjer rjeavanja LP problema pomocu modula PuLP . . . . . . . . . . . . . . 168Izvorni kod 34.2 Rjeavanje problema transportnog zrakoplova . . . . . . . . . . . . . . . . . . . 170Izvorni kod 35.1 Primjer 2D optimizacije Nelder-Mead metodom . . . . . . . . . . . . . . . . . . 175Izvorni kod 36.1 Primjer simuliranog kaljenja pomocu modula inspyred . . . . . . . . . . . . . . 179Izvorni kod 37.1 Particle Swarm Optimization na primjeru Rastrigin funkcije . . . . . . . . . . . 184Izvorni kod 38.1 Optimizacija Rastrigin funkcije pomocu DEAP modula . . . . . . . . . . . . . . 188
I N D E K S
%, 55
alpha, 105Amoeba, 173and, 20anonimne funkcije, 39append, 15, 82arange, 74aritmeticki operatori, 19array, 73as, 9atributi, 44
bisect, 111bisekcija, 111break, 30brent, 114Brentova metoda, 114bvp1lg, 150
capitalize, 14center, 14class, 44, 4749, 51clock, 64close, 59closure, 39cmath, 63coding, 8color, 92colormap, 103continue, 31contour, 103contourf, 103copy, 62count, 13, 15
datoteke, 59DEAP, 188debug, 67, 69decimal, 64decode, 14def, 35del, 11, 15delete, 82diag, 76dpi, 94draw, 101
easy_install, 4elasticna linija, 149elif, 27Elipticke parcijalne diferencijalne jednadbe, 155else, 26, 30encode, 14endswith, 13enumerate, 33error, 68Euler-Bernoullijeva jednadba, 149Eulerova metoda, 137evolucijski algoritmi, 187exception, 68expandtabs, 13extend, 15eye, 76
ffmpeg, 197figsize, 94figure, 94file, 59find, 13flatten, 81for, 29
format, 57from, 9funkcije, 35
GA, 187geneticki algoritmi, 187genfromtxt, 84globalni atributi, 44grid, 98griddata, 118
hidraulicki skok, 144
id, 21if, 25import, 8in, 21indeksi, 79index, 13, 15input, 24insert, 15, 82inspyred, 184integriranje, 129interp1d, 117interp2d, 118interpolacija, 117is, 21is not, 21isalnum, 14isalpha, 14isdigit, 14islower, 14isspace, 14istitle, 14isupper, 14izolinije, 103
join, 14
Kate, 6
label, 93lambda, 39lambda funkcije, 39legend, 98legenda, 98len, 15linearno programiranje, 167linspace, 74list, 14ljust, 14loadtxt, 83logicki operatori, 20lower, 14lstrip, 14LU dekompozicija, 126
M krivulje, 145Manningov koeficijent trenja, 141Manningova formula, 140, 141mapa boja, 103marker, 92markeredgecolor, 92markeredgewidth, 92markerevery, 92markerfacecolor, 92markerfacecoloralt, 92markersize, 92math, 63matrica sustava, 85meshgrid, 77, 103metoda Gaussove eliminacije, 125metoda linija, 159metoda sekante, 114
xi
xii INDEKS
metoda tangente, 113metode, 46modul, 8move, 62
naslov, 98ndarray, 73ndim, 79Nelder-Mead metoda, 173nestacionarno strujanje, 139neuniformno strujanje, 139newton, 113Newton-Raphsonova metoda, 113Newtonova metoda, 113normalna dubina, 142not, 20not in, 21
objektni atributi, 45objektno orijentirano programiranje, 43odeint, 137ones, 75ones_like, 75open, 59open channel flow, 139operatori dodjeljivanja, 20or, 20otvoreni vodotok, 139
Parcijalne diferencijalne jednadbe, 153Particle Swarm Optimization, 183partition, 14pdb, 67, 69perimetar, 139pip, 4plot, 89pop, 15print, 23printf, 23prozirnost, 105PSO, 183PuLP, 168PyDev, 5
quad, 132
range, 15ravel, 81raw_input, 24read, 60readline, 60readlines, 60regresija, 121rekurzija, 40rekurzivne funkcije, 40relacijski operatori, 19remove, 15rename, 62replace, 13reshape, 81resize, 82return, 36reverse, 15rfind, 13rindex, 13rjust, 14rpartition, 14rsplit, 14rstrip, 14
Runge-Kutta metode, 137
S krivulje, 145savetxt, 84secant, 114seek, 61set, 18setuptools, 4shape, 79show, 89shutil, 62simboli, 8simps, 132Simpsonova pravila, 131Simpsonove formule, 131simulated annealing, 179simulirano kaljenje, 179size, 79skupovi, 18solve, 85sort, 15spines, 96spline interpolacija, 117split, 14splitlines, 14Spyder, 5squeeze, 81stacionarno strujanje, 139, 140startswith, 13strip, 14subplot, 99sustav linearnih jednadbi, 125swapcase, 14
tail, 197tell, 61time, 64Timer, 65title, 14, 98translate, 13trapezna formula, 129trapz, 129trim_zeros, 82type, 12
ugnjedena definicija funkcije, 39uniformno strujanje, 139, 142unique, 82upper, 14
vektor slobodnih clanova, 85Vrijeme izvravanja, 64
while, 30write, 59writelines, 59
xlabel, 94xlim, 94xticks, 95
ylabel, 94ylim, 94yticks, 95
zeros, 75zeros_like, 75zfill, 14zip, 32
A C R O N Y M S
DRY Dont Repeat Yourself
API Application Programming Interface
UML Unified Modeling Language
xiii
Dio I
O S N O V E P Y T H O N A
Python je skriptni programski jezik opce namjene.
1U V O DZato Python? Postoje mnogi razlozi zato odabrati Python kao inenjerskialat
? Odlican za pocetnike a istodobno mocan za strucnjake
? Skalabilan, pogodan za velike projekte, kao i one male
? Omogucuje brz razvoj
? Cross-platform, omogucuje razvoj i izvravanje koda na gotovo svimplatformama i arhitekturama
? Ugradiv u kodove pisane u drugim programskim jezicima
? Proiriv sa drugim programskim jezicima
? Objektno orjentiran
? Uredna i elegantna sintaksa
? Stabilan
? Bogatstvo dostupnih paketa i biblioteka
? Specijelizirani paketi za numeriku, statistiku, obradu podataka i vizu-alizacije
? Otvoreni besplatni kod koji odrava velika zajednica programera iznanstvenika
1.1 instalacija
1.1.1 Instalacija na Linux platformi
Gotovo sve Linux distribucije sade Python pakete u osnovnim repozitori-jima, ali i vcina distribucija ima inicijalno instaliran Python.
Na openSUSE distribuciji, Python se moe instalirati jednostavnom nared-bom:sudo zypper in python
Nakon instalacije Pythona, moemo provjeriti koja je putanja python izvrnedatotekeuser@machine:~> type python
python is /usr/bin/python
1.1.2 Instalacija na Windows platformi
Za instalaciju Pythona na Windows platformi potrebno je preuzeti instalacij-sku datoteku sa http://www.python.org. Nakon preuzimanja, pokretanjem insta-lacijske datoteke zapocinje isntalacijki program koji omogucuje uredivanjepostavki Python instalacije.
Uobicajena je instalacija Pythona zajedno sa dodatnim paketima, na Win-dows platformi, preko neke od dostupnih Python distribucija (vidi poglavlje1.2.2.1).
3
4 uvod
1.2 dodatni paketi
Velika snaga Pythona je dostupnost velikog broja paketa raznih namjena. Zainenjerske potrebe, potrebni su dodatni paketi koji omogucavaju matricniracun, numericke metode, statisticku obradu podataka, vizualizacije, izraduanimacija i druge specijalizirane mogucnosti.
Osnovni paketi, koji ce biti koriteni 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 Pythonpaketima. Najpoznatiji su easy_install, koji dolazi sa vecinom Python dis-tribucija te pip. pip se moe instalirati pomocu 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 Dodatni paketi na Windows platformi
1.2.2.1 Python distribucije
Python distribucije su objedinjane instalacije pythona, raznih dodatnih pa-keta te cesto i tekstualnih editora ili razvoijnih okruenja. Distribucije suvecinom ciljane za Windows platformu zbog neprakticne viestruke instala-cije 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 pomocu upravitelja paketa
Python upravitelji paketa omogucuju jednostavno instalaciju, osvjeavanjeili deinstalaciju raznih Python paketa. Iako upravitelji paketa nisu dio Pyt-hona, cesto 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 okruenja 5
Primjer instalacije paketa pomocu 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 okruenja
Python koristi pokrece kod iz obicnih tekstualnih datoteka koje je moguceuredivati u mnogim tekstualnim editorima.
Razvojna okruenja (eng. Integrated Development Environment, IDE), osimto omogucavaju uredivanje koda, sadre niza alata za laki i bri razvoj kaoto su jednostavno pokretanje koda iz IDE-a, debug-iranje koda, pracenjeispisa i dr.
1.3.1 Spyder
Spyder (http://code.google.com/p/spyderlib/) je interaktivno razvojno okruenje zaPython namjenjeno za znastvenu i inenjersku primjenu. Spyder je dostupanza vecinu platformi.
Slika 1.1: Spyder razvojno okruenje
1.3.2 PyDev
PyDev (http://pydev.org/) je dodatak za Eclipse (http://www.eclipse.org/) razvojnosucelje koji nudi mogucnosti za rad sa Pythonom.
6 uvod
1.3.3 Kate
Kate (http://kate-editor.org/) je mocan tekstualni editor, iako radi i na Windowsplatformi, primarno je namjenjen za Linux platformu.
Na openSUSE-u, Kate se moe instalirati naredbom:
user@machine:~> sudo zypper in kate
Slika 1.2: Kate tekstualni editor
2P Y T H O N L J U S K A I . P Y S K R I P T EPython je interpretirani jezik, a jednostavni Python izrazi mogu se izvoditiu interaktivnom programskom okruenju pod nazivom ljuska.
2.1 pokretanje pythona
Najjednostavniji nacin za otvaranje Python ljuske (eng. shell) na Windowsplatformi je pokrenuti IDLE, dok je ne Linux platformi dovoljno pokrenutiPython naredbu u terminalu/konzoli. Nakon pokretanja Pythona prikazujuse osnovne informacije o Pythonu (verzija) te tzv. prompt koji je simboliziransa 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 izvrava uneene naredbe nakon pritiska na tipkuEnter (Return). Najjednostavniji Python izrazi su matematicke operacije po-mocu kojih moemo koristiti Python ljusku kao kalkulator. Izracun te ispisrezultata matematickih izrazi deava se u novom retku terminala ili IDLE-a:
>>> 1+1
2
>>>
Matematicke operacije, naravno, moemo medusobno kombinirati i pri tomekoristiti zagrade za definiranja redoslijeda operacija. Oprez! Prilikom
dijeljenja cijelihbrojeva rezultat jecijeli broj! Koddecimalnih brojevaobavezno koristitidecimalnu tocku.
>>> 1/5
0
>>> 1./5.
0.2
>>> 1./(5.+2)
0.14285714285714285
>>>
Ljuska moe raditi i bazicne 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 sadre Pythonkod. Izvravanje .py skripte, zapravo, se pokrece linija po linija kao da se jeunosi u Python ljusku. Ovo je ocita prednost, pogotovo prilikom pokretanjavie od nekoliko naredbi.
Datoteke sa ekstenzijom .py, osim kao skripte, koriste se i za definiranjevlastitih modula to je detaljnije opisano u poglavlju 2.4.
7
8 python ljuska i .py skripte
Osnovni nacin pokretanja python skripte je pokretanje Pythona sa specifi-ciranim .py fajlom:
user@machine:~$ python imeskripte.py
Python ce se pokrenuti i izvriti kod zapisan u skripti.Nakon zavretkaizvodenja skriptepomocu python
skripta.py Pythonse gasi!
Ako je prva linija skripte:
1 #!/usr/bin/python
tada se na Unix sustavima moe izvravati u terminalu. Za pokretanje skripteu terminalu nuno je da skripta koristi Unix oznaku za kraj reda te da imadozvole za izvravanje:
user@machine:~$ chmod +x imeskripte.py
Ako je .py datoteka izvrna, tada se moe direktno izvravati:
user@machine:~$ ./imeskripte.py
Na Windows sustavima datoteke s ekstenzijom *.py su kod intalacije Pyt-hona pridruene programu python.exe. Python skripta se pokrece dvostru-kim lijevim klikom mia na skriptu.
2.3.1 Upotreba posebnih znakova
Da bi se koristilo posebne znakove (npr. slova sa kvacicama ili simboli) ustringovima, potrebno je u prvoj ili drugoj liniji skripte upisati poseban ko-mentar:
# -*- coding: utf-8 -*-
Izvorni kod 2.1: Podrka za posebne znakove u Python skriptama
1 #!/usr/bin/python
2 # -*- coding: utf-8 -*-
3
4 print Sada moemo koristi slova sa kvacicama!
5 print Ali i razne simbole kao to su & $
2.4 moduli
Modul je Python objekt, definiran u odredenoj datoteci, koji sadri defini-cije varijabli, funkcija i klasa. Obicno su varijable, funkcije i klase odredenogmodula specijalizirane namjene, pa se module moe interpretirati kao gru-piranje koda i najcece je taj kod slicne namjene.
Npr. modul math (obraden u poglavlju 12.2) sadri varijable pi i e kojepredstavljaju matematicke konstante te niz matematickih funkcija kao tosu sqrt, log, pow, exp, sin, cos itd.
Da bi se objekti odredenog modula mogli koristiti u kodu, potrebno jeucitati (importirati) modul ili ucitati odredeni objekt iz modula.
Ucitavanje modula vri se pomocu naredbe import cija je osnovna sin-taksa
import module_name
gdje je module_name ime modula.Nakon to je modul ucitan, moe se koristiti objekte modula (varijable,
funkcija i klase) tako da se unese ime modula, tocka te ime objekta koji seeli koristiti.
Jednom naredbom import moe se ucitati vie modula na slijedeci nacin:
2.4 moduli 9
import module1, modul2, modul3
Ucitanom modulu se moe dodijeliti novo ime. To se moe napraviti po-mocu kljucne rijeci as:
import module_name as new_name
nakon cega se modul moe koristiti pomocu novog imena.Moduli cesto sadravaju velik broj objekata, a njihovim ucitavanjem bes-
potrebno se troe memorijski i procesorski resursi. Kako bi se izbjeglo ucita-vanje cijelog modula, moguce je iz odredenog modula ucitati samo odredeneobjekte:
from module_name import object_name
Ako se direktno ucita objekte iz modula, tada ih se koristiti samo prekoimena objekta. Kao i sam modul, moguce je ucitati objekt nekog modulapod novim imenom:
from module_name import object_name as object_new_name
Za ucitavanje svih objekata odredenog modula koristi se:
from module_name import *
Izvorni kod 2.2: Koritenje objekata modula
1 #!/usr/bin/python
2
3 # importiraj sys modula
4 import sys
5 print sys.platform # ispisi platformu (operaticni sustav)
6 print sys.version # ispisi verziju Pythona
7
8 # importiraj modul math kao m
9 import math as m
10 print m.pi # ispisi vrijednost broja pi
11 print m.sin(m.pi/2.0) # ispisi vrijednost sinusa kuta pi/2
12
13 # iz modula datetime importiraj objekt date
14 from datetime import date
15 print date.today() # ispisi danasnji datum
16
17 # iz modula random importiraj funkciju random kao nasumicni
18 from random import random as nasumicni
19 print nasumicni() # ispisi nasumicni broj
20
21 # Importiraj sve objekte iz modula string
22 from string import *23 print uppercase # ispis svih velikih slova
24 print lowercase # ispis svih velikih slova
25 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
3T I P O V I P O D ATA K AVarijable se ne moraju explicitno deklarirati. Naime, deklaracija se deavaprilikom pridruivanja vrijednosti varijabli. Odnosno, varijable se pridru-uju memorijskim lokacijama na kojima je zapisana vrijednost. Znak jedna-kosti = se koristi za pridruivanje vrijednosti varijablama. Na primjer:
1 #!/usr/bin/python
2
3 brojac = 100 # Integer
4 duljina = 1000.0 # Float
5 ime = Hrvoje # String
6
7 print brojac
8 print duljina
9 print ime
Ovdje su 100, 1000.0 i Hrvoje vrijednosti pridruene varijablama brojac,duljina i ime. Program ce producirati sljedeci rezultat:
100
1000.0
Hrvoje
Moguce je pridruiti jednu vrijednost u vie varijabli. Tada sve varijablegledaju na istu memorijsku lokaciju. Odnosno:
1 #!/usr/bin/python
2 a = b = c = 1
3 c = 5
4 print a
to rezultira
1
Varijable a, b ic gledaju na istu lokaciju u memoriji u kojoj pie 1. Brojevi suimutable varijable odnosno nepromjenjive pa kada promijenimo c=5 Pythonpreusmjerava varijablu c na novu lokaciju u memoriji na kojoj pie broj 5,a varijable a, b i dalje gledaju na isto mjesto kao i prije. Takoder je mogucepridruiti vie vrijednosti u vie varijabli.
1 #!/usr/bin/python
2 a, b, c = 1, 2, Hrvoje
Varijablama a i b se pridruuju memorijske lokacije na kojima su zapisanevrijednosi 1 i 2, dok je varijabli c pridruena memorijska lokacija na kojoj jezapisana vrijednost Hrvoje.
Varijable te njihov memorijski prostor moguce 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 podrava pet osnovnih tipova podataka;
? Numbers
? String
? List
? Tuple
? Dictionary
Tip podataka odredene varijable moe 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 vrijed-nosti rezultira novim alociranim objektom. Numericki tip podatka se kreirapridruivanjem vrijednosti varijabli. Odnosno
1 #!/usr/bin/python
2 var1 = 1
3 var2 = 10
Takoder je moguce pobrisati referencu na numericki objekt koristeci delnaredbu. Sintaksa izgleda ovako:
del var1[,var2[,var3[....,varN]]]]
Primjer:
1 #!/usr/bin/python
2 del var
3 del var_a, var_b
Python podrava cetiri numericka tipa
? int
? long
? float
? complex
Nekoliko primjera oznacavanja numerickih podataka ja prikazana u Tablici3.1.
Moguce je koristiti i malo slovo L za oznaku long, iako se takvo oznaca-vanje ne preporuca zbog velike slicnosti sa brojem 1.
3.2 string 13
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
Tablica 3.1: Primjeri oznacavanja brojeva
3.2 string
Iako je mogucedefinirati string sajednostrukim idvostrukimnavodnicima,preporuka je da sekoriste jednostrukinavodnici.
Stringovi su definirani kao slijed znakova izmedu navodnika, jednostrukih(apostrofi) ili dvostrukih. Jednom zadane stringove je nemoguce mijenjati jersu stringovi, u Pythonu, nepromjenjivi (imutable) tip podatka. Niz funkcijakoje rade promjene nad string varijabama zapravo kreiraju kopije izvornestring varijable.
Dijelove stringova (znakove ili niz znakova - string) je moguce dohvatitioperatorima [] i [:] sa indeksima koji pocinju od 0 na pocetku stringa svedo -1 na kraju.
Znak plus (+) oznacava spajanje (concatenation), a asterisk () je operatorponavljanja. Odnosno:
1 #!/usr/bin/python
2
3 str = Hello World! # zadavanje sa jednostrukim navodnicima
4 ime = "Rudi" # zadavanje sa dvostrukim navodnicima
5
6 print str, ime # print cijelog stringa
7 print str[0] # print prvog znaka u stringu
8 print str[2:5] # print od treceg do petog znaka
9 print str[2:] # print znakova od treceg do zadnjeg
10 print str * 2 # print stringa dva puta
11 print str + TEST # print concatenated string
to ce rezultirati
Hello World! Rudi
H
llo
llo World!
Hello World!Hello World!
Hello World!TEST
Nad stringovima je moguce izvoditi niz specijaliziranih operacija pomocufunkcija koje su dostupne za varijable tipa string.
Funkcije za pretraivanje 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])
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 pocetnih i krajnjih znakova:
lstrip([chars])
rstrip([chars])
strip([chars])
Funkcije za encoding stringova:
decode([encoding[, errors]])
encode([encoding[,errors]])
3.3 liste
Lista sadri podatke odvojene zarezima i omedene uglatim zagradama. Iakoje slicna listama u C jeziku, podaci python liste mogu biti razlicitog tipa.Kao i kod stringova, pristupanje vrijednostima u listi je moguce pomocuoperatora [ ] i [ : ] sa indeksima koji pocinju od 0 na pocetku stringa svedo -1 na kraju. Znak plus (+) se koristi za operator spajanja (concatenation)stirngova, a asterisk () je operator ponavljanjaIako lista moe biti
heterogena(sadravati razlicite
tipove podataka),preporuka je koristiti
listu kao spremnikhomogenih podataka.
Za heterogenepodatke se preporucatuple (poglavlje 3.4)
1 #!/usr/bin/python
2
3 list = [ abcd, 786 , 2.23, hrvoje, 70.2 ]
4 tinylist = [123, hrvoje]
5
6 print list # print cijele liste
7 print list[0] # print prvog elementa liste
8 print list[1:3] # print od drugog do treceg elementa liste
9 print list[2:] # print od treceg do zadnjeg elementa
10 print tinylist * 2 # print liste dva puta
11 print list + tinylist # print concatenated lists
to ce rezultirati
3.3 liste 15
[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 cesto se koristi naredba len za provjeru brojaelemenata liste, naredbom insert se umece novi element u listu te naredbadel kojom se briu pojedini elementi iz liste.
1 #/user/bin/python
2
3 list = [2,3,4,5]
4 print(len(list)) #broj elemnata u listi
5 print list
6 list.insert(0,1) #umetanje elementa 1 u listu na prvu poziciju
7 print list
8 del list[-1] #brisnje zadnjeg elementa iz liste
9 print list
4
[2, 3, 4, 5]
[1, 2, 3, 4, 5]
[1, 2, 3, 4]
Naredbom range moguce je stvoriti listu brojeva u aritmetickom nizu toje cesto potrebno kod koritenja for petlje (poglavlje 7.1). Sintaksa naredberange je
range(stop),
range(start, stop),
range(start, stop, step),
gdje je start prvi element, stop je gornja granica i step je korak aritmetic-kog niza.
1 #/user/bin/python
2
3 list=range(7) # aritmeticki niz 0,..,6
4 print list
5 list = range(2,7) # aritmeticki niz 2,..,6
6 print list
7 list = range(0,7,2) # aritmeticki niz s korakom 2
8 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 pozicijui a extend proiruje postojecu listu sa listom L.
Naredbe za brisanje elemenata iz liste su:
remove(x)
pop(i)
del L[index]
remove brie prvi element koji ima vrijednost x a pop brie element na pozi-ciji i. Naredba del L[index] brie element list L na indeksu index.
Osim funkcija za brisanje i dodavanje elemenata, Python liste imaju jougradenih prakticnih funkcija. index vraca indeks prvog elementa koji ima
16 tipovi podataka
vrijednost x, count prebrojava sve elemente koji su jednaki x, sort sortiraelemente liste a reverse rasporeduje elemente u obrnutom redosljedu odinicijalnog.index(x)
count(x)
sort()
reverse()
Izvorni kod 3.1: Dodavanje i brisanje elemenata liste
1 ljudi = [Marko, Mirela, Luka]
2 nadljudi = [Chuck,Arnold,Steven,Silvester]
3
4 ljudi.append(Igor)
5 print ljudi
6 nadljudi.insert(1,Anita)
7 print ljudi
8 nadljudi.extend(ljudi)
9 print nadljudi
10
11 nadljudi.pop(1)
12 print nadljudi
13 nadljudi.remove(Igor)
14 print nadljudi
15 del nadljudi[4:]
16 print nadljudi
17
18 print ljudi.index(Marko)
19 ljudi.append(Marko)
20 print ljudi.count(Marko)
21
22 nadljudi.sort()
23 print nadljudi
24 nadljudi.reverse()
25 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 slican listi. Sastoji se od vrijednosti odvojenih zarezomi za razliku od listi omeden zagradama (). Python doputa fleksibilnostizostavljanja zagrada prilikom definiranja tuplea.
Postoji mnogo slicnosti sa listama, ali i nekoliko temeljnih razlika:
? pristupanje elementima liste i tuplea vri se na identican nacin (prekoindeksa)
? i list i tuple su iterabilni
? lista moe mijenjati broj elemenata i vrijednosti elemenata, dok tuplene moe
3.5 dictionary 17
? nad tupleom se ne mogu provoditi operacije koje mjenjaju sam tuple(sort, remove i sl.)
1 #!/usr/bin/python
2
3 tuple = ( abcd, 786 , 2.23, hrvoje, 70.2 )
4 tinytuple = (123, hrvoje)
5
6 print tuple # print liste
7 print tuple[0] # prints prvog elementa liste
8 print tuple[1:3] # print od drugog do treceg elementa liste
9 print tuple[2:] # print od treceg do zadnjeg elementa
10 print tinytuple * 2 # print liste dva puta
11 print tuple + tinytuple # print liste nastale spajanjem dvije liste
12
13 istotuple = 2, True, teskt # Zadavanje tuplea bez zagrada
14 print istotuple
to ce 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)
Sljedeci kod ce producirati greku u liniji 5, jer smo pokuali promijenitivrijednost u tupleu
1 #!/usr/bin/python
2
3 tuple = ( abcd, 786 , 2.23, hrvoje, 70.2 )
4 list = [ abcd, 786 , 2.23, hrvoje, 70.2 ]
5 tuple[2] = 1000 # greska
6 list[2] = 1000 # ok
Tuple se vrlo cesto koristi za viestruko dodjeljivanje:
>>> a, b, c = 3, 10, neki tekst
>>> print a
3
>>> print b
10
>>> print c
neki tekst
to se cesto koristi prilikom vracanja vie vrijednosti iz funkcije (poglavlje8.2)
3.5 dictionary
Dictionary moemo smatrati jednostavnim pridruivanjem odnosno presli-kavanjem svih elemenata jednog skupa elementima drugog skupa.
1 #!/usr/bin/python
2
3 dict = {}
4 dict[jedan] = Ovo je jedan
5 dict[2] = Ovo je dva
6
7 tinydict = {ime: hrvoje,code:6734, odjel: admin}
8
9 print dict[jedan] # print vrijednosti jedan
10 print dict[2] # print vrijednosti za 2
11 print tinydict # print cijelog dictionary
18 tipovi podataka
12 print tinydict.keys() # print svih kljuceva
13 print tinydict.values() # print svih vrijednosti
to ce 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])
4O P E R AT O R IOperatori su osnovni dio Pythona i omogucuju operacije na varijablama(operandima). Najcece se povezuju sa algebarskim matematickim operaci-jama, medutim operatori mogu biti i ne matematicke naravi.
Python operatore moemo podjeliti prema namjeni:
? Aritmeticki operatori
? Relacijski operatori ili operatori usporedivanja
? Operatori dodjeljivanja
? Logicki operatori
? Bitovni operatori
? Clanski operatori
? Operatori identiteta
ili s obzirom na broj operanada:
? Unarni operatori (jedan operand)
? Binarni operatori (dva operanada)
4.1 aritmeticki operatori
Aritmeticki operatori omogucuju osnovne matematicke operacije na broje-vima. Rezultat aritmetickog operatora je uvijek broj tj. varijabla tipa floatili int, ovisno o tipovima operanada. Bitno je napomenuti da je tip rezultataaritmetickih operacija uvijek vieg tipa operanada.
Operator Opis Primjer za x=9.0 i y=2.0
+ Zbrajanje x+y daje 11
- Oduzimanje x-y daje 7
* Mnoenje 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: Aritmeticki operatori
4.2 relacijski operatori ili operatori usporeivanja)
Relacijski operatori omogucavaju usporedivanje vrrijednosti varijabli. Rezul-tat relacijskih operatora je varijabla tipa bool i moe 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, razlicitost x!=y daje True
Nejednakost, razlicitost xy daje True
> Vece x>y daje True
>= Vece ili jednako x>=y daje True
< Manje x
4.5 clanski operatori 21
a b a and b a or b not b
True True True True False
True False False True True
False True False True
False False False False
Tablica 4.4: Logicki operatori
5 c = 15
6
7 d = a < b
8 print d
9
10 e = a > b and c > b
11 print e
12
13 f = a > c or not b > c
14 print f
False
True
True
4.5 clanski operatori
Clanski opratori slue za odredivanje pripadnosti odredenoj listi. Osnovniclanski operator je operator in, i moe se proiriti sa logickim operatoromnot te rvot oprator not in. Rezultat clanskih opratora je bool varijabla kojadaje saznanje da li zadani element pripada listi ili ne pripada list.
>>> a = [1, 2, 3, 8, 6]
>>> 2 in a
True
>>> 3 not in a
False
>>> 5 not in a
True
4.6 operatori identiteta
Operatori identita usporeduju da li su Python objekti zapisani na istommjestu u memoriji. Postoji operator is i is not koji usporeduju id Pythonobjekta. id Python objekta se moe 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
5O 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 A5.1 print
Iz Python koda moguce je ispisivati poruke u konzolu pomocu naredbeprint. Osnovna sintaksa za ispisivanje je
print variable
gdje je variable ima varijable ciju vrijednost se eli ispisati.Moguce je ispisivati vrijednosti vie varijabli:
print variable1, variable2
Naprednije mogucnosti ispisa moguce je kontrolirati pomocu ubacivanjavrijednosti varijabli u string pomocu printf formata. Simbolom % i pripada-jucim znakom za tip podatka moe se u stringu odreduju pozicije na kojese eli ubaciti vrijednosti varijabli, a nakon stringa i simbola % slijede imenasamih 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 najma-nje 10 znakova
Tablica 5.1: printf formatiranje
Vie o oblikovanju stringova pomocu operatora % opisano je u poglavlju10.1.
Izvorni kod 5.1: Razliciti primjeri ispisa
1 print Ispisi ovo na ekranu!
2 print Ispisi + jos + ovo.
3
4 a=12
5 type(a)
6 print a
7 print a=, a
8 print a= + str(12)
9 print Ovo je a:%d % (a)
10 print Ovo je a:%.2d % (a)
11
12 b=15.365982
13 type(b)
14 print Ovo je b:,b
15 print Ovo je b:+str(b)
23
24 osnovne naredbe za unos i ispis podataka
16 print Ovo je b:%f % (b)
17 print Ovo je b:%.2f % (b)
18 print Ovo je b:%10.3f % (b)
19
20 print ovo je a: %d a ovo je b: %f % (a,b)
21
22 print a = {broj_a}, b = {broj_b}.format(broj_a = a, broj_b = b)
23 print a = {broj_a}, b = {broj_b:.2f}.format(broj_a = a, broj_b = b)
24 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
6U V J E T N A G R A N A N J AOdredene naredbe ili djelove koda moguce je izvravati ili preskociti ovisnoo vrijednosti postavljenog logickog uvjeta.
6.1 if
Logikiuvjet
NaredbeAko je uvjetzadovoljen
Ako uvijet nije zadovoljen
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 izvravanje naredbe command (ili vie naredbi) natemelju logickog uvjeta condition. Zadane naredbe ce se izvriti samo akoje logicki uvijet zadovoljen.
Izvorni kod 6.1: Jednostavan primjer upotrebe if naredbe
1 #!/usr/bin/python
2
3 a = input("a: ")
4 if a < 0: a = -a
5 print a
Pokretanjem Izvornog koda 6.1 i utipkavanjem pozitivnog broja ispie seutipkani broj:user@machine:~> python if_01.py
a: 5
5
Medutim, utipkavanjem negativnog broja zadovoljava se postavljeni logickiuvjet i izvri se operacija a = -a te se potom ispie pozitivna vrijednostutipkanog broja:user@machine:~> python if_01.py
a: -11
11
U slucaju kad postoji vie naredbi uvjetovanih istim logickim uvjetom,naredbe moemo objediniti pod jednim uvjetom te ih odvojiti sa tocka-zarezom (;). Ako su uvjetovane naredbe kompleksne ili ih ima vie, naredbepiemo u uvucenim recima nakon if naredbe. Sve uvucene naredbe do pr-vog retka koji je poravnat sa if naredbom su uvjetovane.
25
26 uvjetna grananja
Izvorni kod 6.2: Pisanje sloenijeg uvjetovanog grananja
1 #!/usr/bin/python
2
3 a = 0
4 b = input("b: ")
5 c = input("c: ")
6
7 if b < 0: a = 1; b = -b
8 print a, b
9
10 if c < b:
11 a = 2
12 b = c - b
13 c = c +1
14 a = b + c
15 print a, b, c
user@machine:~> python if_02.py
b: -6
c: 4
1 6
3 -2 5
6.2 else
Ova naredba omogucuje sloeniji oblik grananja od naredbe if. Naredbaima dvije grane koje se mogu izvriti u ovisnosti o uvjetu. Svaka grana/mo-gucnost omogucuje izvravanje pripadajucih naredbi (Slika 6.2).
Logikiuvjet
Naredbe B
Ako je uvjetzadovoljen
Ako uvijet nije zadovoljen
Naredbe A
Slika 6.2: if-else dijagram toka
else naredba koristi se u paru sa if i slui za grananje u slucaju da uvjetnije zadovoljen.
Sintaksa naredbe je:
if condition : command1
else: command2
Izvorni kod 6.3: Primjer upotrebe else naredbe
1 #!/usr/bin/python
2
3 a = input("a: ")
4 b = input("b: ")
5
6 if a < b:
7 b = a
6.3 elif 27
8 a = 0
9 else:
10 a = b
11 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 logickim uvjetima (Slika 6.3) sluinaredba elif. Iako se sa ugnjedenim grananjem moe postici isti rezultat,elif omogucuje jednostavnije i preglednije grananje algoritma.
Naredba elif omogucuje grananje u alogritmu samo ako prethodni uvjeti(if ili elif) nisu zadovoljeni. Treba napomenuti da se u slucaju koritenjaif-elif-else grananja uvijek izvri samo jedan set uvjetovanih naredbi.
Iz same definicije dodatnog uvjetnog grananja, naredba elif uvijek do-lazi u kombinaciji sa naredbom if, te se upotrebljava u sljedecoj osnovnojsintaksi
if condition1 : command1
elif condition2 : command2
Kao ni u slucaju upotrebe else naredbe dodatno grananje se mora napi-sati u novom retku. Uobicajeno je da se naredbe koje slijede nakon uvjetapiu u novom uvucenom retku.
Proirena upotreba ukljucuje kombinaciju vie elif naredbi:
if condition1 : command1
elif condition2 : command2
elif condition3 : command3
Grananje se moe 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 koristecinavedene naredbe.
Izvorni kod 6.4: Primjer kombinacije naredbi if, elif i else
1 #!/usr/bin/python
2
3 a = input("a: ")
4
5 if a < 0:
6 print a je negativan
7 elif a > 0:
8 print a je pozitivan
9 else:
10 print a je nula
28 uvjetna grananja
Logikiuvjet A
Naredbe B
Ako je uvjetzadovoljen
Ako uvijet nije zadovoljen
Naredbe A
Logikiuvjet B
Ako je uvjetzadovoljen
Naredbe C
Ako uvijet nije zadovoljen
Logikiuvjet C
Ako je uvjetzadovoljen
Naredbe D
Ako uvijet nije zadovoljen
Slika 6.3: Dijagram toka za sloeni uvjet grananja
Unosom pozitivnog broja izvrava se naredba koja je uvjetovana uvjetompod elif naredbom:
user@machine:~> python if_elif_else_01.py
a: 33
a je pozitivan
7P E T L J E7.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 izvravaju se jednom za svaki element iz niza list.Objekt iter je iterator koji pokazuje na elemente niza list. Za razliku odjezika C, C++ iter se ne brie nakon to for naredba zavri.
Izvorni kod 7.1: Upotreba for naredbe
1 #!/usr/bin/python
2 for num in range(2, 5):
3 print(num)
4
5 print(num)
2
3
4
4
Izvorni kod 7.2: Naredba for s listom stringova
1 #!/usr/bin/python
2 text=[ide,patka,preko,save]
3 for r in text:
4 print(r)
ide
patka
preko
save
Izvorni kod 7.3: Naredba for i stirng
1 #!/usr/bin/python
2 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 moe se doci koritenjem naredbi len i
range (poglavlje ??) kao to se moe vidjeti na primjeru Izvornog koda 7.4:
Izvorni kod 7.4: Naredba for s listom stringova
1 #!/usr/bin/python
2 text=[ide,patka,preko,save]
3 for i in range(len(text)):
4 print i, text[i]
29
30 petlje
0 ide
1 patka
2 preko
3 save
7.2 while
Osnovne sintaksa naredbe while jewhile conditon : commands
Naredbe commands izvravaju se dokle god je uvjet condition istinit.
Logikiuvjet
Ako je uvjetzadovoljen
Ako uvijet nije zadovoljen
Naredbe
Slika 7.1: Dijagram toka while petlje
Izvorni kod 7.5: Upotreba while naredbe
1 #!/usr/bin/python
2 i=0
3 while i*i
7.4 continue 31
Logikiuvjet
Ako je uvjetzadovoljen
Ako uvijet nije zadovoljen
Naredbe
Break
"else" naredbe
Slika 7.2: Dijagram toka while petlje sa else blokom
0
1
2
Kraj
Naredbom break se zavrava for ili while naredba. Na primjeru Izvornogkoda 7.7 moe se vidjeti da se nakon break naredbe ne izvri dio koda nakonelse naredbe.
Izvorni kod 7.7: Upotreba break naredbe
1 #!/usr/bin/python
2 i=0
3 while i*i
32 petlje
Izvorni kod 7.8: Upotreba continue naredbe
1 #!/usr/bin/python
2 for num in range(2, 5):
3 if num==3:continue
4 print(num)
2
4
7.5 paraleleno iteriranje
Naredbom zip moguce je elemente vie listi pohraniti u jednu listu kojasadri tupleove pripadajucih elemenata. Takva mogucnost restrukturiranjapodataka vrlo je korisna kod potrebe za istovremenim iteriranjem kroz vielisti (Izvorni kod 7.9).
Izvorni kod 7.9: Upotreba zip naredbe
1 #!/usr/bin/python
2 # -*- coding: utf-8 -*-
3
4 imena = [Vlatko, Ivana, Darko, Igor]
5 prezimena = [Hoorvat, Bali, Copljar, Worry]
6
7 osobe = zip(imena, prezimena)
8 print osobe
9
10 for o in osobe:
11 print o
12
13 for i, p in osobe:
14 print i, p
[(Vlatko, Hoorvat), (Ivana, Bali), (Darko, Copljar), (Igor, Worry)]
(Vlatko, Hoorvat)
(Ivana, Bali)
(Darko, Copljar)
(Igor, Worry)
Vlatko Hoorvat
Ivana Bali
Darko Copljar
Igor Worry
Ukoliko liste ne sadre jednak broj elemenata, formira se lista jednakeduljine kao i najkraca lista dana kao argument u ttt naredbi.>>> a = [1, 2, 3, 4, 5]
>>> b = [a, b, c]
>>> print zip(a, b)
[(1, a), (2, b), (3, c)]
Broj argumenta funkcije zip moe biti i vie od dva a rezultat je analogankoritenju funkcije zip sa dva argumenta (Izvorni kod 7.10).
Izvorni kod 7.10: Upotreba zip naredbe sa vie lista.
1 #!/usr/bin/python
2 # -*- coding: utf-8 -*-
3
4 imena = [Vlatko, Ivana, Darko, Igor]
5 prezimena = [Hoorvat, Bali, Copljar, Worry]
6 visine = [1.79, 1.86, 2.10, 2.03]
7
8 for i, p, v in zip(imena, prezimena, visine):
9 print %s %s (%.2f m) % (i, p, v)
7.6 numeriranje liste 33
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 omogucuje numeraciju elemenata liste na nacin da kre-ira iterabilni enumerate objekt koja sadri tuplove elemenata izvorne liste tenjihve indekse. Dodatno, enumerate moe primiti argument koji ukazuje odkojeg broj pocinje numeracija.
Izvorni kod 7.11: Numeriranje elemenata liste pomocu enumerate.
1 #!/usr/bin/python
2 # -*- coding: utf-8 -*-
3
4 X = [12.3, 18.6, 2.1, 12.3]
5
6 print Iteriranje pomocu enumerate:
7 for x in enumerate(X):
8 print x
9
10 print Kreni od 0:
11 for i, x in enumerate(X):
12 print a[%d]: %f % (i, x)
13
14 print Kreni od 1:
15 for i, x in enumerate(X, 1):
16 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
8F U N K C I J EFunkcije su grupirani dio koda koji izvodi odredeni zadatak. Prednosti upo-trebe funkcija su:
? Smanjenje ponavljanja istog koda
? Povecavanje modularnosti koda - raclanjivanje sloenog koda na jed-nostavnije djelove
? Povecanje citkosti koda.
Rad sa funkcijama u Pythonu omogucuje veliku fleksibilnost. Funkcijemogu biti dodijeljene varijablama, spremljene u listama i prosljedivane kaoargumenti 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
Kljucna rijec def omogucuje definiranje funkije. Najjednostavnija sintaksakoja omogucuje definiranje funkcije je:
def functionname():
commands
gdje je functionname odabrano ime funkcije a commnds je naredba ili vie na-redbi koje funkcija izvrava. Prethodno definiranu funkciju moemo izvriti Poziv funkcije uvijek
mora biti nakondefinicije funkcije. Nemoe se pozvatifunkcija kojaprethodno nijedefinirana.
pozivom te funkcije. Funkcija se poziva pomocu imena funkcije nakon kojegslijede zagrade.
Izvorni kod 8.1: Definicija i pozivanje jednostavne funkcije
1 #!/usr/bin/python
2
3 def pozdrav():
4 print Pozdrav!
5
6 pozdrav()
Pozdrav!
Funkciju je moguce proiriti na nacin da prima jedan ili vie argumenata.Argumenti se definiraju pomocu imena argumenata razdvojenih zarezom uzagradama nakon imena funkcije:
def functionname(arg1, arg2, ... , argn):
commands
Funkcija sa argumentima se poziva tako da se u zagradama nakon imenafunkcije upiu vrijednosti argumenata. Argumenti se u pozivu funkcije raz-dvajaju zarezom kao i prilikom definicije funkcije.
35
36 funkcije
Izvorni kod 8.2: Definicija funkcije koja prima argument
1 #!/usr/bin/python
2
3 def pozdrav( ime ):
4 print Pozdrav, ime, !
5
6 def zbroji( a, b ):
7 c = a + b
8 print a, +, b, =, c
9
10 pozdrav(Marko)
11 zbroji(2, 5)
Pozdrav Marko !
2 + 5 = 7
8.2 vracanje vrijednosti iz funkcije
Funkcija moe vratiti vrijednost nakon poziva funkcije. Vrijednost koju funk-cija vraca doslovno zamjenjuje funkciju u kontekstu u kojem je ona pozvana,a tip vracenog podatka moe biti bilo koji Python objekt. Vracanje vrijed-nosti se definira naredbom return nakon koje se zaustavlja izvravanje funk-cije:
def functionname(arg1, arg2, ... , argn):
commands
return value
Izvorni kod 8.3: Definicija funkcije koja prima vie argumenata i vraca vrijednost
1 #!/usr/bin/python
2
3 def zbroji(a, b):
4 c = a + b
5 return c
6
7 x = zbroji(2, 6)
8 y = zbroji(x, -5)
9
10 print x, y
8 3
Funkcija moe sadravati vie return naredbi (obicno u razlicitim uvjet-nim grananjima) i svaka moe vratiti razlicit tip podatka (Izvorni kod 8.4).
Izvorni kod 8.4: Funkcija koja vraca razlicite tipove
1 #!/usr/bin/python
2
3 def luda_funkcija(a, b):
4 if(a > b):
5 return a + b
6 else:
7 return malo teksta
8
9 x = luda_funkcija(6, 2)
10 y = luda_funkcija(x, 10)
11
12 print x, y
8 malo teksta
8.3 argumenti sa zadanim vrijednostima 37
Vrlo cesto, javlja se potreba da funkcija vraca vie vrijednosti. To se moeostvariti vracanjem tuplea.
Izvorni kod 8.5: Funkcija koja vraca vie vrijednosti korsiteci tuple
1 #!/usr/bin/python
2
3 def f(a, b):
4 z = a + b
5 r = a - b
6 return z, r
7
8 x = f(6.0, 2.0)
9 print x
10
11 c, d = f(6.0, 2.0)
12 print c
13 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. Argu-menti sa zadanim vrijednostima mooraju biti definirani nakon argumenatabez zadanih vrijednosti.def functionname(arg1=val1, arg2=val2, ... , argn=valn):
commands
return value
Prilikom poziva funkcije, moguce je funkciju pozvati bez zadanih argu-menata.
Izvorni kod 8.6: Funkcija sa zadanim argumentom
1 #!/usr/bin/python
2
3 def f(a, b=0.0):
4 if(a > b):
5 return a - b
6 else:
7 return b
8
9 a = f(6.0, 2.0)
10 b = f(20.0)
11 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 moe pozivati na nacin da se, pomocu keyword argumenata,tocno specificiraju argumenti. Keyword argumenti su oni argumenti kojise, pri pozivu funkcije, zadaju imenom i vrijednocu, za razliku od non-keyword argumenata koji se zadaju samo kao vrijednost. Redosljed zadava-nja keyword argumenata moe biti proizvoljan dok kod kombinacije non-keyword i keyword argumenata prvo moraju biti specificirani non-keywordargumenti.
38 funkcije
1 # Definiranje funkcije
2 def f(x, a, b):
3 return x*(a+b)
4
5 # Poziv funkcije sa keyword argumentima
6 f(x=10, b=0, a=8)
7
8 # Poziv funkcije sa mjesovitim keyword i non-keyword argumentima
9 f(10, b=0, a=8)
Posebna sintaksa definiranja funkcije pomocu * i ** omogucuje korite-nje varijabilnog broja argumenata funkcije. Argument definiran sa jendomzvjezdicom, uobicajeno *args, obuhvaca sve non-keyword argumente u je-dan tuple. Upotrebom dvostruke zvijezdice **kwargs omogucuje pohranusvih keyword argumenata u dictionary gdje su kljucevi imena argumenata avrijednosti argumenata su pohranjene u vrijednosti pod pripadajucim klju-cem.
Izvorni kod 8.7: Funkcija sa *args i **kwargs argumentima
1 #!/usr/bin/python
2 # -*- coding: utf-8 -*-
3
4 def funkcija(*args, **kwargs):
5 print non-keyword argumenti:, args
6 print keyword argumenti:, kwargs
7
8 for key, value in kwargs.iteritems():
9 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 = TruePrilikom koritenja
oba operatora zaraspakiravanje
argumenata (* i **)vano je potivati
redoslijed. I koddefinicije funkcije ikod poziva funkcije
prvo se koristenon-keyword
argumenti a ondakeyword argumenti.
Osim prilikom definicije funkcije, sintaksa *args i **kwargs moe se ko-ristiti i pri pozivu funkcije. Zvijezdicom * se tuple vrijednosti raspakirajuu argumente funkcije. Analogno, keyword argumente definirane u dicti-onaryu moe se proslijediti funkciji pomocu dvije zvijezdice **. U izvornomkodu 8.8 prikazano je koritenje *args i **kwargs prilikom poziva funkcije.
Izvorni kod 8.8: *args i **kwargs argumenti prilikom poziva funkcije
1 #!/usr/bin/python
2 # -*- coding: utf-8 -*-
3
4 def funkcija(a, b, c, d, e):
5 print argumenti:
6 print a:, a
7 print b:, b
8 print c:, c
9 print d:, d
10 print e:, e
11
12 a = (1, 2, 3, 4, 5)
13 funkcija(*a)
14
15 kwa = {d:1, c:2, a:3, e:4, b:5}
16 funkcija(**kwa)
17
18 a = (5, 4)
19 kwa = {e:1, d:2, c:3}
8.5 ugnjedena definicija funkcije 39
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 ugnjedena definicija funkcije
Ugnjedeno definiranje funkcije (eng. closure ili nested function definition)omogucuje definiciju funkcije u funkciji. Ugnjedena definicija funkcije jemoguca u Pythonu jer su funkcije objekti te ih je moguce prosljedivati kaoargumente drugim funkcijama te vracati kao rezultat funkcije. Ugnjedenodefinirane funkcije mogu se pokazati korisne jer unutarnja funkcija moekoristiti objekte definirane u vanjskoj:
>>> def vanjska(vanjski_argument):
... def unutarnja(unutarnji_argument):
... return vanjski_argument * unutarnji_argument
... return unutarnja
...
>>> f = vanjska(5)
>>> f(3)
15
>>> f(4)
20
8.6 anonimne funkcije
Lambda funkcije su funkcije bez imena tj. anonimne funkcije. Najcece sekoriste za definiranje vrlo jednostavnih i kratkih funkcija. Definiranje ano-nimne funkcije se vri koritenjem kljucne rijeci lambda:
lambda argumenti: izraz
Upotrebu jednostavne funkcije koja vraca apsolutnu razliku dva broja
1 def diff(a, b):
2 return abs(a - b)
3
4 print diff(7, 11)
4
moe se zamjeniti lambda funkcijom:
1 >>> print (lambda a, b: abs(a - b))(7, 11)
2 4
40 funkcije
Anonimne funkcije se cesto pokriste kao argumenti drugih funkcija kojeocekuju objekt tipa funkcija kao argument.sorted funkcija ocekuje argument key kao funkciju, koja je vecini sluca-
jeva veoma jednostavna funkcija i obicno se koristi anonimna funkcija da seizbjegne posebno definiranje funkcije. U sljedecem primjeru napravljeno jesortiranje liste tupleova po drugim clanovima 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 ugnjedenim definici-jama funkcijama.
Izvorni kod 8.9: Primjer anonimne funkcije u ugnjedenoj definiciji
1 def poruka(ime):
2 return lambda poruka: ime + : + poruka
3
4 p = poruka(Mario)
5 print p(Bok!)
6 print p(Kako ste?)
Mario: Bok!
Mario: Kako ste?
8.7 rekurzivne funkcije
Do sada smo se vec susreli sa petljama i nacinom kako funkcionira iterativnipostupak kao sukcesivno povecavanje indeksa, tj. brojcanika koji sudjeluje uoperaciji koja u konacnici daje finalni rezultat. Primjer je suma uzastopnihbrojeva od 1 do 100.
1 suma = 0
2 for index in range(1,101):
3 suma = suma + index
4
5 print suma
Znaci suma se postepeno povecava dok se ne iscrpi lista, tj. sekvenca in-deksa definirana pozivom na range naredbu.
index = 1
suma = 0 + 1
index = 2
suma = 1 + 2
index = 3
suma = 3 + 3
index = 4
suma = 6 + 4
i tako dalje dok index ne postane 100. Drugim rijecima postepeno se navarijablu nadodaju brojevi.
Takoder je moguce zapisati isti postupak prema koracima kako je vrenosumiranje
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 slijedeci izraz
sumaindex = sumaindex1 + index
8.7 rekurzivne funkcije 41
. Tako zapisani izraz daje naslutiti kako je slijedeca suma zapisana kao sumaiz prethodnog koraka na koju se nadodaje vrijednost index iz trenutnogkoraka iterativne petlje. Ovakav zapis u biti je obrnuti zapis od prirodnogsukcesivnog povecavanja 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) + 1Mogucnost zapisafunkcije u obliku kojipoziva istu funkcijunazivamo rekurzija,a takvu funkcijurekurzivnafunkcija.
Tipicna rekurzivna funkcija vri poziv sama na sebe.Primjer je funkcija rsuma :
1 def rsuma(x):
2 return rsuma(x)
No, kao to vidite ova funkcija vraca poziv na samu sebe koja vraca pozivna samu sebe koja vraca poziv na samu sebe i tako u beskonacnost. Ovakodefinirana rekurzivna funkcija nema kraja, a program ulazi u beskonacnu pet-lju (eng. infinite loop). A gdje je greka? Kako bi sprijecili ovakvo ponaanjepotrebno je uve