[python] Je tohle skutecne krasne reseni? (bylo Buducnost Pythonu: lambda, map, filter)

Petr Přikryl prikryl na atlas.cz
Pátek Březen 31 13:25:03 CEST 2017


Roman Miklos
> # pouzitie reduce()
> filez = reduce(lambda x,y: x+y, map(glob.glob, arguments))
> print filez

A v čem je ten kód elegantní. Ano, funguje. Ale v čem je
tak dobrý? Je dobrý proto, že mu někteří vyznavači rozumí
a neználci nikoliv? Je dobrý proto, že se za cenu nutné
znalosti tří speciálních funkcí dá řešení zapsat na jeden
řádek? V čem je ta přehlednost? Když bys to viděl poprvé
a neznal bys lambda kalkul, tak si budeš myslet, že takové
řešení vymyslel leda blázen! Vždyť se na to koukni nezaujatě.
ze seznamu masek chceš dostat seznam odpovídajících jmen
souborů. Kdybys nevěděl, čemu se říká "glob" a že plus
tady není sčítání ale append do seznamu a reduce v podstatě
nic neredukuje a jen elementy do toho seznamu (díky záhadnému
plus) složí... V čem je ten kód tak dobrý? Nic proti soutěžím
v bizarnosti kódu. Je to někdy dobrá zábava. Ale z hlediska
pochopení takový kód stojí za h***o (za hovno). A nebude
mu rozumět ani znalec lambda kalkulu, který nebude vědět
že plus tady není plus, protože glob.glob vrací seznam.


Roman Miklos napsal(a):
 > Mas pravdu, ze je to otazka vkusu, ale ja osobne
 > si myslim, ze tento list-comprehention
 > [f for a in arguments for f in glob.glob(a)]
 > je krkolomnejsi ako tento reduce
 > filez = reduce(operator.add, map(glob.glob, arguments))

No, ale ono se to dá napsat i takhle:

lst = [f
          for a in arguments
            for f in glob.glob(a)
       ]

Je to vlastně jen jinak napsané

lst = []
for a in arguments:
     for f in glob.glob(a):
         lst.append(f)


Myslím, že zanořený cyklus for zná mnohem více lidí,
než lambda kalkul.

pepr


Další informace o konferenci Python