python u Škole 1

25
Python u škole 1/5 U nastavi informatike ponašamo se gotovo kao gimnazijalci, pa – učimo mrtve jezike. Uz dužno poštovanje varijacijama BASIC-a i Pascalu koji se i danas koriste, činjenica je kako ova dva jezika zaista više nisu ozbiljni programski jezici u kojima će ti klinci sutra programirati. Kako vam zvuči ideja o programskom jeziku koji djecu prati kroz cijeli proces obrazovanja, od osnovne škole sve do pisanja doktorata? Ima li zapravo smisla pričati o nekom jedinstvenom standardu za sve škole i sve razine obrazovanja? Je li prečka postavljena ipak malo previsoko? Možda. No, može li takav hrabar korak iznjedriti neke sasvim konkretne koristi i pokazati neke čvrste prednosti u odnosu na postojeće metode informatičkog obrazovanja? Ponajprije, valja nam odlučiti koliko je informatičko obrazovanje djece nužno. Preciznije, trebaju li klinci zaista učiti programiranje, ili im je dovoljno objasniti kako će klikanjem po šarenim sličicama dobiti neke rezultate. Na ovo je pitanje teško odgovoriti. S jedne strane, potpuno je jasno kako velika većina djece i nakon godina učenja programiranja neće postati programeri, i vjerojatno nakon školovanja više nikad neće napisati niti jedan jedini red izvornog koda. S druge strane, sjetimo se predmeta poput tehničkog odgoja ili, ako se netko sjeća, domaćinstva. Učilo se zakrpati rupu na čarapi (danas se takve čarape bacaju u smeće), ispeći jaja (a hranimo se po restoranima), izrezati daščice po mjeri i sklopiti drvenu kutijicu (danas to kupujemo u “Sve po sedam kuna”)... Ako nam je, dakle, mjerilo potrebitosti nekog predmeta bazirano isključivo na korisnosti koju će od tog znanja imati opća populacija, nastava programiranja računala treba nam koliko i tehnički odgoj. Dapače, slijedom logike možemo mirno ukinuti i fiziku, biologiju i kemiju, jer – koliko zaista ta znanja koristimo u svakodnevnom životu? Dvostruko dapače, nakon završetka osnovne škole možemo ukinuti i matematiku, jer sve ono što se inače koristi u svakodnevnom životu, pa i više od toga - već je naučeno u osnovnoj školi. Takva utilitarna logika, naravno, posve je pogrešna i štetna: umjesto širenja obrazovanosti, ona forsira fokusiranje na stvari za koje se pretpostavlja da bi mogle biti bitne za dvadesetak godina, kad dijete završi edukaciju i krene u svijet biznisa. Takav sustav stvara fah-idiote koji, ako se slučajno dogodi da za dvadeset godina tržište ne treba njihovu usko usmjerenu pamet, završavaju na burzi i/ili brzinskoj prekvalifikaciji. Odustanemo li od strogo utilitarne logike, primjetit ćemo kako ti tehnički predmeti, iako možda ne utječu značajno u ostatku života velikog dijela populacije, imaju svoje čvrsto uporište u procesu edukacije jer ipak djetetu nešto značajno daju: osim što ga uče nekim stvarima, također prenose i određeni način razmišljanja i demonstriraju određenu logiku. To je možda najviše uočljivo u fizici i matematici, gdje se učenicima objašnjava jedan specifičan način razmišljanja, gdje stvari imaju početnu i završnu točku, a sve ono između moguće je precizno opisati, mjeriti, dokazati pa i predvidjeti. Jednako kao što čitanje lektire i učenje jezika blagotvorno djeluju na pismenost i mentalnu mišićavost stanovništva, tako to čine i predmeti poput matematike i fizike, svaki na svoj način.

Upload: radebap

Post on 09-Nov-2015

241 views

Category:

Documents


6 download

DESCRIPTION

python uvod

TRANSCRIPT

Python u kole 1/5U 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 svugdjeOvaj programski jezikkoristise 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 zaBlenderiPaint Shop Propiu se u Pythonu, a mnotvo softvera koristi ga kao ljepilo koje povezuje razliite dijelove aplikacije.Python je ivZa 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 programiranjaIako 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 kruhNije potrebno spominjati Google koji Python troi na vagone; i u maloj Hrvatskoj postoje tvrtke kojezapoljavajuljude sa znanjem programiranja u Pythonu. Pokuajte nai one koje zapoljavaju BASIC programere ili pascalae... (dozvolite da Visual Basic .NET ne smatram BASIC-om)

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 jednostavanLjepota 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 interaktivanUpravo 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 problemZa 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 uakademskojzajednici.Python je vrlo strog u sintaksiOvo 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/5Pogledajmo, dakle, koliko je Python jednostavan.U prolomnastavkuraspravljali 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 PythonaProgramski jezik Python dolazi na svim Linux i Macintosh raunalima, a na Windows raunala mogue ga je instaliratipreuzimanjemprograma sa slubenih stranica. Pretpostavljam da instalacija softvera nee biti problem. Ako netko eli, moe preuzetiPortable Pythoninstalaciju 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 linux2Type "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:

>>> blablaTraceback (most recent call last):File "", line 1, inNameError: 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 kojimUnicodeznakom, 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 / 26.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>>> a2.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: RatkoUnesi ime drugog uenika: StjepanPrvi 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: "ab", 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>>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 jeErici zatim izvriti nego utipkavati direktno u Python shell:parni = 0neparni = 0

while True:broj = int(float(input ("Unesi cijeli broj od jedan do deset: ")))if broj%2:neparni +=1else:parni +=1if broj>10 or broj >> Unesi broj od jedan do deset: 5Unesi broj od jedan do deset: 4Unesi broj od jedan do deset: 6Unesi broj od jedan do deset: 22Parnih brojeva: 3Neparnih 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 = 0while 1:broj = int(float(input ("Unesi cijeli broj od jedan do deset: ")))if broj%2:continueelse:parni +=1if broj>10 or broj 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 9Unesi drugi broj 44 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 5Unesi drugi broj 123123 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 PeroUnesi drugi broj StipoPero 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 = 10def 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 tip10Ispis varijable x unutar funkcijeBlabla>>>

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 = 10def funkcija():global xx = '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 tip10

Ispis varijable x unutar funkcijeBlabla

Ponovni ispis varijable x nakon povratka iz funkcijeBlabla

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 = 10def 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 = 1def funkcija1():b = 2print (a,b,c)def funkcija2():c= 3print (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 lakozabunitise.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 osopsus = 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 randomwhile 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: funkcijomdir(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 nudiPython 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 jeThe Python Tutorial, neto struniji i detaljniji prirunik na kojeg se moete baciti nakon to savaete prva dva.Style Guide for Python Codesvojevrstan 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 DejanoviKorak 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.Trendprilagoavanja 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 nazvanimPygame, 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 moguovdjepronai instalacijske datoteke, dok su jednostavne upute za korisnike Ubuntu, Debian i slinih distribucija navedene na krajuovoglinka, a korisnici Macintosha upute mogu pronaiovdje.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 pygameimport math, randompygame.init()ScreenX = 640ScreenY = 480run = 1screen = pygame.display.set_mode ((ScreenX, ScreenY))while run:for event in pygame.event.get():if event.type == pygame.QUIT: run = 0X = random.randint (1, ScreenX)Y = random.randint (1, ScreenY)Z= YColorR = 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+=2Y+=math.sin(X)*20pygame.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, ukljuujuiOpenGL... 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 uputamaovdje, Windowsai preuzimanjem gotovog instaleraovdje, a Macintoshevci nafink-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 sysfrom PyQt4 import QtGui, QtCoreclass 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 relativnojednostavannain.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 sysfrom PyQt4 import QtGui, QtCoreapp = 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 poEBCDICkodiranju, 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 stranaiskustva?