Python Skripta

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