Citat:
Shvatam tvoju poentu. Pojednostavljivanje. I to je nešto čemu treba težiti.
Da, ali nije sve samo u tome, vec u tome da ti se fragmenti znanja koje usvajas svakim danom sloze na pravom mestu u glavi. Ti si naucio prve engleske reci i odmah si uzeo Šekspira. Ili još gore, uzeo si Čoserove Kenterberijske priče, koje svega 5% visoko obrazovanih rodjenih Engleza ume da procita i uopste shvate sta su tu procitali. Na tom nivou mozda ces i uspeti da shvatis neka poglavlja, ali da sklopis celinu od svega toga - hm, tesko.
Tako je to i u programiranju. Cilje je da savladas dobro osnove, tako da kada ti se pojavi problem tacno znas da li da koristis listu, recnik ili mozda najobicniji int/float/str ... stvari tipa "list comprehension" su trikovi, ali oni ti nece pomoci ako ne shvatis OSNOVE. A osnove su da su brojevi nizovi jedinica i nula. Da je svako slovo ('A', 'B', 'C' itd. takodje niz jedinica i nula kodirana ASCII kodom. Recimo, 'A' je 65 (decimalno), odnosno 01000001, 'B' je 66 (odnosno 01000010) itd. Koliko slova ima izmedju A i M, ne racunajuci sama slova A i M? Kako ces to prebrojati? Da, verovatno ces reci:
Code:
alfabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
broj = alfabet.find('M') - alfabet.find('A') - 1
dok ce neko ko je ucio programiranje od temelja, kako i dolikuje, znati da kaze:
Code:
broj = ord('M') - ord('A') - 1
Zato sto zna da je svako slovo interno predstavljeno ASCII kodom i da se ASCII kod slova x dobija funkcijom ord(x), a karakter ciji je ASCII kod n se dobija funkcijom chr(n).
Kada naucis te stvari, na redu su slozenije. Recimo, upravljanje datumima i vremenom. Koliko je dana proteklo od Bozica do Uskrsa ove godine? Ili - zadatak sa casova programiranja iz srednje skole iz vremena mog skolovanja: ispisati vremena u toku dana (hh:mm:ss) kada se kazaljke na satu poklope. Ideja je da naucis manipulaciju vremenima i module time i datetime. A mozes i pesice, koristeci samo int i float ... Moja preporuka bi bila da pocnes od tog "pesackog" nacina.
Onda dolaze na red liste. Taman mislis da si naucio liste i krenes:
Code:
>>> a = [1, 2, 3]
>>> b = a
>>> b
[1, 2, 3]
Bas lepo radi. Ali onda u listu a dodas jos jedan element:
Code:
>>> a.append(10)
[1, 2, 3, 10]
>>> b
[1, 2, 3, 10]
WTF?! Zasto? Kako?! Odakle???!!! Pa ja sam azurirao listu a, listu b nisam ni taknuo - zar ne? A pazi sad ovo - hocu da izbrisem treci element liste b:
Code:
>>> del b[2]
>>> b
[1, 2, 10]
>>> a
[1, 2, 10]
Hmmm ... izgleda da sam ja nekako "vencao" ove dve liste, pa kud svi Turci tu i mali Mujo? E vidis, tu vec moras da zaviris malo i ispod haube. Neke slozenije strukture u Pythonu (liste, skupovi i recnici) se ponasaju malcice drugacije od nekih drugih (int, float, str, bool ...). Eventualno, naici ces na neko brzinsko objasenjenje, poput
ovog ovde. Ok, covek je to objasnio na bazicnom nivou, cisto da ukapiras da kada imas listu a, pa kazes b=a, ti zapravo ne kopiras VREDNOST liste a u listu b, vec postavis POINTER liste b tamo gde je a. Ako ti treba kopija liste to mozes da uradis na vise nacina, covek je to lepo objasnio - npr:
Code:
a = [1,2,3]
b = list(a)
Ovim si dobio dve nezavisne liste, sto mozes da proveris i ako u Python shellu otkucas id(a), odnosno id(b). Tako, da ako sada dodajes elemente listi a lista b se nece menjati. Identicno se ponasaju i recnici, odnosno hash tabele:
Code:
>>> a={'name': 'John'}
>>> b=a
>>> a
{'name': 'John'}
>>> b
{'name': 'John'}
>>> a['surname']='Doe'
>>> a
{'surname': 'Doe', 'name': 'John'}
>>> b
{'surname': 'Doe', 'name': 'John'}
Ali zato:
Code:
>>> a={'name': 'John'}
>>> b=dict(a)
>>> a
{'name': 'John'}
>>> b
{'name': 'John'}
>>> a['surname']='Doe'
>>> a
{'surname': 'Doe', 'name': 'John'}
>>> b
{'name': 'John'}
I time si shvatio stvar ... mozda ... onako povrsno. Da bi shvatio stvari do kraja moras da se udubis jos vise u nacin na koji je Python implementiran. Lep tekst na tu temu je dat
ovde.
Kada to ukapiras, onda ces umeti da objasnis razliku izmedju ovog koda:
Code:
>>> def modify(b):
... b.append(3)
...
>>> a=[1,2]
>>> modify(a)
>>> a
[1, 2, 3]
i ovog drugog:
Code:
>>> def modint(x):
... x += 1
...
>>> y = 3
>>> y
3
>>> modint(y)
>>> y
3
>>>
Iskusniji programeri, koji su vec prosli kroz nekoliko drugih, klasicnih programskih jezika, znaju za princip prenosa argumenata po vrednosti i po imenu (referenci, deskriptoru ...). U prvi mah ce shvatiti da Python prenosi skalare (bool, int, float ...) po vrednosti, a vektore (lists, dicts, sets) po referenci. Kasnije, kada se udubi u materiju, shvatice zasto je to tako. Odgovor je dat i
ovde. Opet - rec je o PRINCIPU koji se uci. Jednom kada to savladas, shvatices kako to radi i u nekim drugim jezicima.
Ovo sto sam ti opisao gore su tek samo mali detalji. Kockice mozaika ... A ti detalji mogu da ti upropaste program koji pises do te mere da ga analiziras danima i uopste ne kapiras zasto ne radi ... a u pitanju su neke banalne stvari koje nisu naucio u pocetku, jer si krenuo da ucis Python s krajeva.
Mislim da je sada vreme da malo iscitas poglavlja o strukturama podataka i shvatis kako stvari funkcionisu u Pythonu. Usput mozes da radis i zadatke iz te zbirke, ali bez solidnog razumevanja teorije tapkaces u mestu ...
Nemoj ovo da shvatis kao neko pametovanje. Svi smo prosli manje-vise kroz tu istu metodu uzaludnih pokusaja u svojim prvim programerskim koracima. Pre ili kasnije smo shvatili da smo izgubili dosta vremena, pa smo seli i ucili ...
[Ovu poruku je menjao B3R1 dana 29.05.2020. u 16:28 GMT+1]