Advertisement
Guest User

Untitled

a guest
Apr 6th, 2016
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.55 KB | None | 0 0
  1. # 01 => Sta je proceduralno programiranje?
  2. #
  3. # Omogucava da kod koji resava jedan manji problem pozivamo
  4. # vise puta. Logika samog koda u okviru funkcija predstavljena je kao
  5. # blok u okviru koje se implementira odredjena funkcionalnost u cilju
  6. # postizanja ponovnog iskoriscenja koda, modularnosti, preglednosti,
  7. # lakseg upravljanja kodom, lakseg odrzavanja itd.
  8. #
  9. # 02 => Deklaracija metoda
  10. #
  11. # Metode se u Pythonu deklarisu na sledeci nacin (ovim redosledom) pri
  12. # cemu se mora voditi racuna o identaciji:
  13. #
  14. # 1: DEF
  15. # 2: FUNCNAME
  16. # 3: PROTOTYPE (OPTIONAL)
  17. # 4: DOUBLEDOT
  18. # 5: BLOCK
  19.  
  20. def helloworld():
  21. pass # do nothing =}
  22.  
  23. # Prva izjava u okviru funkcijskog bloka je obicno dokumentacija
  24. def helloworld():
  25. '''this is just a demonstration of python doc inside function'''
  26. pass
  27.  
  28. # Metod .__doc__ omogucava stampanje ove vrednosti
  29. print(myMethod.__doc__)
  30.  
  31. # Pored __doc__ Python sadrzi veliki broj ovih specijalnih metoda
  32. # preko kojih mozemo da saznamo odredjene detalje vezane za same
  33. # metode.
  34.  
  35. # Nakon dokumentacije (koja obicno predstavlja prvu liniju koda) pocinjemo
  36. # sa pisanjem logike programa. Taj blok koda se moze/ne mora zavrsiti
  37. # sa return izjavom koja vraca odredjeni rezultat.
  38.  
  39. def sortMe(listToSort):
  40. '''izmisljen blok koda ;-)'''
  41.  
  42. sortedList = []
  43.  
  44. # ...
  45. # ...
  46. # ...
  47.  
  48. return sortedList
  49.  
  50. # 02 => Prosledjivanje parametara
  51. #
  52. # Interesantna stvar kod Pajtona jeste nacin na koji se mogu proslediti,
  53. # odnosno obraditi parametri jedne metode. Postoje 4 vrste paramametara:
  54. #
  55. # => Required Args (tacno odredjen format prema poziciji)
  56. # => Keyword Args (setovanje vrednosti parametara na osnovu keywordsa)
  57. # => Default Args (default vrednost ukoliko param. ne bude prosledjen)
  58. # => Variable-length Args (argumenti promenljive duzine)
  59.  
  60. # REQUIRED ARGUMENTS
  61. #
  62. # Argumenti koji su definisani u tacno odredjenom formatu u smislu
  63. # da svaki naveden parametar ima svoju zahtevanu poziciju. Na osnovu
  64. # poziva funkcije odnosno prosledjivanja njenih parametara program
  65. # tacno zna koju vrednost vezuje za koji argument.
  66.  
  67. def authenticate(userName, password):
  68. print("userName: " + userName)
  69. print("password:", password)
  70. pass
  71.  
  72. authenticate("miksi", 123); # works!
  73. authenticate("miksi"); # missing 1 arg
  74.  
  75.  
  76. # KEYWORD ARGUMENTS
  77. #
  78. # Argumenti koji uticu na redosled dodeljivanja vrednosti prototipu.
  79. # Koriscenjem ove vrste argumenata se moze zaobici prethodni problem
  80. # sekvencijalnog dodeljivanja vrednosti.
  81.  
  82. def alphabet(a, b, c):
  83. print("A is:", a)
  84. print("B is:", b)
  85. print("C is:", c)
  86.  
  87. alphabet(1, 2, 3) # a=1, b=2, c=3
  88. alphabet(c = 1, b = 2, a = 3) # a=3, b=2, c=1
  89. alphabet(b = 1, a = 2, c = 3) # a=2, b=1, c=3
  90.  
  91.  
  92. # DEFAULT ARGUMENTS
  93. #
  94. # Argumenti koji omogucavaju zamenjivanje vrednosti argumentima ukoliko
  95. # neka vrednost nije provided u pozivu funkcije. Primer:
  96.  
  97. def alphabet(a = None, b = None, c = None):
  98. print("A:", a)
  99. print("B:", b)
  100. print("C:", c)
  101.  
  102. alphabet(1, 2, 3) # a=1, b=2, c=3
  103. alphabet(2, 3) # a=2, b=3, c=None
  104. alphabet(1, 3) # a=1, b=3, c=None
  105. alphabet(a=1, c=3) # a=1, b=None, c=3
  106. alphabet(a = 10, b = 15) # a=10, b=15, c=None
  107.  
  108. # VARIABLE-LENGTH ARGUMENTS
  109. #
  110. # U nekom trenutku mogu se javiti metode koje primaju odredjeni broj
  111. # parametara ali i one za koje se ne zna tacan broj jer je on nepredvidljiv.
  112.  
  113. def alphabet(a, b, c): # 3 params max
  114.  
  115. print("a", a)
  116. print("b", b)
  117. print("c", c)
  118.  
  119. alphabet(1,2,3, 4) # 4 params provided = error
  120.  
  121. # Var length primer gde *additional zapravo predstavlja tupple
  122.  
  123. def alphabet(a, b, c, *additional):
  124.  
  125. print("a", a)
  126. print("b", b)
  127. print("c", c)
  128.  
  129. for arg in additional:
  130. print("result(s): ", arg)
  131.  
  132. alphabet(1,2,3)
  133. alphabet(1,2,3, 4) # additonal args = 4
  134. alphabet(1,2,3, 4,5,6) # additional args = 4,5,6
  135.  
  136. # Sta je Tupple? Sta ce se desiti ako probamo da appendujemo jos
  137. # jedan element u okviru additionalargs tuppla?
  138.  
  139. ...
  140. additional.append(9) # throws an error, cause its a tupple!
  141. for arg in additional:
  142. print("result(s): ", arg)
  143. ...
  144.  
  145. # 03 => Python-like prosledjivanje vrednosti preko referenci
  146. #
  147. # Interesantna je razlika izmedju nacina na koji Perl, odnosno
  148. # Python upravljaju prenosom podataka.
  149. #
  150. # Perl potprogram (prenos po vrednosti => lista se razlikuje):
  151.  
  152. use strict;
  153. use warnings;
  154. use v5.10.1;
  155.  
  156. sub test {
  157.  
  158. my(@list) = @_;
  159. push(@list, 55);
  160.  
  161. say "@list inside" # RES => 1, 2, 3, 55
  162.  
  163. }
  164.  
  165. my @list = (1,2,3);
  166. test(@list);
  167. say "@list outside" # RES => 1, 2, 3
  168.  
  169.  
  170. # Python metod (prenos po ref. => lista uvek ostaje ista):
  171. def test(listy):
  172.  
  173. listy.append(15)
  174. print("Inside: ", listy) # RES => 1, 2, 3, 15
  175.  
  176.  
  177. listy = [1,2,3]
  178. test(listy)
  179. print("Outside: ", listy) # RES => 1, 2, 3, 15
  180.  
  181.  
  182. # PERL VS. PYTHON
  183. #
  184. # U prethodnom primeru prikazano je da Python podrazumevano koristi
  185. # reference za slanje parametara dok kod Perla to moramo da naglasimo
  186. # da bi on shvatio Ε‘ta je potrebno uraditi.
  187. #
  188. # PERL FIX?
  189.  
  190. sub test {
  191.  
  192. my($list) = @_;
  193. push(@$list, 55);
  194.  
  195. say "@$list inside" # RES => 1, 2, 3, 55
  196.  
  197. }
  198.  
  199. my @list = (1,2,3);
  200. test(\@list);
  201. say "@list outside" # RES => 1, 2, 3, 55
  202.  
  203. # REDEFINISANJE VREDNOSTI REFERENCE
  204.  
  205. listy = [1,2,3]
  206.  
  207. def test(listy):
  208.  
  209. # promenom originalne liste
  210. # na lokalnom nivou rezultuje..
  211. listy = [3,2,1] # new reference creation
  212. print("inside", listy) # RET => 3, 2, 1
  213.  
  214. test(listy)
  215. print("outside", listy) # RET => 1, 2, 3
  216.  
  217. # 06 => Annonymous functions
  218. #
  219. # metode u pajtonu u single-line maniru
  220. def single(x): print(x**2);
  221. single();
  222.  
  223. # Anonimne funkcije nisu vezane za ime (kao sto smo navikli, npr. authenticate())
  224. # vec se vezuju za odredjenu promenljivu.
  225. #
  226. # Anonimne funkcije u trenutku izvrsavanja koriste tzv. LAMBDA construct
  227. # koji predstavlja powerful koncept Python programskog jezika.
  228. #
  229. # Pattern:
  230. # nameOfAnonimousFunction = lambdaConstruct arg1, arg2, argN: code:
  231.  
  232. multiply = lambda x: x**2
  233. print(multiply(2)) # RES => 4
  234.  
  235. # Primer sa vise argumenata
  236. sum = lambda a, b, c: a + b - c
  237. print(sum(10,10,19))
  238.  
  239. # Prethodne 2 funkcije rade istu stvar samo sto je ovo anonimna
  240. # dakle vezana je za promenljivu. Vidimo da u anonimnoj nema
  241. # return izjave sto znaci da automatski uvek vraca rezultat.
  242.  
  243. # Anonimne funkcije u okviru funkcija :=)
  244. def setExponent(exp):
  245. return lambda num: num ** exp
  246.  
  247. num1 = setExponent(2)
  248. num2 = setExponent(4)
  249. num3 = setExponent(5)
  250.  
  251. print(num1(2)) # 2 ^ 2 = 4
  252. print(num2(4)) # 4 ^ 4 = 256
  253. print(num3(5)) # Calc Error :D
  254.  
  255. # 04 => Globalne, lokalne promenljive
  256.  
  257. luckyNumbers = [1, 2, 3]
  258.  
  259. def blockA():
  260. local_a = 77
  261. luckyNumbers.append(local_a)
  262.  
  263. def blockB():
  264. local_b = 88
  265. luckyNumbers.append(local_b)
  266.  
  267. def blockC():
  268. local_c = 99
  269. luckyNumbers.append(local_c)
  270.  
  271. blockA()
  272. blockB()
  273. blockC()
  274. print(luckyNumbers)
  275. # print(local_a) => throws an error
  276.  
  277. # 08 => Exceptions
  278. #
  279. # Najjednostavniji primer kada se ovo desava jeste deljenje sa nulom:
  280.  
  281. def divide(a, b):
  282. return a/b
  283.  
  284. print(divide(2,5))
  285. # print(divide(2,0)) ZeroDivisionError: division by zero
  286.  
  287. # Sta je exception?
  288. #
  289. # to je dogadjaj koji nastaje u vremenu izvrsavanja programa a koji
  290. # utice na to da se normalan tok izvrsavanja programa poremeti zbog
  291. # nemogucnosti interpretera da se izbori sa delom koda u okviru koga
  292. # se javila greska.
  293. #
  294. # Sta uraditi povodom toga?
  295. #
  296. # Ono sto se moze uraditi povodom toga jeste da se u trenutku pojavljivanja
  297. # exceptiona on uhvati i obradi na neki nacin tako da program ipak
  298. # nastavi sa radom iako je doslo do greske u radu.
  299.  
  300. # Syntax
  301. try:
  302. # kriticna linija koda
  303. except ExceptionI:
  304. # ako je ExceptionI bacen izvrsi ovaj blok
  305. except ExceptionII:
  306. # ako je ExceptionII bacen izvrsi ovaj blok
  307. else:
  308. # ukoliko ne dodje ni do kakvog exceptiona, izvrsi ovaj blok
  309.  
  310. # Prethodni primer ilustruje try i except blokove kojim se manipulise
  311. # nad izuzecima u programu.
  312. #
  313. # ExceptionI, ExceptionII su podklase glavne Exception klase i oni ce
  314. # biti pozvani u trenutku kada se desi greska koja odgovara njihovim
  315. # osobinama.
  316.  
  317. try:
  318. # res = 2/1
  319. # res = 2/0 => throw exception "oops, something happend"
  320. except: # podrazumevani exception
  321. print("oops, something happend")
  322. else:
  323. print("Cool, there are no exceptions!")
  324.  
  325. # Kao u prethodnom priemru (Exception I, II) mi mozemo navesti neke
  326. # od exceptiona za koje smatramo da se mogu dogoditi nad odredjenim
  327. # delom koda.
  328.  
  329. x, y = 5, 0
  330.  
  331. try:
  332. z = x/y
  333. except ZeroDivisionError:
  334. print("divided by zero")
  335. else:
  336. print("Cool, there are no exceptions!")
  337.  
  338. # ili
  339.  
  340. x, y = 5, 0
  341.  
  342. try:
  343. z = x/int("y")
  344. except ZeroDivisionError:
  345. print("divided by zero")
  346. except ValueError:
  347. print("expected int but parsed string")
  348. else:
  349. print("Cool, there are no exceptions!")
  350.  
  351.  
  352. # Recimo da je potrebno onemoguciti korisnika da prekoci korak
  353. # upisivanja neke int vrednosti. U tom slucaju, exception
  354. # ce biti bacen svaki put kada korisnik ne unese ocekivanu
  355. # vrednost (tip int)
  356.  
  357. while True:
  358. try:
  359. x = int(input("Please enter number:"))
  360. break
  361. except ValueError:
  362. print("Oops, Not a valid number!")
  363.  
  364.  
  365. # mozemo vise exceptiona da definesmo u jednoj liniji
  366.  
  367. except(Exception, IOError, ...):
  368.  
  369. # Pregled
  370. #
  371. # TRY - kriticna linija koda
  372. # EXCEPT - izvrsava se ukoliko dodje do izuzetka
  373. # ELSE - izvrsava se ukoliko ne dodje do bacanja izuzetka
  374. # FINALLY - izvrsava se svakako bez obzira na bilo kakav dogadjaj
  375.  
  376. try:
  377. res = 2/1
  378. except:
  379. print("error")
  380. else:
  381. print("cool, no exceptions no problems!")
  382. finally:
  383. print("im gonna print this anyway..")
  384.  
  385. # Jedan lep primer bacanja exceptiona u trenutku kada dodje do
  386. # pokusaja upisivanja u fajl za koji nemate dozvolu upisivanja
  387. # (read only file).
  388.  
  389. try:
  390. fh = open("filename", "w")
  391. try:
  392. fh.write("This is my test file for exception handling!!")
  393. finally:
  394. print "Going to close the file"
  395. fh.close()
  396. except IOError:
  397. print "Error: can\'t find file or read data"
  398.  
  399. # GET ERROR MESSAGE
  400. #
  401. # Neke klase izuzetaka pruzaju detaljnije informacije o prouzrokovanoj
  402. # gresci kroz vid argumenata.
  403. try:
  404. fh = open("filename", "w")
  405. try:
  406. fh.write("Helloworld.")
  407. finally:
  408. print("File written. Closing..")
  409. fh.close()
  410. except IOError as arg:
  411. print("~Error:" + arg)
  412.  
  413. # Raising an Exception
  414. myNumbers = [1,2,4]
  415.  
  416. def badLuckNum():
  417. for num in myNumbers:
  418. if num == 4:
  419. raise Exception("Num captured as 4")
  420.  
  421. print(num)
  422.  
  423.  
  424. # Hvatanje exceptiona?
  425. try:
  426. badLuckNum()
  427. except:
  428. print("something went wrong..")
  429.  
  430. # 09 => Recursive
  431. #
  432. # Sama ideja rekurzije je pomalo zbunjujuca.
  433. #
  434. # Rekurzija je metod resavanja odredjenog problema tako sto se on deli
  435. # na vise manjih, jednostavnijih za resavanje, do trenutka kada se ne
  436. # dobije dovoljno mali (potproblem) koji se moze resiti na jednostavan
  437. # nacin.
  438. #
  439. # Ovo se ostvaruje kroz vid sekvencijalnih poziva metode koja poziva
  440. # samu sebe. Dakle, ideja rekurzije jeste da metod poziva samog sebe.
  441. #
  442. # Razmotrimo sledeci primer gde metod say pokusava da pozove samog
  443. # sebe:
  444.  
  445. def say():
  446. print("Ok, I am in method 'say' now")
  447. say() # call say again
  448.  
  449. say() # call say, at the end: maximum recursion depth exceeded
  450.  
  451. # Zbog cega je doslo do greske?
  452. #
  453. # Kako bismo napravili efektivnu rekurzivnu funkciju, u okviru nje mora
  454. # postojati nesto sto se naziva "base case" ili "ending point". To u
  455. # najjednostavnijem prevodu znaci da mora da postoji nesto sto ce prekinuti
  456. # izvrsavanje funkcije u trenutku kada to bude bilo potrebno. U suprotnom,
  457. # program ce uci u beskonacnu petlju i izvrsavace se dok racunar ne "padne".
  458. #
  459. # Najjednostavniji primer je rekurzivna funkcija koja racuna faktorijal
  460. # nekog broja.
  461. #
  462. # Racunanje faktorijala:
  463. #
  464. # 5! = 5 * 4 * 3 * 2 * 1 # ili 5 * 4!
  465. # 4! = 4 * 3 * 2 *1 # ili 4 * 3!
  466. # 3! = 3 * 2 * 1 # ...
  467. # 2! = 2 * 1 # ...
  468. # 1! = 1 # ...
  469.  
  470. def makeFaktorialOf(num):
  471. # base case
  472. if num == 1:
  473. return 1
  474. else:
  475. return num * makeFaktorialOf(num-1)
  476.  
  477. print(makeFaktorialOf(5)) # => 120
  478.  
  479. # 5 * makeFaktorialOf(4) => 4*3*2*1
  480. # 4 * makeFaktorialOf(3) => 3*2*1
  481. # 3 * makeFaktorialOf(2) => 2*1
  482. # 2 * makeFaktorialOf(1) => 1
  483.  
  484. # Postoji izuzetno veliki broj problema koji se moze prikladno resiti
  485. # rekurzijom i to je razlog zbog koje se ona koristi.
  486.  
  487. # Primer sumiranja elemenata liste na nerekurzivan nacin:
  488. def sumNumbers(numList):
  489. summ = 0
  490.  
  491. for num in numList:
  492. summ = summ + num
  493.  
  494. return summ
  495.  
  496. print(sumNumbers([1,3,5,7,9]))
  497.  
  498. # Za rekurzivnu metodu potrebno je:
  499. #
  500. # 1) Podeliti problem na manje delove. Recimo:
  501. # 1, 3, 5, 7, 9
  502. #
  503. # 2) Sabirati poslednje 2 cifre (7 i 9 u ovom slucaju) u cilju
  504. # dobijanja sume.
  505. #
  506. # 3) Pozvati funkciju koja ce ponovo sabrati poslednje 2 cifre
  507. # i prethodno izracunatu sumu.
  508. #
  509. # 4) Izvrsiti izracunavanje dokle god ima elemenata u listi.
  510.  
  511. # (1 + (3 + (5 + (7 + 9))))
  512.  
  513. # Najdublji problem je 7+9 koji se moze resiti bez prolaska kroz petlje.
  514. # To znaci da se moze iskoristiti sledeca sekvenca izraza kako bi se
  515. # dospelo do rekurzivnog resenja za ovaj problem:
  516.  
  517. total = (1 + (3 + (5 + (7 + (9))))
  518. total = (1 + (3 + (5 + 16)))
  519. total = (1 + (3 + 21))
  520. total = (1 + 24)
  521. total = 25
  522.  
  523. # Vise rekurzivan primer prethodne sumNumbers metode gde je:
  524. #
  525. # numList[0] - uvek prvi element liste
  526. # numList[1:] - od drugog elementa pa do kraja liste
  527. #
  528. # def: suma = firstElem(List) + suma(OstaliIzListe)
  529.  
  530. def sumNumbers(numList):
  531. if len(numList) == 1:
  532. return numList[0]
  533. else:
  534. return numList[0] + sumNumbers(numList[1:])
  535.  
  536. print(sumNumbers([1,3,5,7,9])) # 25
  537.  
  538. # print to see whass going on:
  539. def sumNumbers(numList):
  540. if len(numList) == 1:
  541. return numList[0]
  542. else:
  543. print(numList[0] , " + " , numList[1:])
  544. return numList[0] + sumNumbers(numList[1:])
  545.  
  546. print(sumNumbers([1,3,5,7,9]))
  547.  
  548. # serija rekurzivnih poziva bi izgledala:
  549. sum(1,3,5,7,9) = 1 + # plus lista ispod
  550. sum(3,5,7,9) = 3 + # plus lista ispod
  551. sum(5,7,9) = 5 + # plus lista ispod
  552. sum(7,9) = 7 + # plus lista ispod
  553. sum(9) = 9
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement