Professional Documents
Culture Documents
Python U Škole 1
Python U Škole 1
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.
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: ")
>>> 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.
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.
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?