我们知道
list(map(f,[1,2],[3,4],[6,7]))
相当于
[f(1,3,6),f(2,4,7)]
我想知道内置函数tolist
是否等同于[]
,所以
tolist(a,b,c,d)
相当于[a,b,c,d]
。
我认为这样的函数在函数式编程中很有用。因为许多函数采用list参数而不是序列。
当然,一个简单的自定义方式是lambda *x:list(x)
,但我总觉得它在语法上很麻烦,尤其是在函数式编程风格中使用它,比如
map(lambda *x:list(x),[1,2],[3,4],[6,7])
所以我的问题是,如果没有这样的内置tolist
,我们是否可以使用像toolz
这样的FP包更优雅地构建它?
from toolz.curried import *
import operator as op
def addwise(*args):
return list(map(compose(reduce(op.add),lambda *x:list(x)),*args))
然后
addwise([1,2],[3,4],[6,7])
将给出
[10, 13]
答案 0 :(得分:1)
如果
函数很有用(....)因为许多函数都采用列表参数
这是lambda
表达不适合的一个好兆头。每次你想要应用这种模式时,你都不想重复自己。
可悲的是,我们远离Clojure的简洁性:
user=> (map + [1 2] [3 4] [6 7])
(10 13)
但我们仍然可以用相当Pythonic和优雅的方式表达它:
def apply(f):
def _(*args):
return f(args)
return _
可以用作:
from toolz.curried import reduce
map(apply(reduce(op.add)), [1,2], [3,4], [6,7])
甚至更好
map(apply(sum), [1,2], [3,4], [6,7])
虽然在这种情况下map
,但可以与zip
结合使用:
map(sum, zip([1, 2], [3, 4], [6, 7])))