To naj ne bi bila ne predavanja ne vaje. Seveda bi kaj povedal in potem bi kaj programirali, vse skupaj pa bi bilo bolj "razsuto". Oblika bo odvisna tudi od tega, koliko bi vas prihajalo. Trudil pa se bom, da to ne bi postala le diskusija med ljudmi, ki pravzaprav že vse vejo.

Najbrž vam bom dajal celo domače naloge. Neobvezne, jasno. :) Včasih bom objavil zapiske (če imam slučajno že kaj pripravljenega), večinoma pa bodo samo linki na ustrezne strani, tipično v dokumentaciji Pythona.

Tole je grob osnutek vsebine. Najbrž ne bo časa za vse. Če nas zanese čisto drugam, tudi prav. Morda imate tudi sami kakšno idejo, kaj vas zanima. In tisti, ki o kakšni temi veste več od mene, jo lahko tudi prevzamete.

Imenski prostori: pri Programiranju 1 vidimo samo, da so "spremenljivke" imena za objekte, da se lahko več spremenljivk nanaša na isti objekt in tako naprej. Ne govorimo pa dosti o tem, da se Python stalno igra z imenskimi prostori - razredi, objekti, moduli, funkcije ... so le imenski prostori. Niti ne povemo, kako je to narejeno. Tema ni direktno uporabna, je pa pomembna, da boljše razumemo, kar sledi.

Moduli: pri Programiranju 1 se jih naučimo uvažati in (v bistvu) pisati, nič pa o njihovem gnezdenju, o tem, kako (in odkod) se uvažajo, kako organiziramo večje število modulov, kako določimo, kateri objekti modula so vidni navzven...

Sklad: kaj se dogaja, ko se funkcije kličejo med sabo. Imenski prostori funkcij so v resnici na skladu. Kaj je še na njem? Kako je narejen sklad, kako brskamo po njem?

Sloti: Podobno kot v prevajanih jezikih lahko deklariramo spremenljivke, lahko tudi v Pythonu napovemo, katere spremenljivke (in nobene druge) bodo imeli objekti določenega razreda. To pospeši izvajanje in, predvsem, varčuje s pomnilnikom.

Named tuple: je nekaj med sloti, slovarji in seznami. Čeprav se imenuje tuple. :)

Atributi razredov: razred je objekt in ker je objekt, ima lahko svoje atribute. To pri Programiranju 1 čisto zamolčimo, čeprav je zelo uporabno. Metode potem niso nič drugega kot atributi razreda.

Vezane in nevezane metode: Metoda je atribut razreda, ki pa ni vezan na noben objekt. Ko spredaj dodamo self., jo vežemo. Razumevanje te "mehanike" je lahko zelo uporabno.

Prvorazredni objekti: pri Programiranju 1 nekako privzamemo, da lahko funkcijo posredujemo kot argument. Že tega, da bi funkcijo vrnili kot rezultat, nismo počeli. Sicer pa je v Pythonu vse objekt, torej je lahko tudi vse, recimo, argument ali rezultat funkcije. Funkcija lahko prejme razred -- ali pa sestavi in vrne razred. Funkcija lahko prejme modul kot argument...

Dekoratorji: dekoratorji so funkcije, ki ovijejo funkcije. Točneje, so funkcije, ki kot argument prejmejo funkcijo in vrnejo funkcijo, ki (navadno), kliče tisto funkcijo, vse skupaj pa se dela, kot da je prvotna funkcija. Ne, pravzaprav lahko prejmejo tudi ... No, malo je komplicirano. :)

Property: property je metoda, ki se obnaša, kot da bi bila atribut. Približno tako. Propertyje uporabljamo, da simuliramo atribute, ki jih ni (recimo sproti izračunamo neko vrednost), ali da z njimi nadziramo dostop do (privatnih?) atributov. V Pythonu ni skrivanje atributov in metod, dekoratorji pa gredo nekako v to smer.

Statične in razredne metode: metode, ki ne potrebujejo self-a, ali pa kot argument namesto self-a dobijo razred.

__new__: Metoda, ki v resnici konstruira objekt. init ga samo "dopolni". new je močnejši.

Closure: Funkcije, ki so deklarirane znotraj funkcije, lahko obdržijo vrednosti njenih spremenljivk tudi po tem, ko se zunanja funkcija neha izvajati. Ta opis zveni čisto nesmiselno, ampak ... odkar vem za closure, nekatere reči programiram veliko preprosteje.

Lambda: to pri Programiranju 1 samo malo omenimo. Za resno delo jo je potrebno poznati.

Generatorji, iteracija: O tem se da povedati še veliko več kot pri Programiranju 1. Pa o modulih functools in itertools tudi. Brez njih se skoraj ne da živeti. :)

Posebne metode: Tudi o tem pri Programiranju 1 ne povemo kaj veliko. Ko jih poznamo, šele zares vemo, kako deluje Python.

Callable: Funkcije so v resnici samo objekti, ki jih je mogoče poklicati. In poklicati je mogoče tudi objekte, ki niso funkcije.

Type: kaj je v resnici type? In kaj je int? Je to funkcija? Razred? Če je type objekt, kakšnega tipa je? Kaj sploh je "tip" oz. "razred" v Pythonu? (Namig: razred je samo objekt, ki ga je mogoče poklicati. No, poleg tega je razred tudi imenski prostor.)

Meta razredi: Meta razred je razred, ki sestavlja razrede.

MRO, mix-in, monkey patching: Še nekaj o tem, kako delajo razredi.

ABC: Abstract base classes - način, na katerega razred pove, kaj zmore.

Konteksti: S konteksti lahko dosežemo, da se pred izvajanjem in po izvajanju določenega dela kode izvede koda, ki kaj pripravi ali počisti. Pri delu z datotekami, recimo, naj bi se uporabljalo kontekste. Ko enkrat veš zanje, lahko marsikaj narediš bolj praktično. Uporabni pa so predvsem za večje programe.

Uporabni moduli/knjižnice:

  • re: regularni izrazi
  • pickle: shranjevanje objektov v datoteke/nize (serializacija)
  • unit testi: način, na katerega pri Programiranju 1 preverjamo domače naloge, se v resnici uporablja tudi v industriji
  • pip: program za nameščanje/odmeščanje knjižnic
  • virtualenv: program, s katerim lahko nameščamo knjižnice znotraj virtualnih okolij za Python. Preprečuje zmedo in pomaga, da lahko brez težav delamo z več verzijami Pythona
  • numpy: knjižnica za delo z večdimenzionalnimi tabelami
  • cython: prevajalnik iz Pythona v C (ki pa mu je potrebno malo pomagati)
  • ctypes: knjižnica, s katero iz Pythona kličemo programe v Cju
  • ipython & notebook/jupyter: uporabnejša konzola
  • matplotlib: knjižnica za risanje grafov
Zadnja sprememba: sobota, 12. marec 2016, 22.27