Постови

Приказују се постови за јануар, 2014

Rezime

Слика
15.7 Rezime  U ovom delu tutorijala sam ti objasnio kako da se izboriš sa raznoraznim greškama, kako da ih „uhvatiš“ i na neki način obradiš. Takođe si video kako se koriste blokovi komandi try-except i try-finally. Video si i kako da kreiraš sopstvene vrste grešaka i način kako da ih „podigneš“ u svom programu pomoću komande raise.  U sledećem delu tutorijala, mi ćemo da se prošetamo kroz neke module unutar Python-ovih standardnih biblioteka.
15.6 Naredba withIndeks16 Standardne biblioteke

Naredba with

Слика
15.6 Naredba with  Hvatanje grešaka sa komandom try, i kasnija obrada tih grešaka, pomoću komande finally, je najčešće korišćena metoda prilikom rada mnogih programera. Ali, postoji i komanda with, koja nam omogućava da se „hvatanje grešaka“ pri radu sa fajlovima,o uradi na mnogo jednostavniji način. Pre nego što objasnimo način rada pomoću with komande, potrebno je da ti objasnim šta se dešava „iza scene“ pri radu sa fajlovima u Pythonu.
Kada Python radi sa fajlovima, on koristi takozvane protokole. Nazovimo fajl jednostavno – datoteka. Ovaj protokol se koristi prilikom rada sa objektom koji nam je kreirala funkcija open().  Kada Python shvati da se radi o nekoj datoteci, njegov protokol uvek poziva funkciju datoteka.__enter__() , i to pre početka izvršavanja naredbi vezanih za rad sa fajlom, i uvek poziva funkciju datoteka.__exit__() nakon završetka naredbi vezanih za dotičan fajl.  Dakle, blok naredbi koji smo pisali ispod komande finally, će automatski biti pozvan od strane __exit…

Korišćenje komande try u kombinaciji sa komandom finally

Слика
15.5 Korišćenje komande Try u kombinaciji sa komandom Finally  U ovom delu upoznavanja sa greškama krećemo od pretpostavke da želimo da učitamo neku datoteku u naš program (ista analogija je za bilo koji fajl objekat koji se može upotrebljavati). Ako nigde pre toga nismo kreirali tu datoteku, kako mi možemo da budemo sigurni da ona postoji ili, ukoliko postoji, kako da se osiguramo da će taj fajl objekat biti pravilno zatvoren ukoliko se u radu pojavila neka greška? Odgovor je – lako. Mi možemo da definišemo potrebne naredbe u bloku koji ide ispod komande finally. Imaj na umu da se može koristiti i naredba except, kako bi hvatala neke druge greške, zajedno sa naredbom finally. U našem primeru, mi ćemo pokušati da radimo naše uobičajeno izčitavanje datoteke, ali ćemo to raditi sa pauzama od 2 sekunde, koje se javljaju posle prikaza svake linije iz fajla. To postižemo koristeći time.sleep() funkciju, kako bi se naš program pokretao sporije. Kada pokrenete skriptu, u toku njenog izvršava…

Podizanje sopstvenih grešaka

Слика
15.4 Podizanje sopstvenih grešaka  Mi ne želimo da naš program radi pogrešno, a pri kompleksnim zadacima nemožemo biti sigurni da ćemo mi 100% uspeti da predvidimo korisnikove akcije. Zato je, u mnogim slučajevima pametnije da mi sami, ukoliko se desi nešto, izbacimo neku informativnu grešku korisniku i prekinemo program. Možda je program bio važan, možda od tog programa zavisi dosta toga – bolje neka korisnik zna da se desilo nešto, nego da nam on lupa lopatom u glavu, zato što je izgubio svoje vreme i novac, jer nije znao da naš program ne funkcioniše. Zato je bitno znati kako da se podignu greške. Greške se podižu pomoću naredbe raise posle koje pišemo ime greške ili nekog objekta exception klase koji nam služi da bude okidač za izbacivanje greške. 
Greška koju želimo da podignemo mora da bude objekat klase koja, direktno ili indirektno, mora biti izvedena iz Exception klase (Exception mora biti njena superklasa). >>> class MojaGreška(Exception): ... def __init__(self,…

"Hvatanje grešaka"

Слика
15.3 „Hvatanje grešaka“Problem: Dobro, do sada sam ćutao, ali sada već pištim na uši. Zašto mi ti sve ovo govoriš? Greške – pa čini mi se da sam ih video dovoljno do sada, zar ne? U čemu je poenta? Odgovor: Na ovom mestu sam hteo da ti kažem poentu svega ovoga! Poenta je da postoje greške koje ti možeš napraviti, ili neke na koje ne možeš da utičeš, ili za koje nisi siguran da će se pojaviti. Ako ili kada se greška pojavi, pred tobom se nalaze dve solucije – da se uhvatiš za kosu i, vrišteći, da je čupaš iz sve snage, ili možeš sada da naučiš kako da rukuješ sa njima – da izbaciš neko obaveštenje korisniku, ili da predefinišeš program da radi na neki drugi način kako ne bi bilo posledica po rad nekog korisnika. Ti možeš da kontrolišeš exceptions pomoću komandi try i except. Suštinski to je jedna komanda - mi jednostavno stavljamo deo našeg programa, za koji sumnjamo da će biti problematičan i izazvati neku grešku, kao blok ispod naredbe try, a komande koje želimo da se izvrše ukoliko s…

Exceptions

Слика
15.2 Exceptions Pored grešaka koje možemo načiniti mi, kao programeri, a koje prekidaju izvršavanje programa, postoje i situacije u kojima se dešava neka greška za koju nije kriv naš program, već splet okolnosti (kao na primer – prekidanje rada programa od strane korisnika, ne postojanje fajla koji treba da se otvori i sl.). Na ove okolnosti mi kao programeri ne možemo da utičemo, ali možemo da ih predvidimo. Ali, pre svega toga moramo da ih upoznamo. Primer će nam biti obična input() funkcija. Mi ćemo da pokušamo da pitamo korisnika nešto, i da njegov unos dodelimo promenljivoj. To nam je već postala rutina, i verovatno se već pitaš šta tu može poći po zlu. Evo šta - kada te Python bude pitao da uneseš nešto pritisni tipke ctrl-d na tastaturi (ako koristite komandnu liniju u Windowsu - ctrl – z, ali je u IDLE-u ctrl + d, isto kao što sam ranije i napomenuo), i vidi šta se desilo:
>>> while True: ... s = input('Vaš unos je: ') ... print(s) ... Vaš unos je: …

Greške

Слика
15.1 Greške  Upoznat si da postoje više tipova grešaka, na primer:
>>> def funkcija() File "<stdin>", line 1 def funkcija() ^ SyntaxError: invalid syntax >>> print(funkcija) Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'funkcija' is not defined >>> U prvom slučaju sam zaboravio dvotačku na kraju definicije funkcije – Python me je momentalno obavestio da postoji greška u sintaksi, a sem što napomenuo da greška postoji – pokazao je i mesto na kom je tu grešku otkrio. Sledeća greška nam je bila prilikom korišćenja print() funkcije. Mi smo joj prosledili da nam odštampa nešto što nigde nije definisano, te nam je Python rekao da on to ne može da uradi, jer postoji greška u imenu (NameError – gde je, dođavola, ovo što tražiš od mene, jesi li siguran da se to tako zove?). U ovakvim slučajevima, kažemo da Python podiže (raise) grešku.  Takođe, k…

Exception (Hvatač grešaka)

Слика
15 Exception (po naški - „Hvatač grešaka")  Do sada si već mnogo puta naleteo na neke greške koje se javljaju u tvom programu, zapravo, od samog starta ovog tutorijala ja sam insistirao na (pa čak sam te i „uvlačio u“) situacijama u kojima tvoj program ili ne radi, ili ne radi onako kako se to od njega očekuje. Želeo sam da prihvatiš činjenicu da postoje greške i da su te greške – normalna pojava. No, do sada si se sretao sa nekim manjim greškama koje se nehotično mogu javiti, ali se nisi susretao sa načinom rada po kom bi te greške uspeo nekako da uhvatiš, pa, ukoliko se pojave da ih obradiš, na svoj način. Znaš da se greške javljaju ukoliko se  pojave određeni događaji u tvom programu koje Python ne može da obradi, ili ih obradi na način na koji mi nismo želeli.. Na primer, šta ako želiš da Python otvori i pročita neku datoteku, a ta datoteka nije prisutna na računaru (ne postoji)? Ili šta ako korisnik našeg programa, tu datoteku slučajno izbriše u trenutku kada je naš program…

Rezime

Слика
14.7 Rezime  U ovom delu tutorijala sam ti pokazao razne aspekte programiranja vezane za OOP, klase i objekate, i trudio sam se da objasnim i terminologiju koja se koristi prilikom rada. Ako se sećaš, uvek sam ti govorio da zamišljaš stvari kao objekte, i to nije bilo bez razloga - Python je strogo objektno-orijentisan, i brzo usvajanje i razumevanje svih ovih koncepata će ti biti od velike pomoći u nekom daljem radu.  U sledećem delu tutorijala ću te učiti kako da se izboriš sa greškama koje se javljaju u našim programima.

14.6 InheritanceIndeks15 Exceptions

Povezivanje klasa (Inheritance)

Слика
14.6 Povezivanja klasa (Inheritance)  Sada kada smo se malo i upoznali sa OOP načinom programiranja, hajde da vidimo još dodatnih mogućnosti koje nam ono pruža. Jedna od glavnih prednosti objektno orijentisanog programiranja je ponovna upotreba istog dela programa u različitim situacijama. Ovo se ni po čemu na razlikuje od upotrebe modula i funkcija – i to si već video, ali, upotrebom OOP-a, nama se pruža jedan fantastičan način da ovo postignemo - mehanizam povezivanja klasa (inheritance). Povezivanje klasa se najbolje može predstaviti kao određivanje odnosa između tipova i podtipova između klasa. Na primer, u određenim problemima ti možeš da razmišljaš u ovom smeru – direktor je radnik, sekretarica je isto radnik. Znači stvorićeš klasu radnik sa zajedničkim karakteristikama (plata, ime firme itd...), a zatim kreiraš klasu direktor sa karakteristikama tipa kontakti sa drugim direktorima, socijalne veze, znanje rukovođenja, sektori u kojima je zadužen. Zatim bi kreirali klasu sekreta…

Promenljive koje pripadaju klasi ili objektu

Слика
14.5 Promenljive koje pripadaju klasi ili objektu  Sve do sada, naglasak mog rada sa klasama i objektima je bio na metodama, tj na funkcionalnim delovima klasa i objekata. Sada želim da malo razjasnim i njihov deo koji se bavi podacima - varijablama. Kao što si možda do sada primetio, delovi koji „nose“ podatke, koje zovemo polja, u suštini nisu ništa drugo nego varijable, koje smo mi povezali sa klasom ili objektom pomoću specijelne oznake (self, ili bez) ili položaja (varijabla se nalazi u definiciji klase, to je varijabla te klase). Pristup tim varijablama izvan klase ili objekta (tj iz samog programa) radimo pomoću tzv specifikacije imena (namespaces) za klase i objekte. To nedvosmisleno govori Pythonu da imena promenljivih važe samo unutar određenih klasa ili objekata. Zato se i nazivaju name spaces (eng. Prostor u kome se pojavljuje neko ime). U prethodnom primeru sam ti pokazao konkretnu primenu namespeca. Npr. self.ime je bila promenljiva objekta klase Devojka. Pristup promen…

Metoda __init__

Слика
14.4 Metoda __init__  Postoji mnogo različitih metoda kojima se daju specifična i standardna imena, i koje, ako se definišu, imaju veoma poseban značaj za Python-ove klase. Ja ću te sada upoznati i pokazati značaj metode koja se zove __init__ . Prvo što se primećuje je naziv metode – on počinje i završava se sa dvostrukom donjom crticom. Ukoliko njen naziv ne napišemo upravo ovako, Python će smatrati da smo definisali nešto drugo, a ne __init__().
Zašto je za nas ovaj metod značajan? Pa zato što se __init__() metoda pokreće u onom trenutku kada mi kreiramo neki objekat u našem programu, tj. kada klasa inicijalizuje neki svoj objekat. Šta ovo znači? Ovo jednostavno znači da mi ovaj specijalan metod ne pozivamo direktno u svom programu, već ga Python automatski poziva prilikom kreiranja objekta neke klase. I, čemu ovaj metod služi? Ova metoda je korisna da bi se obavila bilo kakva inicijalizacija objekta. U njoj definišemo neke podrazumevane parametre koje želimo da naš objekat ima kada…

Metode

Слика
14.3 Metode Već sam ti govorio kako klase/objekti imaju metode, koje su baš kao i funkcije, osim što u definiciji imaju dodatnu self promenljivu kao parametar. Sada ću ti pokazati logičan primer koji je proistekao iz našeg kancelarijskog poslovanja. Krenimo od definisanja jednostavne metode koja ne trebamo da prosleđujemo nikakve argumente: >>> class Sekretarica: ... def salutiraj(self): ... print('Pozdravljam te Svemoćni Gospodaru.') ... >>> Đorđe = Sekretarica() >>> Milan = Sekretarica() >>> Đorđe.salutiraj() Pozdravljam te Svemoćni Gospodaru. >>> Milan.salutiraj() Pozdravljam te Svemoćni Gospodaru. >>>
U ovom primeru vidimo promenljivu self u akciji. Primeti da salutiraj() metoda "neprima" argumente,  ali smo mi definisali self u listi parametara: >>> Milan.salutiraj('Ko') Traceback (most recent call last): File "<stdin>", line 1, in <module> …

Klase

Слика
14.2 Klase Problem: Da li je ovo gore realan primer? Mogu li ga napisati u skripti, kako bi nešto konkretno radio za mene. Odgovor: Manje više jeste, ali sa druge strane i nije. U ovom trenutku, sa tvojim znanjem bi bilo isuviše ambiciozno krenuti u takav poduhvat. Kao i kod svega drugog, mi moramo da počnemo od početka, i zato moramo krenuti prvo od najjednostavnije moguće klase, da bi se videlo, i osetilo kako sve funkcioniše, a potom, kako ti znanje raste, možeš graditi i kompleksne stvari. Za početak, hajde da vidimo kako se stvara neka nova klasa. Znamo da treba da koristimo naredbu class, praćenu željenim imenom klase. Zatim ćemo kreirati neki uvučen blok koji je telo te klase. Budući da želimo najjednostavniju klasu, kao i kod funkcija, želimo da nam ovaj blok bude prazan, i to postižemo pomoću naredbe pass (za koju smo rekli da ne radi ništa). 
>>> class Sekretarica: ... pass ... >>> Sledeće što želim da uradim je da kreiram neke objekte (instance) ove …

Promenljiva self

Слика
14.1 Promenljiva self  Pre nego što prionemo na praktično izučavanje OOP-a, postoje još neke stvari koje se moraju objasniti. Jedna od tih stvari je i pojava promenljive self. Metode koje se definišu unutar neke klase imaju jednu bitnu karakteristiku koja ih razlikuje od načina na koji smo definisali obične funkcije - mi moramo da definišemo jedan dodatni parametar, koji mora da se navede na početku liste parametara u definiciji metode, i tom parametru mi ne dodeljujemo nikakvu vrednosti prilikom pozivanja metode na nekom mestu unutar našeg programa, već će tu vrednost da, za nas, obezbedi lično Python. Ova posebna promenljiva se odnosi na sam objekat te klase, i po običaju, daje joj se ime self, mada ti možeš da joj daš i bilo koje drugo ime. Programeri će ti preporučiti da koristiš baš ime self jer je to standard. Svako drugo ime koje bi želeo je u najmanju ruku, nepoželjno. Zašto? Pa zato što postoje mnoge prednosti korišćenja standardnog imena – svako ko želi da pročita tvoj prog…

Rezime

Слика
13.8 Rezime  U ovom delu tutorijala sam ti pokazao kako da kreiraš sopstvene programe/Python skripte. Na taj način si upoznao i prošao kroz razne faze koje su prisutne prilikom pisanja bilo kog programa. Sve ovo može da ti bide od neprocenjive koristi, ukoliko kreneš da stvaraš neki sopstveni program, što ti iskreno savetujem da uradiš ovoga trena! Samo izoluj neki problem koji imaš i kreni da praviš neki Python program, ne treba da se plašiš ukoliko negde zapneš jer nešto ne znaš – čovek se uči dok je živ!  A mi nastavljamo dalje, jer ima još mnogo toga zanimljivog. U sledećem delu tutorijala ću ti pokazati osnove objektno orijentisanog programiranja.
13.7 Proces razvoja
softveraIndeks14 Objektno-orijentisano
programiranje

Proces razvoja softvera

Слика
13.7 Proces razvoja softvera Problem: Čekaj, čoveče. Pa ja sam napravio nešto. Zašto bih ja uopšte vodio računa o nekim drugim stvarima, kada meni to sasvim odgovara, ovakvo, kakvo je? Odgovor: Pa, i kada zasadiš biljku moraš je zalivati. Kada imaš dete, moraš ga odgajati. Kada imaš kuću, moraš je održavati.... Zar nije onda logično da i kada napraviš program – moraš sa vremena na vreme da mu posvetiš neku pažnju?
I kao kod svega drugoga, i kod programiranja se mogu definisati faze, i pogodi - do sada smo zajedno prošli kroz sve te faze, tokom pisanja ovog malog programa, i one se – ni u čemu ne razlikuju od onoga što se radi i prilikom kreiranja kompleksnih projekata! Ove faze se mogu definisati na sledeći način:  Odgovorimo na pitanje „Šta?“ (Analiza problema) Odgovorimo na pitanje „Kako?“ (dizajn – krajnje rešenje) Zasukati rukave i napraviti (implementacija rešenja- realizacija plana – kreacija nečega novog) Osmišljavanje i primena testa (testiranje i otklanjanje grešaka u nekom si…