[python] Buducnost Pythonu: lambda, map, filter

Roman Miklos RMiklos na pss.sk
Pondělí Listopad 13 18:14:26 CET 2006


Tiez som cital, co napisal Guido
v tom clanku
All Things Pythonic
The fate of reduce() in Python 3000
http://www.artima.com/weblogs/viewpost.jsp?thread=98196

Ale rozumel som z toho akurat ...blabla...reduce()...blabla..., teda 
ziadne dovody.

Aj ked reduce pouzivam len v spojeni s glob(), prave preto, ze toto 
pouzitie  uvadzaju v kapitole 9 knihy
http://www.grada.cz/katalog/kniha/naucte-se-python/ (pozri priklad dole) 
povazoval som pouzite reduce() za pytonicke.
Naopak Guido sa teraz snazi v tom horeuvedenom clanku s nadpisom 'All 
Things Pythonic' povedat asi to, ze reduce() nie je pytonicky.

Kazdopadne si myslim. ze reduce() ma opodstatnenie, kto tomu rozumie, moze 
robit veci elegantnejsie. 
Tu je par jednoduchych prikladov na reduce():

--- reduce.py ---
# reduce(function, list [, init_val]) 
# aplikuje fukciu 2 argumentov na prvky zoznamu zlava do prava, 
# t.j. tak, aby sa zoznam zredukoval na jednu hodnotu.
# S init_val mozno zadat inicializacnu hodnotu
# Napriklad:
# reduce(lambda x,y:x+y,range(1,6),5) 
# vypocita 5+(((((1+2)+3)+4)+5))=20.

# priklady:


# suma 1,..,n
suma1=lambda n: reduce(lambda x,y: x+y, range(n+1))
print "suma(%d)=%d" %(5, suma1(5))


# suma zoznamu
suma2=lambda l:  reduce(lambda x,y: x+y, l)
l = range(6)
print "suma(%s)=%d" % (l, suma2(l))


# faktorial
faktorial=lambda n: reduce(lambda x,y: x*y, range(2, n+1), 1)
print "faktorial(%d)=%d" % (0, faktorial(0))
print "faktorial(%d)=%d" % (5, faktorial(5))


# Globbing - rozvinut wildcards ?, * v cestach k suborom
import sys, operator, glob
arguments = sys.argv[1:]
# ak su zadane nejake command-line argumenty (napr. editor.py oop1*.* 
*.py~)
if arguments:
 
  # pouzitie reduce()
  filez = reduce(lambda x,y: x+y, map(glob.glob, arguments))
  print filez

  # bez pouzitia reduce()
  filez=[]
  for arg in arguments:
    arg_list=glob.glob(arg)
    filez += arg_list
  print filez
--- koniec ---

Myslim, ze reduce() nebude nahradeny nijakou inou alternativou. Jednoducho 
to co reduce() robil za teba, budes musiet naprogramovat.




Jakub Hegenbart <kyosuke na seznam.cz> 
Sent by: python-bounces na py.cz
13.11.2006 15:34
Please respond to
Konference PyCZ <python na py.cz>


To
Konference PyCZ <python na py.cz>
cc

Subject
Re: [python] Buducnost Pythonu: lambda, map, filter






Petr Prikryl wrote:
> Jde o to, že Python může k reduce a lambda nabídnout 
> alternativy, které nelze srovnávat s primitivností 
> podmíněného skoku. Ty alternativy mi připadají lepší
> než reduce/lambda.
Dobře, tohle mě zajímá: Jakou alternativu nabízí Python k foldl (které 
si přejmenoval na ?reduce?)? U map je to jasné, přeci jen list 
comprehension ani generator expression nejsou o moc horší, navíc 
generator expression má lazy sémantiku, což je Good Thing(TN). Ale u 
toho reduce() trošku tápu.

Jakub Hegenbart
_______________________________________________
Python mailing list
Python na py.cz
http://www.py.cz/mailman/listinfo/python

Mgr. Ing. Roman MIKLÓŠ 
Prvá stavebná sporiteľňa a.s. 
Bajkalská 30, P. O. Box 48 
829 48  Bratislava 25 
Tel.: +421/ 2 / 582 31 174 
Fax: +421/ 2 / 582 31 109 



Další informace o konferenci Python