Vim*_*mal 19 python functional-programming clojure
Clojure有一个" - >"宏,它以递归方式插入每个表达式作为下一个表达式的第一个参数.
这意味着我可以写:
(-> arg f1 f2 f3)
Run Code Online (Sandbox Code Playgroud)
它的行为类似于(shell管道):
f3(f2(f1(arg)))
Run Code Online (Sandbox Code Playgroud)
我想用Python做到这一点; 然而,搜索似乎是一场噩梦!我无法搜索" - >",也无法搜索Python函数线程!
有没有办法超载,比如说,| 运算符,以便我可以用Python写这个?
arg | f1 | f2 | f3
Run Code Online (Sandbox Code Playgroud)
谢谢!
How*_*ard 21
或者可以通过以下方式使用reduce函数:
reduce(lambda x,f : f(x), [f1,f2,f3], arg)
Run Code Online (Sandbox Code Playgroud)
bti*_*lly 15
您可以自己轻松实现这样的功能.
def compose(current_value, *args):
for func in args:
current_value = func(current_value)
return current_value
def double(n):
return 2*n
print compose(5, double, double) # prints 20
Run Code Online (Sandbox Code Playgroud)
或者尝试http://dev-tricks.net/pipe-infix-syntax-for-python 一个提供如下语法的模块:
fib() | take_while(lambda x: x < 1000000)
| where(lambda x: x % 2)
| select(lambda x: x * x)
| sum()
Run Code Online (Sandbox Code Playgroud)
以霍华德的解决方案为基础:
def T(*args):
return reduce(lambda l, r: r(l), args)
def dbl(n):
return 2*n
T(5,dbl,dbl)
#=> 20
T(5,dbl,dbl,lambda x: 3*x)
#=> 60
Run Code Online (Sandbox Code Playgroud)