You are on page 1of 21

Python u kole 1/5

U nastavi informatike ponaamo se gotovo kao gimnazijalci, pa uimo mrtve jezike.


Uz duno potovanje varijacijama BASIC-a i Pascalu koji se i danas koriste, injenica je
kako ova dva jezika zaista vie nisu ozbiljni programski jezici u kojima e ti klinci
sutra programirati.
Kako vam zvui ideja o programskom jeziku koji djecu prati kroz cijeli proces obrazovanja, od
osnovne kole sve do pisanja doktorata?
Ima li zapravo smisla priati o nekom jedinstvenom standardu za sve kole i sve razine
obrazovanja? Je li preka postavljena ipak malo previsoko?
Moda. No, moe li takav hrabar korak iznjedriti neke sasvim konkretne koristi i pokazati neke
vrste prednosti u odnosu na postojee metode informatikog obrazovanja?
Ponajprije, valja nam odluiti koliko je informatiko obrazovanje djece nuno. Preciznije, trebaju li
klinci zaista uiti programiranje, ili im je dovoljno objasniti kako e klikanjem po arenim
sliicama dobiti neke rezultate.
Na ovo je pitanje teko odgovoriti. S jedne strane, potpuno je jasno kako velika veina djece i
nakon godina uenja programiranja nee postati programeri, i vjerojatno nakon kolovanja vie
nikad nee napisati niti jedan jedini red izvornog koda.
S druge strane, sjetimo se predmeta poput tehnikog odgoja ili, ako se netko sjea, domainstva.
Uilo se zakrpati rupu na arapi (danas se takve arape bacaju u smee), ispei jaja (a hranimo
se po restoranima), izrezati daice po mjeri i sklopiti drvenu kutijicu (danas to kupujemo u Sve
po sedam kuna)...
Ako nam je, dakle, mjerilo potrebitosti nekog predmeta bazirano iskljuivo na korisnosti koju e
od tog znanja imati opa populacija, nastava programiranja raunala treba nam koliko i tehniki
odgoj. Dapae, slijedom logike moemo mirno ukinuti i fiziku, biologiju i kemiju, jer koliko zaista
ta znanja koristimo u svakodnevnom ivotu? Dvostruko dapae, nakon zavretka osnovne kole
moemo ukinuti i matematiku, jer sve ono to se inae koristi u svakodnevnom ivotu, pa i vie
od toga - ve je naueno u osnovnoj koli.
Takva utilitarna logika, naravno, posve je pogrena i tetna: umjesto irenja obrazovanosti, ona
forsira fokusiranje na stvari za koje se pretpostavlja da bi mogle biti bitne za dvadesetak godina,
kad dijete zavri edukaciju i krene u svijet biznisa. Takav sustav stvara fah-idiote koji, ako se
sluajno dogodi da za dvadeset godina trite ne treba njihovu usko usmjerenu pamet,
zavravaju na burzi i/ili brzinskoj prekvalifikaciji.
Odustanemo li od strogo utilitarne logike, primjetit emo kako ti tehniki predmeti, iako moda
ne utjeu znaajno u ostatku ivota velikog dijela populacije, imaju svoje vrsto uporite u
procesu edukacije jer ipak djetetu neto znaajno daju: osim to ga ue nekim stvarima, takoer
prenose i odreeni nain razmiljanja i demonstriraju odreenu logiku. To je moda najvie
uoljivo u fizici i matematici, gdje se uenicima objanjava jedan specifian nain razmiljanja,
gdje stvari imaju poetnu i zavrnu toku, a sve ono izmeu mogue je precizno opisati, mjeriti,
dokazati pa i predvidjeti.
Jednako kao to itanje lektire i uenje jezika blagotvorno djeluju na pismenost i mentalnu
miiavost stanovnitva, tako to ine i predmeti poput matematike i fizike, svaki na svoj nain.
emu nas moe nauiti uenje programiranja raunala? Nije li to kontraintuitivno naim
kreativnim mozgovima to lutaju i plahutaju po poljanama ideja i koncepata? Zar nam nije strogo
definirano, strogo ogranieno i u pravored postavljeno programiranje raunala ipak strano?
U neku ruku jest jer ljudi su esto kaotini, mijenjaju ideje i namjere u zadnji as, predomiljaju
se. Raunalni program je suprotnost tome: precizan i definiran od poetka do kraja. No, upravo
zbog toga je uenje programiranja zanimljivo jer djecu ui planiranju, sistematinosti,
temeljitosti, ali i traenju greaka u vlastitom nainu razmiljanja.
Vratimo se na pitanje programskog jezika. Trenutna situacija u kolama daleko je od idealne ui
se nekoliko programskih jezika, a klinci tijekom odrastanja moraju naputati jedan i usvajati drugi
jezik. Vrijeme potroeno na usvajanje novog jezika i nove paradigme moglo bi se bolje potroiti
za usavravanje postojeih znanja.

Ne kaem pritom da je uenje vie jezika loa stvar, dapae. Najvei problem u toj filozofiji nije
koliina jezika, ve injenica da se u nastavi informatike ponaamo gotovo kao gimnazijalci, pa
uimo mrtve jezike.
Malu djecu je lijepo, zaigrano i korisno uvesti u osnove programiranja sa famoznom kornjaom i
jezikom LOGO. Taj je jezik upravo prilagoen tom uzrastu i uspjeno ih upoznaje sa osnovnim
principima izrade programa.
No, nakon toga klinci krenu uiti druge jezike, pa im se dogodi da ue BASIC i Pascal, ekvivalente
latinskom i starogrkom. Uz duno potovanje varijacijama BASIC-a i Pascalu koji se i danas
koriste, injenica je kako ova dva jezika zaista vie nisu ozbiljni programski jezici u kojima e ti
klinci sutra programirati. Molim, neka se ne nau uvrijeeni developeri koji i danas koriste
moderne inaice tih jezika, ali klinci sutra zaista nigdje nee pronai radno mjesto na kojem e
im znanje BASIC-a koristiti, a tek poneki imati e ludu sreu pronai radno mjesto u kojem je
znanje Pascala traeno.
Prelaskom u vie stupnjeve obrazovanja, dogaa se i promjena programskog jezika. Programski
jezici C i C++ (te sa popularizacijom mobilnih pametnofona sve vie i Java) su Linuga Franca
informatike industrije. Na fakultetu se ne programira u BASIC-u, ali ponegdje se moete provui
sa Pascalom.
U svakom sluaju, odlaskom na fakultet ili u vode ozbiljnijeg programiranja, morati ete se
navii na novi jezik i zaboraviti stari.
Moe li Python promjeniti tu sliku?
Postoji vie razloga zato mislim da bi Python mogao biti bolje rjeenje za nastavu informatike od
etabliranih rjeenja:
Python je svugdje
Ovaj programski jezik koristi se faktiki svugdje. Ima ga na svakoj relevantnoj platformi, a dolazi i
sa svakim Linux i Macintosh raunalom. Nije problem staviti ga i na Windows raunalo, kao ni na
tablet ili na Androidom pogonjen mobilni telefon. Osim to ga je mogue koristiti kao samostalan
programski jezik, Python se esto koristi kao pomoni jezik u kojem se piu skripte i moduli za
drugi softver; primjerice, moduli za Blender i Paint Shop Pro piu se u Pythonu, a mnotvo
softvera koristi ga kao ljepilo koje povezuje razliite dijelove aplikacije.
Python je iv
Za razliku od BASIC-a i Pascala ija evolucija je zastala, Python je mlai jezik i njegova evolucija
jo uvijek traje. To moe biti problem jer se povremeno dogaaju promjene nekompatibilne sa
starim verzijama, ali sa druge strane to osigurava praenje najmodernijih tehnologija koliko je u
gwbasic-u, primjerice, teko sa Interneta povui sadraj neke Web stranice, toliko je to u Pythonu
laka operacija od svega nekoliko jednostavnih naredbi.
Dapae, Python e sasvim sigurno ivjeti kroz vie buduih generacija operacijskih sustava, dok
je, primjerice, gwbasic nemogue potjerati na Windowsima 7 bez koritenja virtualnog XP-a, to
znai da kole moraju ili ostati na starim Windowsima XP/Vista, ili moraju imati verziju Windowsa
7 ija licenca im dozvoljava instalaciju virtualnih Windowsa XP, kojeg djeca onda moraju dodatno
pokretati kako bi mogla programirati u gwbasicu.
To poprilino oteava odravanje nastave, ali predstavlja i optereenje roditeljima koji kod kue
nemaju verziju Windowsa 7 koja ima pravo pokrenuti virtualni XP. Uostalom, nije li to jasan
pokazatelj kako nam je sredstvo za edukaciju djece, ono... blago zastarjelo?
Python je raen za uenje programiranja
Iako to nije njegova jedina namjena, Python je jezik u iji dizajn je utkana ideja o jednostavnom,
praktinom i pravom jeziku za uenje programiranja. Njegova je sintaksa slina pseudokodu i
jednako tako razumljiva. itanje Python koda je teno.
Pythonom je mogue zaraditi za kruh
Nije potrebno spominjati Google koji Python troi na vagone; i u maloj Hrvatskoj postoje tvrtke
koje zapoljavaju ljude sa znanjem programiranja u Pythonu. Pokuajte nai one koje
zapoljavaju BASIC programere ili pascalae... (dozvolite da Visual Basic .NET ne smatram BASICom)
Python je objektno orjentiran jezik (ako to elite)

Pythonu je objekt sve Python je punokrvni objektno orjentirani jezik. No, ako elite, programe
moete pisati i koritenjem procedura, ili na vrlo jednostavne naine, pa ako elite i gotovo
identino nainu na koji piete programe u BASIC-u. Pyhton programeru preputa nain na koji e
napisati program. Klinci u koli mogu tako poeti uiti programiranje piui u Pythonu procedure i
koristei najjednostavniju sintaksu jezika da bi tijekom kasnijeg kolovanja preli na objektno
orjentirano programiranje, ali bez potrebe za mijenjanjem programskog jezika! Osim toga, do
tada steena znanja nee im biti beskorisna ve e, dapae, nova znanja biti nadogradnja onog
ve nauenog.
Python je jednostavan
Ljepota Pythona je to on, iako u svojoj cijelosti relativno kompleksan jezik, svoju kompleksnost
moe lako sakriti. Python je jednostavan poput BASIC-a, ali ako elite moe biti kompleksan
poput C++-a.
Po svojoj naravi minimalistiki, Python je jezik iju je sintaksu i osnovne naredbe mogue
savladati u jednom polugoditu osnovne kole.
Python je interaktivan
Upravo poput BASIC-a, i Python je interaktivni programski jezik koji omoguuje zadavanje jedne
po jedne naredbe koja se odmah izvrava: poput BASIC-a pria sa korisnikom. To svojstvo
obilato emo koristiti u ovom malom serijalu jer je ono odlian nain za upoznavanje sa jezikom.
Python omoguuje koncentriranje na problem
Za razliku od, primjerice, programskog jezika C u kojem programer mora sam paziti na
tehnikalije poput upravljanja memorijom, Python se sam brine za te stvari, ostavljajui
programeru vie vremena na rjeavanje konkretnog problema; zbog toga se Python esto koristi
za izradu prototipa, gdje je vanije dobiti funkcionalan algoritam nego optimizaciju koda; jednom
razvijen algoritam kasnije se moe preprogramirati u C-u ili nekom drugom jeziku koji daje bri
kod. U kolama, gdje brzina izvravanja aplikacije nije od presudne vanosti, Python predstavlja
izvrstan alat upravo zato to omoguuje koncentriranje iskljuivo na rjeavanje zadatka, zbog
ega mu popularnost raste u akademskojzajednici.
Python je vrlo strog u sintaksi
Ovo vas ne treba uplaiti. Nain na koji piete Python programe je malo neobian, pomalo krut,
ali zato uspjeno ui kako pisati itljiv kod.
Za razliku od drugih programskih jezika koji su puno liberalniji od Pythona, ovaj ne dozvoljava
pisanje programa kako se kome svidi. Primjerice, programeri koji piu u Pythonu obiavaju
koristiti jedan red za jednu naredbu; zbog toga programski reci u Pythonu ne zavravaju sa ;,
kako je to uobiajeno u programskom jeziku C ili u Pascalu. U tome je Python program slian
BASIC programu; s druge strane, ako netko ba eli, moe napisati vie naredbi u jednom redu,
pri emu se one onda odvajaju znakom ;. Ipak, koritenje vie naredbi u jednom redu ne
ohrabruje se, jer to smanjuje itljivost programa.
Ono u emu je Python beskompromisan jest indentacija, odnosno uvlaenje blokova programa.
Za razliku od drugih jezika koji blokove programa stavljaju u zagrade, preputajui programeru
da naredbe razbacuje kako mu se god svidi, Python programske blokove odreuje ovisno o tome
koliko su oni uvueni od poetka reda. To e u poetku esto biti uzrok pogrekama u sintaksi, ali
ta striktnost nauit e klince da piu kod koji je strukturiran i itak. Ne dozvolivi aranje u
nainu na koji je formatiziran izvorni kod, Python ui discipliniranom formatiziranju i pisanju
itljivog koda, slino nekadanjem krasopisu. Usvajanje prakse pisanja itljivog koda pola je puta
do pisanja dobrog koda.
Ova kratka serija nastavlja se uvodom u programski jezik Python. Uvod je namjenjen
nastavnicima i vrti se oko usporedbi sa jezikom BASIC: pokuati u demonstrirati kako je Python
zaista jezik sa kojim se moe krenuti ve u osnovnoj koli. Imajte na umu jednu injenicu: ciljana
publika ove serije nastavnici su informatike; ovo nije kola Pythona za opu populaciju, niti si
serija postavlja tako visok cilj. Cilj je skroman: dati nastavnicima materijal kroz koji e moi
usporediti BASIC, Pascal i Python i stei osnovne uvide u taj jezik i zato bi njegovo uvrtenje u
nastavu zaista bilo pametan potez.

Python u kole 2/5


Pogledajmo, dakle, koliko je Python jednostavan.
U prolom nastavku raspravljali smo o ideji da ve stare i pomalo fosilizirane jezike BASIC i Pascal
u kolama zamjenimo Pythonom, modernijim jezikom koji uenika moe sluiti do kraja
obrazovnog procesa. Pogledajmo, dakle, koliko je Python jednostavan.
Instalacija Pythona
Programski jezik Python dolazi na svim Linux i Macintosh raunalima, a na Windows raunala
mogue ga je instalirati preuzimanjem programa sa slubenih stranica. Pretpostavljam da
instalacija softvera nee biti problem. Ako netko eli, moe preuzeti Portable Python instalaciju
kojom je mogue cijelo razvojno suelje staviti na USB disk i koristiti ga na bilo kojem raunalu.
Panja: ove upute odnose se na Python 3. Iako je stara verzija 2 jo uvijek iznimno popularna, mi
emo se ipak pozabaviti novijom verzijom jezika.
Nakon instaliranja softvera, Python moete pokrenuti iz komandne linije (naredbenog retka) ili
koritenjem jednostavnog interaktivnog shella nazvanog IDLE. Pokrenite ga na jedan od ova dva
naina i u pozdravnom tekstu provjerite koristite li odgovarajuu verziju Pythona (3.x.x):
Python 3.2 (r32:88445, Mar 29 2011, 08:43:32)
[GCC 4.4.5] on linux2
Type "help", "copyright", "credits" or "license" for more information.
Uoit ete karakteristian Pythonov propmt ( >>> ) ispod teksta. Slino kao i u BASIC-u, ovdje
moete zadavati naredbe jednu po jednu i interpreter e ih odmah izvravati. Kao i u BASIC-u,
interpreter e pamtiti sve prethodne radnje i varijable i uvati e ih dok ne izaete iz
interpretera.
Za poetak, utipkat emo bilo to kako bismo se upoznali sa nainom na koji Python prijavljuje
greke:
>>> blabla
Traceback (most recent call last):
File "", line 1, in
NameError: name 'blabla' is not defined
Poruka o greci koju Python prijavljuje sadri vie informacija, no nama je za poetak dovoljno
obratiti pozornost na posljednji red. U njemu interpreter prijavljuje vrstu greke. U ovom sluaju,
interpreter je zakljuio kako je "blabla" varijabla iju vrijednost bi trebalo prikazati, ali ju
razumljivo nije pronaao i zato je prijavio greku. To nas lagano uvodi u priu o varijablama.
Varijable u Pythonu imaju neke slinosti sa varijablama u BASIC-u. Primjerice, nije potrebno
deklarirati varijablu, ve ju je mogue kreirati u onom trenutku kada je potrebna u izvornom
kodu. Varijabla mora zapoeti slovom ili donjom crtom, ali za razliku od gwbasic-a, moe poinjati
bilo kojim Unicode znakom, to znai da je u varijablama potpuno ispravno koritenje hrvatskih
znakova. Ostatak naziva varijable moe sadravati brojeve, slova i donje crte; nije dozvoljeno
koritenje razmaka, znaka minus, raznih apostrofa i navodnika, kao ni brojka na poetku naziva
varijable. I, naravno: Python razlikuje velika i mala slova u svemu, pa tako i u nazivima varijabli.
Za razliku od BASIC-a, koji brojeve i tekst smjeta u posebne varijable (pa tako tekst moe biti
pospremljen samo u varijablu koja zavrava znakom $), Pythonu je poprilino svejedno to ete
strpati u neku varijablu:
>>> broj = 5
>>> umnik = ''
Pravilo je vrlo jednostavno: brojevi se navode bez, a znakovi i nizovi znakova unutar apostrofa (ili
navodnika).

to se brojeva tie, Python razlikuje cjelobrojne i brojeve sa pominim zarezom; osim njih, zna
razlikovati i cijelu plejadu drugih matematikih potrebitosti, ali za ovu priliku zadrati emo se
samo na ta dva osnovna tipa.
Cijeli broj (integer) u Pythonu 3 moe biti toliko velik koliko ima slobodne memorije, dok je float
"ogranien" na 1.8E+308.
Kao i u BASIC-u, i u Pythonu se matematike operacije izvode na sasvim prirodan nain:
>>> 4 + 5 / 2
6.5
Python, dakle, pazi na prioritet operacija, a jedina stvar koju valja imati na umu je da Python od
verzije 3 svako dijeljenje dva broja pretvara u float:
>>> a = 4
>>> b = 2
>>> type (a)
>>> a = a / b
>>> a
2.0
>>> type (a)
Naredba type() govori nam koje je vrste varijabla; uoimo kako je nakon poetne definicije
varijabla a bila cjelobrojna (int), da bi nakon dijeljenja sa drugom cjelobrojnom vrijednou
automatski postala float.
Inae, elite li iz nekog razloga varijablu odmah definirati kao float iako je poetna vrijednost
neki cijeli broj, dovoljno je da broju dodate decimalnu toku:
>>> c = 8.
>>> type (c)
Vjerojatno ste uoili kako izlaz naredbe type spominje klasu. To je prirodno, jer kako smo rekli,
Pythonova prava narav je objektno orjentirana. Kako budete napredovali u jeziku tako ete se
susretati sa sve vie i vie znaajki objektno orjentiranog jezika, ali ovdje emo se vrlo malo
susretati sa time.
No, dovoljno smo priali o varijablama. Vrijeme je da upoznamo ekvivalent prve dvije naredbe
koje se obino naue u BASIC-u: PRINT i INPUT.
Nain na koji Python obrauje ulaz i izlaz podataka nije znaajno razliit: sadraj se ispisuje
naredbom print(), a unosi naredbom input().
>>> print (2+3)
5
Razlika izmeu BASIC-a i Pythona je u tome to Python trai zagrade, jer mu je naredba print
samo jo jedna funkcija. Kao i BASIC, i Python zna izraunati izraze unutar naredbe print, i
jednako kao i stariji jezik, nizove znakova trebate staviti u navodnike ili apostrofe:
>>> print ("Dva plus tri je", 2+3)
Dva plus tri je 5

Kako je rije o funkciji, svi argumenti trebaju biti odvojeni zarezom. No, kako emo u gornjem
primjeru dodati toku na kraj reenice? Napravimo li jednostavan pokuaj, dobit emo ne ba
ispravan ezultat:
>>> print ("Dva plus tri je", 2 +3,".")
Dva plus tri je 5 .
Uoite kako izmeu petice i toke postoji razmak. Rezultat je to naina na koji print() ispisuje
argumente. Sreom, poseban argument omoguuje kontrolu nad nainom ispisa:
>>> print ("Dva plus tri je", 2 +3,".", sep="")
Dva plus tri je5.
Argument "sep" odreuje znak kojim e pojedini argumenti biti odvojeni jedan od drugoga.
Podrazumjevana vrijednost je znak razmaka, a u gornjem primjeru smo ga promjenili u nita.
Zbog toga su izlazne vrijednosti stisnute jedna uz drugu. Ispravit emo to tako to emo nakon
zadnje rijei staviti razmak:
>>> print ("Dva plus tri je ", 2 +3,".", sep="")
Dva plus tri je 5.
Alternativno, moemo se posluiti drugim posebnim argumentom funkcije print(): "end", koji
definira na koji nain zavrava ispis. Podrazumjevana vrijednost je oznaka za prelazak u novi red:
"\n", a mi emo je malo nadopuniti:
>>> print ("Dva plus tri je", 2 +3, end=".\n")
Dva plus tri je 5.
Promjenom argumenta funkcija print() ispisuje toku na kraju teksta (bez razmaka) i zatim
prelazi u novi red. Posebni znak "\n" poznat je svima koji su programirali u jeziku C kao oznaka za
novi red; takoer, primjetit ete kako su i neki drugi izrazi, meu njima i matematiki, "posueni"
iz C-a, jer su se pokazali vrlo praktinim.
Ali, je li to ipak nekakvo kompliciranje, zar to ne moe jednostavnije? Funkcija print() vrlo je
bogata nainima na koje je mogue kontrolirati to se dogaa u nizu znakova, pa zaista postoji
nain da se tekst ispie na elegantniji nain, kao to emo uskoro vidjeti.
Sad kada znamo ispisati podatke nauit emo i kako ih unositi. Za jednostavan unos podataka sa
konzole slui funkcija input(), koja je takoer prilino slina onoj u basicoidnim jezicima.
>>> input ("Unesi neki niz znakova ")
Unesi neki niz znakova Blablabla
'Blablabla'
>>>
Sintaksa funkcije je zaista jednostavna. Korisniku prikae pitanje i od njega eka odgovor. Kako u
gornjem primjeru nismo naveli varijablu u koju emo pospremiti korisnikov unos, interpreter nam
je odmah vratio unesenu vrijednost.
Sad smo spremni za prvi jednostavni programi:
Uenik1 = input ("Unesi ime prvog uenika: ")

Uenik2 = input ("Unesi ime drugog uenika: ")


print ("Prvi uenik zove se ", Uenik1, " a drugi uenik zove se ", Uenik2, ".",
sep="")
Rezultat izvravanja programa bio bi ovakav:
Unesi ime prvog uenika: Ratko
Unesi ime drugog uenika: Stjepan
Prvi uenik zove se Ratko a drugi uenik zove se Stjepan.
Kako smo obeali, pokuati emo ispis uiniti ipak malo elegantnijim, koritenjem metode
.format():
print ("Prvi uenik zove se {0}, a drugi uenik zove se {1}.".format (Uenik1,
Uenik2))
Koritenjem metode .format() malo smo se ipak zaprljali objektno orjentiranim programiranjem
kako bismo zauzvrat dobili neto manje kompliciran kod, ali to moe biti i sasvim dobar (a
jednostavan) primjer kojim e uenike kasnije biti lake uvesti u taj svijet.
I to je otprilike to to se tie unosa i ispisa. Za ovaj put zagnjavit u vas jo samo objanjenjem
korisnih matematikih operanda koje je Python posudio od jezika C: +=, *=, -=, /=. Sve operacije
uzimaju vrijednost varijable sa lijeve strane, izvode odgovarajuu matematiku operaciju
(zbrajanje, oduzimanje, mnoenje, dijeljenje) sa vrijednou koja se pojavljuje sa desne strane, i
rezultat vraaju u varijablu na lijevoj strani:
>>> a = 8
>>> b = 7
>>> a += b
>>> print (a)
15
>>> a /= b
>>> print (a)
2.142857142857143
>>> b *= a
>>> print (a, b)
2.142857142857143 15.0

Python u kole! (3/5)


U prolom nastavku upoznali smo se sa varijablama, te jednostavnim upisom i ispisom
podataka. Ovaj put osvrnuti emo se na grananje programa.
Nain na koji Python grana program relativno je slian basicoidima. Neto je bogatiji
mogunostima, a nedostaju mu tipine naredbe GOSUB i GOTO, to je svakako dobra stvar,
posebice kada je rije o naredbi GOTO: Python tjera programera na pisanje koda koji zaokruuje
rjeenje nekog problema u zatvorenu cjelinu.
Prva na redu je klasina naredba IF/ELSE, na kojoj emo po prvi put primjeniti princip definiranja
blokova koda indentacijom (uvlaenjem) razgovarajui sa Pythonom, tj. koristei njegov shell:
>>> a = 3
>>> b = 2
Da bismo pravilno unijeli grananje, moramo zapoeti sa uvjetom:
>>> if a == b:
...
Operator jednakosti je, kao u C-u, dvostruki znak jednakosti, a redak mora zavravati dvotokom,
koja je u BASIC-u oznaka za novu naredbu, ali u sluaju Pythona neizostavni je dio grananja. Ako
radite interaktivno (kako biste za ovaj primjer trebali), uoit ete i tri tokice koje se pojavljuju
nakon unoenja uvjeta; to je znak da Python od vas oekuje unos bloka naredbi koje se
izvravaju ako je uvjet zadovoljen. Podsjetimo, blok koda u Pythonu se oznaava uvlaenjem, pa
ako jednostavno nastavite pisati sljedeu naredbu od poetka reda doekat e vas poruka o
greci:
>>> if a == b:
... print ("A je jednako B")
File "", line 2
print ("A je jednako B")
^
IndentationError: expected an indented block
Ono to trebate uiniti jest uvui kod tipkom Tab ili sa par razmaka:
>>> if a == b:
...
print ("A je jednako B")
... else:
...
print ("A nije jednako B")
...
A nije jednako B
>>>
Sintaksa je potpuno jasna: ako je uvjet istinit izvriti e se prvi blok, a ako nije, izvriti e se drugi
blok. Uoite kako su oba bloka uvuena, i kako i if i else naredbe zavravaju dvotokom.
Stavljanje bloka u blok samo je stvar dodatnog uvlaenja, to e vas moda u poetku zbunjivati,
ali na to ete se brzo navii. Na to je iznimno vano paziti jest mijeanje razmaka i tabulatora.
Blokove trebate uvlaiti ili tipkanjem razmaka ili koritenjem tabulatora, nikako malo na jedan,
malo na drugi nain, jer e to neizbjeno dovesti do greaka koje e biti vrlo teko istrijebiti.
Odluite se za jedan od ova dva naina uvlaenja (ja koristim tabulator, no to je samo moja
preferencija) i ne mijenjajte ga. Takoer, pokuajte utjecati na uenike da kolektivno prihvate
"razrednu konvenciju" o nainu uvlaenja blokova koda, posebice rade li na zajednikim
projektima.
Osim if i else, postoji i elif naredba:

>>> if a==b:
...
print ("A je jednako B")
... elif a>b:
...
print ("A je vee od B")
... else:
...
print ("A je manje od B")
...
A je vee od B
>>>
Sintaksa je, vjerujem, samorazumljiva: ako prvi uvjet (a==b) nije zadovoljen, raunalo
provjerava je li zadovoljen drugi uvjet (a>b), pa ako jest izvrava odgovarajui blok koda i izlazi
iz uvjeta, a ako nije izvriti e posljednji blok koda. Kako a moe biti jednak, vei ili manji od b,
nepotrebno je ispitivati sva tri uvjeta jer je jasno da ako bilo koja dva uvjeta nisu zadovoljena,
ispravan je onaj koji je preostao.
Tu ete takoer uoiti slinosti sa nainom na koji BASIC usporeuje varijable; no, za razliku od
BASIC-a koji razliitost ispituje ovako: "a<>b", Python koristi nain na koji C ispituje razliitost:
"a!=b".
Naredba while izvrava blok koda sve dok je uvjet istinit, nakon ega izvrava blok koda koji se
nalazi u else, ili jednostavno nastavlja sa izvravanjem programa.
>>> x=1
>>> while x<6:
...
print (x)
...
x+=1
... else:
...
print ("Kraj petlje")
...
1
2
3
4
5
Kraj petlje
>>>
Iz ovog je primjera oito kako se while petlja moe koristiti umjesto FOR NEXT petlje u BASIC-u.
Pitate li se koji je smisao "else" bloka? Naizgled je suvian, jer e zavretkom "while" petlje
ionako biti izvren, kao i kod koji zatim slijedi. No, on e biti izvren i ako u prvom prolazu kroz
petlju zakljuimo kako je uvjet neistinit, to nam omoguuje kontrolu nad tim posebnim sluajem.
On nee biti izvren ako se iz petlje izae prekidom (break). Mnogi programeri nikada ne koriste
"else" blok u "while" petlji, pa je i ovdje naveden samo kompletnosti radi vjerojatno se neete
esto susresti sa njim.
Nedostaje li Pythonu FOR NEXT petlja? Ne, i ona postoji i, dapae, u monijoj formi: za razliku od
BASIC-a koji poznaje samo petlju u kojoj se broje brojevi, Python u tu petlju moe utrpati i druge
stvari:
>>> for i in range (1,3):
...
print (i)
... else:
...
print ("Gotovo!")
...
1
2
Gotovo!

>>>
U ovom primjeru for petlja uzima raspon brojeva od jedinice do trojke i ispisuje ih. Uoite funkciju
range(), koja je dopuna for petlji. Njena sintaksa je sljedea:
range (poetna vrijesnost, zavrna vrijednost, korak uveanja)
Ona tako zamjenjuje dobar dio FOR TO STEP NEXT sekvence BASIC-a. No, za razliku od tog jezika,
funkcija range() broji do ciljnog broja, ali kao to smo u primjeru vidjeli ne ukljuuje ga!
No, nemojmo se zaustaviti samo na toj jednostavnoj implementaciji petlje. For petlji moete
nabaciti i niz znakova, listu, openito bilo kakav sekvencijalni niz podataka:
>>> for i in ["Pero", "Stipo", "Ivo"]:
...
print ("Uenik se zove", i)
...
Uenik se zove Pero
Uenik se zove Stipo
Uenik se zove Ivo
>>>
Slino kao Pascal i C, Python nudi mogunosti kontrole petlji. Primjerice, elite li izai iz petlje u
nekom tono odreenom trenutku, koristiti ete "break", kao u ovom primjeru, koji je malo dui
pa bi ga bilo zgodnije napisati u IDLE editoru (ili nekom drugom po vaem izboru moj omiljeni
je Eric i zatim izvriti nego utipkavati direktno u Python shell:
parni = 0
neparni = 0
while True:
broj = int(float(input ("Unesi cijeli broj od jedan do deset: ")))
if broj%2:
neparni +=1
else:
parni +=1
if broj>10 or broj <1:
break
print ("Parnih brojeva:
",parni)
print ("Neparnih brojeva: ",neparni)
Rezultat izvravanja bio bi otprilike ovakav:
>>> Unesi broj od jedan do deset: 5
Unesi broj od jedan do deset: 4
Unesi broj od jedan do deset: 6
Unesi broj od jedan do deset: 22
Parnih brojeva:
3
Neparnih brojeva: 1
>>>
Ova je petlja beskonana, jer je uvjet "while" naredbe bulov operator True. No, iz nje se moe
"pobjei": petlja e se vrtiti sve dok ne upiemo broj koji je vei od deset ili manji od nule, nakon
ega se petlja prekida i ispisuje broj upisanih parnih i neparnih brojeva. U ovom primjeru nauili

smo jo tri nove stvari. Ponajprije, ostatak dijeljenja dva broja dobiti ete operatorom "%": kako
je svaki parni broj djeljiv sa dva bez ostatka, taj trik iskoristili smo da bismo ispitali je li uneeni
broj paran ili nije. Pritom nas uope ne zanima koji je ostatak, jer on moe biti nula ili neki drugi
broj. Nula uvijek oznaava neistinitu tvrdnju (bulov operator False), a broj koji nije nula istinitu
(bulov operator True).
Tako if petlja zapravo ispituje istinitost matematike operacije: ako ostatka nema, bit e nula,
dakle False svi parni brojevi dati e False kao odgovor. S druge strane, rezultat dijeljenja
neparnih brojeva moe biti bilo koji cijeli broj, no to nam je nevano jer se svi oni tretiraju kao
True, a nama je u uvjetu interesantno samo je li ostatak nula ili bilo koji drugi broj.
Druga, moda zbunjujua stvar, je definiranje varijabli "parni" i "neparni" na poetku skripte.
Zato, ako smo rekli da Pythonu moemo podmetnuti varijablu na bilo kojem mjestu u kodu?
Poanta je u zbrajanju varijabli. Kada ne bismo imali predefiniranu vrijednost varijabli (bilo gdje) u
kodu koji prethodi matematikoj operaciji zbrajanja, Python bi se zbunio: "Ok, ovu varijablu
moram uveati za jedan. To je u redu, ali tu varijablu sad vidim prvi put, kako u znati koja joj je
poetna vrijednost, to trebam uveati za jedan?" - i prijaviti greku. Python ne podrazumjeva da
novonastale varijable imaju vrijednost nula kao to to radi BASIC. Zato mu u ovakvim
sluajevima treba eksplicitno rei to se u varijabli nalazi.
Kao tree, mogli ste u petom retku primjetiti kako je mogue i "ugnjeavati" funkciju u funkciju;
konkretno, rezultat funkcije input() koji vraa korisnikov unos funkciji float() koja ga, najbolje
kako zna, pretvara u broj sa pominim zarezom, i taj rezultat prosljeuje funkciji int() koja ga
zatim pretvara u cjelobrojnu vrijednost. emu takvo kompliciranje?
Obzirom da funkcija input() dozvoljava unos bilo kakvog niza znakova po Unicode standardu,
valja biti oprezan. Ako uenik unese znakove koji nisu brojevi, dobiti e nazad poruku o greci.
No, to ako zabunom unese broj koji nije cijeli? U tom sluaju program prvo iz niza znakova koji
su mu prosljeeni funkcijom input() pokuava otkriti je li rije o broju sa pominim zarezom, pa
ako jest, prepustiti e ga funkciji int() koja e od njega napraviti cijeli broj kako bismo zadovoljili
uvjete.
Domaa zadaa za ovaj primjer: kao to se u rezultatima moe vidjeti, program u zbroj parnih i
neparnih brojeva stavlja i broj kojeg unesemo da bismo izali iz petlje, broj koji je manji od jedan
ili vei od deset. Kojom jednostavnom prepravkom se takvo ponaanje moe izbjei?
Osim grubog prekidanja petlje, Python programeru ostavlja mogunost da zadovoljenjem nekih
uvjeta preskoi jednu iteraciju petlje, ali ne prekine cijelu petlju ve je nastavi dalje,
zanemarujui preskoenu iteraciju.
Promjenimo malo prethodni primjer. Zamislimo program koji e zbrajati samo parne brojeve, a
neparne preskakati:
parni = 0
while 1:
broj = int(float(input ("Unesi cijeli broj od jedan do deset: ")))
if broj%2:
continue
else:
parni +=1
if broj>10 or broj <1:
break
print ("Ukupno parnih brojeva:
",parni)
Vjerujem kako ste odmah uoili trik: na mjestu na kojem se ispituje parnost izbacili smo redak u
kojem se zbrajaju neparni brojevi i umjesto njega stavili naredbu "continue". Svaki put kada
program dobije neparni broj, na ovome e mjestu prekinuti izvravanje ostatka petlje i krenuti u
novi ciklus, pa naredbe ispod tog reda nee nikada biti obraene u tom istom ciklusu.
Ovaj primjer pati od istog problema zbrajanja izlaznog broja kao i prethodni, ali ovaj put primjetiti
ete kako vie ne moete izai iz petlje upisom broja manjeg od jedan ili veeg od deset ako je

on neparan petlja koja ispituje parnost broja uvijek e na gore spomenutom mjestu pokrenuti
petlju ispoetka, pa uvjet za izlazak iz petlje (deveti redak) nee tom prilikom biti ispitivan.
Jedinica kao argument naredbi "while" identina je, sjetimo se, bulovom operatoru True, pa je to
ponovo jedna beskonana petlja.
Ovime smo pokrili osnove uvjeta i kontrole toka u Pythonu. Sljedei put vidjeti emo kako je
jednostavno nainiti vlastite funkcije, to su to globalne varijable, kako koristiti ogromnu koliinu
ve gotovih biblioteka, pa i ovla dotaknuti podruje objektno orjentiranog programiranja.

Python u kole! (4/5)


to je mukarac bez brkova i programski jezik bez mogunosti definiranja vlastitih
funkcija?
U ovom nastavku, kako je najavljeno, saznat emo kako se rade funkcije, neto malo vie o
varijablama, te kako iskoristiti mnotvo ve gotovih funkcija u bibliotekama.
Ponajprije, funkcija. Kao to ete vidjeti, Pythonove funkcije nisu znaajno kompliciranije od onih
koje koriste razne varijacije BASIC-a. Funkcija je programska cjelina, komad koda koji definira
odreeno ponaanje, a kojeg kasnije moete pozivati iz drugih dijelova programa. Funkcije su
izvrsno rjeenje kojim se skrauje veliina ukupnog koda programa, jer jednom napisanu funkciju
mogue je pozivati vie puta za vie operacija.
def poredaj(a, b):
if a > b:
print (b,a)
else:
print (a,b)

x = input ("Unesi prvi broj ")


y = input ("Unesi drugi broj ")
poredaj (x,y)
U ovom primjeru prvi blok je definicija funkcije koju smo nazvali poredaj(), a koja prima dva
argumenta a i b. U tijelu poruke if naredba ispituje koji od dva broja je vei i osvisno o tome
izvrava jednu ili drugu funkciju print(); u svakom sluaju, rezultat je ispis vrijednosti poredan po
veliini od manjeg prema veem:
Unesi prvi broj 9
Unesi drugi broj 4
4 9
>>>
Napraviti funkciju, dakle, slino je kao i u basicoidima ili u Pascalu. No, gore napisani program
krije u sebi neke zamke:
Unesi prvi broj 5
Unesi drugi broj 123
123 5
>>>
Ovo je oito neispravan poredak u funkciji koja je toliko jednostavna da bi u njoj bilo jako teko
napraviti tako ozbiljnu pogreku. Pogreka se, dakle, mora kriti negdje drugdje, a pronai emo je
sjetimo li se kako Python unose tretira kao niz znakova. to ako funkciji kao argumente zadate
rijei, a ne brojeve?
Unesi prvi broj Pero
Unesi drugi broj Stipo
Pero Stipo
>>>
Sad je stvar malo bistrija. Funkcija je uredno posloila imena abecednim redom. Objanjenje je
sad vjerojatno jasno: kada smo funkciji zadali brojeve "5" i "123" Python ih nije interpretirao kao
brojeve, ve kao niz znakova. Obzirom da je jedinica manja od petice, niz znakova "123" sortiran
je ispred znaka "5", jer je raunalo zapravo obraivalo znakove, a ne brojeve.

To ponaanje ispraviti emo tako da vrijednosti koje stavljamo u x i y eksplicitno pretvorimo u


brojeve prije spremanja:
x = int (input ("Unesi prvi broj "))
y = int (input ("Unesi drugi broj "))
Jo jedna vrlo vana stvar sa kojom ete se susretati u izradi funkcija i kasnije u objektno
orjentiranom programiranju je injenica da Python razlikuje lokalne i globalne varijable. Lokalne
varijable su one koje se koriste u odreenom dijelu koda (nekoj funkciji, primjerice) i vaee su
samo za taj dio koda. One mogu imati identino ime kao varijable u nekom drugom dijelu koda,
ali bez obzira na to Python ih nee tretirati kao jednu te istu varijablu, ve kao razliite, svaku u
svom opsegu djelovanja (tzv. scope):
x = 10
def funkcija():
x = 'Blabla'
print (x)
print (type (x))
print ("Ispis lokalne varijable x i njen tip")
print (x)
print (type (x))
print ("\nIspis varijable x unutar funkcije")
funkcija()
Rezultat izvravanja programa je ovo:
Ispis lokalne varijable x i njen tip
10
Ispis varijable x unutar funkcije
Blabla
>>>
Varijabla x koju smo definirali na poetku programa lokalna je za program, ali ne i za funkciju,
koja ima vlastitu lokalnu varijablu koja je posve drugaija, ali se jednako zove. Prvi x je varijabla
koja u sebi sadri cjelobrojnu vrijednost, to dokazujemo ispisom funkcije type(x), dok je druga
varijabla x, ona unutar funkcije, samo imenjakinja prve varijable ali u svojoj naravi posve
samostalna varijabla koja u sebi sadri niz znakova (i koja, naravno, vrijedi samo unutar
programskog bloka funkcije u kojoj je nastala).
Ponekad emo imati potrebu na jednom mjestu definirati neku varijablu koja e biti zajednika
svim dijelovima programa; to su globalne varijable. No, Python to ini na neobian nain.
Umjesto da na poetku koda definirate svoje globalne varijable, morate ih definirati unutar svake
pojedinane funkcije koju stvarate:
x = 10
def funkcija():
global x
x = 'Blabla'
print (x)
print (type (x))
print ("Ispis varijable x i njen tip")
print (x)
print (type (x))
print ("\nIspis varijable x unutar funkcije")
funkcija()

print ("\nPonovni ispis varijable x nakon povratka iz funkcije")


print (x)
print (type (x))
Uoite kako je u definiciji funkcije dodan redak u kojem pie "global x" to je znak Pythonu da
varijablu ne tretira kao lokalnu, ve da radi sa originalnom varijablom x. Ispis je ovakav:
Ispis varijable x i njen tip
10
Ispis varijable x unutar funkcije
Blabla
Ponovni ispis varijable x nakon povratka iz funkcije
Blabla
Definiranjem globalne varijable, dakle, preuzeli smo potpunu kontrolu nad "originalom", pa smo
joj tako promjenili i tip i vrijednost. Nakon te operacije originalni tip i vrijednost varijable x se
gube. Kako je to relativno esta zabuna kod programera, Python eksplicitno trai da u svakoj
funkciji navedete koje varijable elite proglasiti globalnim, kako u kompliciranijim programima ne
biste zaboravili koje su vam varijable globalne, a koje lokalne.
Da bismo stvar dodatno zakomplicirali, valja znati da Python moe bez problema itati varijable
definirane u programu ako se one nalaze "ispod" funkcije:
x = 10
def funkcija():
print (x)
funkcija()
Ovaj primjer ispisati e broj deset, jer Python dozvoljava funkciji da dohvati vrijednost varijable x
koja je definirana negdje drugdje u programu, ali u nivou niem od onoga u kojem je funkcija.
Varijable lokalne za pojedinu funkciju dostupne su samo njenim podfunkcijama i nevidljive
drugim funkcijama u istoj razini. Takoer, varijable u podfunkcijama nisu dostupne funkciji iz koje
su nastale nove podfunkcije.
Ono to Python ne dozvoljava je promjena vrijednosti, u kojem sluaju x postaje varijabla lokalna
za tu funkciju i ne mijenja izvornu, a ako ste koristili "global", tek tada e dozvoliti pisanje u
izvornu varijablu.
Ovo bi najbolje bilo demonstrirati jednostavnim primjerom:
a = 1
def funkcija1():
b = 2
print (a,b,c)
def funkcija2():
c= 3
print (a,b,c)
funkcija2()
funkcija1()
print (a,b,c)
Varijabla a je dostupna funkciji1 jer je nastala u glavnom tijelu programa. Varijabla b je dostupna
funkciji2 jer je nastala u funkciji koja je "roditeljska" toj funkciji (jednako tako i varijabla a jer se
nalazi u programskom bloku iz kojeg je nastala funcija1). Meutim, varijabla c nije dostupna

funkciji1 jer je dio podfunkcije (funkcija2) koja nastaje iz te funkcije, pa e izvravanje ovog koda
prijaviti greku. Uklonite li tu greku brisanjem varijable c u prvoj print() funkciji, program e se
veselo izvriti do zadnje funkcije print() i ponovo prijaviti greku, jer niti varijabla b niti varijabla c
nisu dostupne glavnom tijelu programa, one su definirane kao lokalne u navedenim
podfunkcijama i zato nedostupne glavnom tijelu programa; varijabla a pritom je dostupna svima.
Zato uvijek valja paziti koji je scope varijable sa kojom radimo, jer je relativno lakozabuniti se.
To bi otprilike bile osnove varijabli i funkcija. Samostalnim istraivanjem zaviriti ete i ispod vrha
sante leda, no za neku osnovnokolsku priu ovo bi trebalo biti dovoljno. Stekli ste nekakvo
minimalno znanje jezika Python.
Sa ovim osvnovnim skupom naredbi ne bismo daleko doli one su zgodne za jednostavne
algoritmie i jednostavne programie, no kako smo ve rekli, ovo je vrlo ozbiljan programski
jezik, pa dolazi sa bibliotekama gotovih rjeenja, tzv. modulima. Uitelji koji rade sa Pascalom
odmah e prepoznati o emu se radi.
Proirivanje osnovne funkcionalnosti jezika vrlo jednostavno se obavlja ukljuivanjem ve gotovih
modula u vlastiti kod, nakon ega funkcije i algoritmi koje je netko ve napisao postaju dostupni
jednostavnim pozivanjem istih; slino kao u Pascalu, da biste se mogli posluiti tim funkcijama,
prvo morate pozvati odgovarajui modul. Sintaksa poziva je vrlo jednostavna:
import naziv_modula
Dovoljno je na poetku programa na taj jednostavan nain pozvati module i to je to.
Pogledajmo kratak a intrigantan primjer:
import os
opsus = os.uname()
dir = os.getcwd()
print (opsus)
print (dir)
Naredbom "import os" uitali smo modul "os" koji sadri funkcije za interakciju sa operacijskim
sustavom. Zatim smo pozvali ve gotove rutine os.uname() koja vraa podatke o arhitekturi
raunala na kojem se izvrava, te os.getcwd() koja vraa podatke o radnom direktoriju. Te
podatke stavili smo u varijable, koje smo zatim ispisali. Rezultat na mojem raunalu koje pogoni
Linux je ovaj:
('Linux', 'kanta', '2.6.35-28-generic', '#50-Ubuntu SMP Fri
Mar 18 18:42:20 UTC 2011', 'x86_64')
/home/rado
>>>
Uoite kako os.getcwd() vraa samo jednu vrijednost, dok os.uname() vraa listu(preciznije,
tuple) koja sadri pet vrijednosti. Ako ste nazad dobili poruku o greci, nastavite itati dalje.
Jednostavan matematiki primjer bio bi program koji beskonano ispisuje sluajne brojeve.
Funkcija koja stvara sluajan broj nalazi se u modulu "random", pa ga na poetku moramo
importirati:
import random
while 1:
print (random.random())
Pokrenete li ovaj program, on e u beskonanost (jer je, sjetimo se, jedinica takoer i True)
ispisivati sluajne brojeve izmeu nule i jedinice. No, to ako elimo neki drugi opseg, recimo od
jedinice do tisuice? Klasini trik u BASIC-u je mnoenje pa zatim zaokruivanje dobivenog
sluajnog broja, no Python ima moniju biblioteku koja poznaje nain za jednostavno dobivanje
eljenog rezultata; umjesto random.random() koristiti emo random.randint(a,b) koji vraa
sluajni cijeli broj u rasponu od a do b, pa u gornjem primjeru funkciju print promjenite ovako:

print (random.randint(1,1000))
Et voila, program sada ispisuje sluajne brojeve od jedan do tisuu.
Postoje dvije osnovne stvari koje trebate imati na umu kada radite sa modulima. Prva stvar je da
se funkcionalnost nekih modula moe mijenjati ovisno o operacijskom sustavu kojeg koristite, pa
ne oekujte da e os.uname() svim uenicima vraati rezultat; ako ste prijanji primjer isprobali
na Windows raunalu, vjerojatno ste dobili poruku o greci. Umjesto os.uname() postoji
univerzalniji nain za dobivanje informacije koritenjem platform.uname(). Za domau zadau
prepravite primjer tako da koristi bolji nain; panja: promjenu ete morati uiniti na dva mjesta.
Moduli, dakle, mogu ali ne moraju imati istu funkcionalnost na svim platformama; pa ak i
pojedinane komponente nekog univerzalnog modula mogu biti namijenjene tono odreenoj
platformi, poput platform.win32_ver() ili platform.mac_ver().
To nas uvodi u drugu osnovnu stvar: valja biti upoznat sa najee koritenim modulima. Modula
ima mnogo, oni rade mnogo stvari, to su ogromne biblioteke najrazliitijih korisnih stvari. Isplati
se barem okvirno znati to radi desetak najee koritenih modula, a u njima je pak zgodno
znati koje vam stvari najee trebaju, ali i koje sline stvari bi se mogle pokazati korisnima.
Nema smisla napamet uiti sve te silne module, ali korisno je u glavi drati neku opu sliku kako
biste znali gdje trebate traiti detalje. Nakon upoznavanja sa osnovama jezika, sa modulima ete
provoditi hrpu vremena.
Mali trik: funkcijom dir(naziv_modula) moete brzo zaviriti u sadraj modula i vidjeti to se sve
u njemu nalazi.
Ovdje bismo mogli definirati kraj upoznavanja sa osnovama jezika Python. U posljednjem
nastavku zaigrati emo se jednostavnim primjerima koji demonstriraju kako je nekomplicirano
raditi sa grafikom i grafikim sueljem, koristei koliko je to mogue znanja koja smo do sad
stekli.
Ako vas je ova serija tekstova zaintrigirala i ako elite ozbiljnije prouiti Python, preporuujem
ove izvore informacija:
A byte of Python, knjiga C. H. Swaaropa, pitka knjiga kojom je inspiriran vei dio ove serije
tekstova; knjiga je besplatna u PDF obliku i moete je slobodno dijeliti uenicima; odluite li
financijski pomoi autorov trud, kupite papirnato izdanje.
WikiBooks nudi Python Programming, neto opseniju knjigu sa zadacima za vjebu koja je
dostupna i u obliku PDF datoteke.
I, naravno, Otac Pythona osobno, Guido Van Rossum, napisao je The Python Tutorial, neto
struniji i detaljniji prirunik na kojeg se moete baciti nakon to savaete prva dva.
Style Guide for Python Code svojevrstan je pravopis Pythona, upute kako pisati lijep i itak kod.
Za razliku od mog stila, preporuuje uvlaenje blokova koritenjem etiri razmaka.

Python u kole! (5/5)


Dok sam pisao ovaj mali serijal do mene je doprla informacija kako se neki nastavnici i
profesori ve igraju sa Pythonom i o njemu ozbiljno razmiljaju. Struka je, dakle, ve
zapazila ovaj programski jezik.
Pie: Radoslav Dejanovi
Korak po korak, doli smo do kraja ove kratke i nadam se ne pretjerano komplicirane prie o
programskom jeziku Python. Za kraj malo emo obraditi grafiku, to je i dobar primjer jedine
ozbiljne neuralgine toke koju Python u svom treem izdanju ima.
Nova inkarnacija Pythona, naime, nema toliko biblioteka koliko ih ima stara verzija. Rije je o
relativno novoj verziji sa nekim novim idejama, pa je biblioteke potrebno "preraditi" kako bi
radile na novoj verziji jezika. U opticaju je ogromna koliina softvera pisanog za Python 2, i
obzirom da se dvojka jo uvijek intenzivno koristi, autori modula ne ure prepraviti iste za novu
verziju. Zbog toga je u ovom trenutku ponuda modula za novi Python neto siromanija, a
dobavljanje modula neto kompliciranije. Trend prilagoavanja modula je obeavaju.
Zato onda nisam priao priu o Pythonu 2? Iz jednostavnog razloga: Python 3 je budunost, i to
ne tako daleka. ak i ako nekim udom Python ue u kolski kurikulum, to se nee dogoditi
danas, ve taman u vrijeme kad Python 3 bude "kompletiran".
No, za sada to znai da neke biblioteke uope nisu dostupne, a neke morate runo instalirati. Nije
pretjerano komplicirano, ali valja imati malo znanja (obzirom da je tekst namijenjen nastavnicima
informatike, usuditi u se vjerovati kako oko toga nee biti problema).
Upoznajmo se sa fenomenalnim modulom nazvanim Pygame, bibliotekom koja daje skup
jednostavnih funkcija za upravljanje grafikom, ali i izradu raunalnih igara, to Pygame ini
iznimno zanimljivom igrakom u informatikoj uionici.
Za poetak, obzirom da Pygame uglavnom ne dolazi sa Pythonom 3, trebate ga runo instalirati.
Korisnici Windowsa mogu ovdje pronai instalacijske datoteke, dok su jednostavne upute za
korisnike Ubuntu, Debian i slinih distribucija navedene na kraju ovog linka, a korisnici
Macintosha upute mogu pronai ovdje.
Jednostavan, neinteraktivni demo postaviti emo ovako: napraviti emo prozor veliine 640x480,
zatim emo u njemu izabrati sluajne X i Y koordinate, pa emo od te koordinate do ruba prozora
crtati sinusoide u raznim bojama. Nakon izvornog koda slijede objanjenja.
No, ono to ete odmah uoiti jest drugaiji princip na kojem pygame radi: on uvodi dogaaje
(evente) i tu se ve ozbiljnije igramo sa objektno orjentiranim programiranjem, sreom na vrlo
jednostavan i razumljiv nain.
import pygame
import math, random
pygame.init()
ScreenX = 640
ScreenY = 480
run = 1
screen = pygame.display.set_mode ((ScreenX, ScreenY))
while run:
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = 0
X = random.randint (1, ScreenX)
Y = random.randint (1, ScreenY)
Z= Y
ColorR = random.randint (1, 255)
ColorG = random.randint (1, 255)
ColorB = random.randint (1, 255)
while X < ScreenX:
pygame.draw.line(screen, (ColorR, ColorG, ColorB), (X,Z), (X,Y))

X+=2
Y+=math.sin(X)*20
pygame.time.wait(50)
print (X,Y)
pygame.display.update()
Odmah na poetku importirali smo tri modula: Pygame e nam posluiti za crtanje, u modulu
math nalazi se funkcija za raunanje sinusa, a modul random nam treba kako bismo dobili
sluajne brojeve i tako na zadai uinili jednostavnijim.
Nakon toga inicijalizirali smo pygame. U varijable ScreenX i ScreenY stavili smo eljenu veliinu
prostora, a zatim smo varijabli run dali poetnu vrijednost jedan (True), jer emo je kasnije
koristiti za kontrolu programa.
Malo dalje, nita kompliciranije: definirali smo grafiki prozor veliine zadane gore navedenim
varijablama i nazvali ga screen; to je objekt po kojemu emo kasnije crtati.
Ostatak prie izvrava se u glavnoj while petlji, sekvencijalno. Prvo ispitujemo jesmo li dobili
event za izlazak iz aplikacije (klikom na gumb za zatvaranje prozora), pa ako jesmo, zavravamo
sa radom.
Zatim u koordinate X i Y stavljamo sluajni broj izmeu jedinice i najvee duine, odnosno irine
ekrana; one e biti poetne toke nae sinusoide. U varijable ColorR, ColorG i ColorB stavljamo
sluajnu vrijednost 1-255; mijeanjem te tri varijable dobiti emo boju sinusoide.
Druga while petlja izvrava se sve dok je varijabla X manja od desnog ruba prozora. Crtanje
obavlja pygame.draw.line funkcija kojoj smo rekli po kojem objektu treba crtati (screen), tri RGB
komponente boje kojom e crtati, poetnu toku (X,Z) i krajnju toku (X,Y) crte.
X zatim uveavamo za dva, a Y mijenjamo ovisno o sinusu X-a. Da stvar ne bi radila prebrzo,
dodali smo 50ms kanjenja naredbom pygame.time.wait(), a nakon toga u konzoli ispisujemo
vrijednosti X i Y varijabli. Za kraj, da bismo uope vidjeli promjenu, moramo pozvati
pygame.display.update() koja e osvjeiti prikaz.
Za domau zadau, dva malo kompliciranija zadatka: zato se sinusoida koju crtamo ponaa
neobino i kako to jednostavnom izmjenom ispraviti? Zatim, zato je izlaz iz programa mogu tek
kada je sinusoida dola do ruba ekrana, odnosno zato se program ne ugasi im kliknemo iksi
na rubu prozora (i kako to optimizirati)?
Programiranje pomou Pygame modula zaista je jednostavno, a doticaj sa objektnim
programiranjem je skroman. Sa druge strane, iako je Pygame simpatian modul za izradu igara ili
2D (pa i 3D) grafike, ukljuujui OpenGL... ipak je vjerojatnije kako e izrada grafikog suelja za
aplikaciju biti ei posao. A za tu emo namjenu koristiti ipak prilagoeniju platformu: Qt
biblioteku.
Kao i u sluaju prethodnog modula, morati emo ga posebno instalirati (to, kako smo ve rekli,
u sluaju stavljanja ovog jezika u kolski kurikulum, tamo negdje 2028. godine, nee biti
problem), Linuxai prema uputama ovdje, Windowsai preuzimanjem gotovog instalera ovdje, a
Macintoshevci na fink-u.
Pregledom ovog, kao i u sluaju pygame primjera zapravo nevelikog komada koda, uoiti ete
kako je objektna orjentiranost znaajno jae istaknuta od primjera za pygame:
import sys
from PyQt4 import QtGui, QtCore
class Prozor(QtGui.QWidget):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.setGeometry(300, 300, 250, 150)
self.setWindowTitle('Dumb Gumb')
gumb = QtGui.QPushButton('Zatvori me!', self)
gumb.setGeometry(75, 75, 90, 35)
self.connect(gumb, QtCore.SIGNAL('clicked()'),
QtGui.qApp, QtCore.SLOT('quit()'))

app = QtGui.QApplication(sys.argv)
qb = Prozor()
qb.show()
sys.exit(app.exec_())
Krenimo redom: nakon importa odgovarajuih modula, prva stvar koju smo napravili je definicija
prozora kao klase bez roditelja (on e, dakle, biti roditelj ostalim komponentama); zatim smo
definirali veliinu prozora, kao i tekst u naslovu. Nakon toga smo definirali gumb nazvan "gumb",
sa odgovarajuim tekstom i poloajem unutar prozora. Nakon toga definirali smo to se dogaa u
sluaju kada kliknemo taj gumb: kada dobijemo signal da je gumb pritisnut, pozivamo
odgovarajui slot, u ovom sluaju quit(). Qt biblioteka omoguuje komunikaciju koritenjem
signala i slotova, na relativno jednostavan nain.
Po zavretku definiranja klase Prozor, kreiramo aplikacijski objekt, prikazujemo na prozor i u
zadnjoj liniji pokreemo glavnu programsku petlju koja e za nas odraditi rukovanje svim
dogaajima.
Iako je primjer jednostavan, ne ini se prilagoenim mlaim uzrastima, kojima bi proceduralni
pristup vjerojatno puno lake sjeo. Kao to Python moe prikriti svoju objektnu orjentiranost, tako
ni Qt ne sili programera na pisanje iskljuivo objektnog koda, pa je istu stvar mogue napisati i
proceduralno:
import sys
from PyQt4 import QtGui, QtCore
app = QtGui.QApplication(sys.argv)
Prozor = QtGui.QWidget()
Prozor.setGeometry(300,300,250, 150)
Prozor.setWindowTitle("Dumb Gumb")
Prozor.show()
Gumb = QtGui.QPushButton("Zatvori me!")
Gumb.setGeometry(75, 75, 80, 35)
Gumb.show()
Prozor.connect(Gumb, QtCore.SIGNAL('clicked()'), QtGui.qApp,
QtCore.SLOT('quit()'))
sys.exit(app.exec_())
Ipak, ovakav nain pisanja zgodan je samo za jednostavne primjere (kakvi se, uostalom, u
osnovnoj koli i rade), a za ozbiljnije aplikacije objektni model je puno bolji izbor. To znai da
kolarci ne trebaju izbjegavati Qt biblioteku za izradu jednostavnih grafikih suelja napisanih
proceduralnim stilom dokle god je rije o samo par elemenata suelja i jednostavnim
programima, nema razloga "forsirati" objektno orjentirano programiranje.
Ako ste pokrenuli proceduralni primjer, vjerojatno ste primjetili da sa njim neto ne tima kamo
je pobjegao gumb? Za domau zadau, uinite jednostavnu izmjenu koda (u jednom retku,
usporedite kod sa prethodnim) koja e gumb smjestiti tamo gdje mu je mjesto.
I ovdje bih ipak podvukao crtu. U ovih pet nastavaka preli smo od najjednostavnijih stvari sve
do (takoer ne pretjerano kompliciranih) programa koji koriste grafiku i GUI. Komplicirano zaista
nije.
Dok sam pisao ovaj mali serijal do mene je doprla informacija kako se neki nastavnici i profesori
ve igraju sa Pythonom i o njemu ozbiljno razmiljaju. Struka je, dakle, ve zapazila ovaj
programski jezik.
Python u kole? Mislim da bi to bila pametna ideja. Zapravo, bilo kakav dobar i moderan
programski jezik bio bi dobra zamjena za zastarjele metode koje i danas koristimo. Raunala se
razvijaju vrlo brzo, tako i koncepti i tehnologije. Ja sam gubio vrijeme na "crtanje" rupa na
buenoj kartici po EBCDIC kodiranju, pa recite to mi sad to kolovanje vrijedi i tko vie koristi

buene kartice? to elimo u kolama: BASIC ili neto jednako jednostavno, a modernije i
ivo?!?!
Uostalom, ako ne vjerujemo nama samima, moda nas uvjere strana iskustva?

You might also like