Funkcionalni python

Zanimljiva prezentacija na temu python + functional programming: http://ua.pycon.org/static/talks/kachayev

Ukoliko volite ovaj jezik i voljeli bi da vam kod izgleda ozbiljnije, svakako probajte primjeniti ove savjete. Najbolje od svega, na dobrom ste putu da pocnete razumjeti jezike koje koriste ozbiljna djeca: haskell, clojure ili ML. Ah da, Stop writing classes. :smiley:

Mislim da ima i boljih jezika za funkcionalno programiranje.

S druge strane elementi funkcionalnog programiranja u Pythonu su veoma korisni (funkcije kao objekti!), kad već nemamo function pointer kao u C-u :smiley:

Btw, ne kontam što insistiraju na sljedećem kodu:

  map(lambda x: x*2, [1,2,3])

kad je za Python prirodnije

[x*2 for x in [1,2,3]]

http://docs.python.org/2/tutorial/datastructures.html#list-comprehensions

list comprehensions su jedina stvar koja je u pythonu ljepsa od rubyja :wink:
sto se tice funkcionalnog programiranja - jednostavno mi je zao sto nije popularnije i sto su ovi dosadni objektno orijentisani jezici mainstream

Hm… obzirom da su funkcije u pythonu objekti prve klase, kao i varijable, ne vidim sto func. pointeri iz C-a mogu a da se ovdje ne moze.

Zato sto:

  • map se nalazi u skoro svim FP jezicima; sem toga, kao i svaka python funkcija moze se adaptirati, dodijeliti, proslijediti i sl.
  • lako se da paralelizirati sa pmap; samo na pocetku fajla stavis stavis map = pmap i tvoj kod je paralelizovan
  • omogucava operacije sa vise listi u isto vrijeme, npr.
map(operator.add, [1,2,3], [1,2,3]) => [2, 4, 6]
  • moze se kombinovati sa ostalim funkcijama viseg reda, npr:
stringfy = partial(map, str)
stringfy([1,2,3,4]) => ["1", "2", "3", "4"]

Tesko da ovo mozes uraditi sa list comprehensions, sem nekih jednostavnih iteracija, a da zadrzis njihovu primarnu namjenu: da ucine iteracije malo citljivijim.

Pocinje se popularizirati. Ipak FP zahtijeva poprilican mentalni shift pogotovo sto smo nauceni da razmisljamo kao hardver. Npr. ova prezentacija pokazuje da ako stanje pocnemo posmatrati s vremenskog stanovista, standardni pristup bas i nema previse smisla.

[quote=Sanel]
Pocinje se popularizirati. Ipak FP zahtijeva poprilican mentalni shift pogotovo sto smo nauceni da razmisljamo kao hardver. Npr. ova prezentacija pokazuje da ako stanje pocnemo posmatrati s vremenskog stanovista, standardni pristup bas i nema previse smisla.[/quote]

Da … mozda ce nasa djeca u starijim danima programirati u funkcionalnim programskim jezicima :slight_smile: ali dok ova ogromna java / c# infrastruktura ne ostari i dok njeni proponenti ne izumru proci ce jedno 2-3 generacije :slight_smile:
Tad cu nadam se ako ne mrtav, biti sretno penzionisan :slight_smile:

BTw. dobra prezentacija.

Ja sam ucio FP na tezi nacin (Haskell). Mozda nije najjasnije. Predmet na faksu, slab asistent i onda zelja da se samo polozi ispit. Sve o cemu pisete sam cuo ali pola ne znam ni sta je. Mozda sada obnovim to sto sam nekad “kao” znao, ako mi neko navede bar jedan razlog za ucenje istog. :slight_smile: Kad kazem razlog mislim da mi nekad to moze koristiti u zivotu.

Hehehe, vjerujem da cisti funkcionalni jezici nikada nece zamijeniti ove jezike za siroke narodne mase; to bi ti bilo kao da ferrari ili bentley zamijene golfa ili focusa :smiley: Mada mislim da ce se adaptirati u postojece, kao npr. Scala ili uvodjenje lambdi u C#/C++.

Haskell je kao Tai Chi: mozda ga nikada neces koristiti da nekoga razbijes (mada nije lose znati), ali je dobro za zdravlje. Salu na stranu, Haskell (kao i ostali FP jezici) uveliko uticu na to kako razmisljas, pises kod i generalno pristupas rjesavanju problema; na kraju uvijek mozes funkcionalno pisati u skoro svakom jeziku.

Evo slucaj koji sam nedavno imao: trebalo je klijentu isporuciti neki python program koji je radio neke netrivijalne stvari, u biti radio sve ono sto jedna baza radi, ali sa izricitim zahtjevima da se ne koristi baza zbog nekih legacy skripti. Za promjenu, probao sam da koristim FP sto je vise moguce; malo mi je vise vremena trebalo ali zato sam dobio sljedece:

  • puno kraci kod a kraci kod znaci manje bugova; nema klasa i slicnih gluposti; ciste funkcije koje rade samo jednu stvar; skoro sve petlje zamijenje sa map, apply, reduce, a manje petlji znaci manje bugova
  • besplatno testiranje: pokrenem python shell i testiram funkciju koju zelim bez da sada pisem testove i te zavrzlame; samom programu je inace trebalo poprilicno vremena da zavrsi dati posao
  • besplatni paralelizam: map = pmap i to je to

Nakon isporuke, kao i svaki klijent, doslo je masa dodatnih zahtjeva koji su bili izvan datog plana; da je kod bio napisan klasicnim OO pristupom, vjerovatno bi to prepisao 2-3 puta. Ovako, dodam novu funkciju, tu funkciju dodam u glavni dio koda i to je to. Interesantno je da je na kraju taj dio izgledao ovako:

func1(func2(param1, param2),
      func3(func4(param3), func5))

sada ako zagrade stavite ispred, na sta vas podsjeca? :stuck_out_tongue:

LISP! LISP! LISP! LISP!

I u Javu: http://www.techempower.com/blog/2013/03/26/everything-about-java-8/

Eh vidjeh kasno temu al da dodam i ja nešto.

Mene je shvatanje funkcionalne paradigme pomjerilo dosta naprijed. Upočetku nisam nikako mogao skuhati kako se to može programirati bez side effects… Sve mi se vrtilo oko promjenjivih.
A onda malo, pomalo…
Sviđa mi se ovo što je Sanel poredio FP sa taichi - jem. Funkcije su kao dobri duhovi jezika - nekako ih ne primjećuješ na prvu jer su nenametljive ( ako se ne radi o čisto funkcionalnom jeziku .
Ima odličan (kultni ) post koji poredi objektne i funkcionalne svjetove na simpatičan način: http://steve-yegge.blogspot.com/2006/03/execution-in-kingdom-of-nouns.html

E sad, čisto funkcionalni jezik i nije baš praktičan jer se nešto mora dešavati osim pukog vraćanja rezultata. Ali kad funkcija vrati objekat, onda nastane igranka.