use*_*964 8 python functional-programming toolz
我们知道
list(map(f,[1,2],[3,4],[6,7]))
Run Code Online (Sandbox Code Playgroud)
相当于
[f(1,3,6),f(2,4,7)]
Run Code Online (Sandbox Code Playgroud)
我想知道是否有tolist相当于的内置函数[],所以
tolist(a,b,c,d)
Run Code Online (Sandbox Code Playgroud)
相当于[a,b,c,d].
我认为这样的函数在函数式编程中很有用.因为许多函数采用list参数而不是sequence.
当然,一个简单的自定义方式是lambda *x:list(x),但我总觉得它在语法上很麻烦,特别是在函数式编程风格中使用它
map(lambda *x:list(x),[1,2],[3,4],[6,7])
Run Code Online (Sandbox Code Playgroud)
所以我的问题是,如果没有这样的内置tolist,我们是否可以使用FP包更加优雅地构建它toolz?
PS:我实际想要实现的是添加的线程版本(我知道numpy,但我现在不想使用它)
from toolz.curried import *
import operator as op
def addwise(*args):
return list(map(compose(reduce(op.add),lambda *x:list(x)),*args))
Run Code Online (Sandbox Code Playgroud)
然后
addwise([1,2],[3,4],[6,7])
Run Code Online (Sandbox Code Playgroud)
会给
[10, 13]
Run Code Online (Sandbox Code Playgroud)
如果
函数很有用(....)因为许多函数都采用列表参数
这是一个好兆头,lambda表明表达方式不合适。您不想每次应用此模式时都重复一遍。
遗憾的是,我们离 Clojure 的简洁性还很远:
user=> (map + [1 2] [3 4] [6 7])
(10 13)
Run Code Online (Sandbox Code Playgroud)
但我们仍然可以用一种相当 Pythonic 和优雅的方式来表达它:
def apply(f):
def _(*args):
return f(args)
return _
Run Code Online (Sandbox Code Playgroud)
可以用作:
from toolz.curried import reduce
map(apply(reduce(op.add)), [1,2], [3,4], [6,7])
Run Code Online (Sandbox Code Playgroud)
甚至更好
map(apply(sum), [1,2], [3,4], [6,7])
Run Code Online (Sandbox Code Playgroud)
尽管在这种情况下map,可以与zip:
map(sum, zip([1, 2], [3, 4], [6, 7])))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
137 次 |
| 最近记录: |