Python中的Clojure样式函数"threading"

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)


Jul*_*ard 9

或者尝试http://dev-tricks.net/pipe-in​​fix-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)


fog*_*gus 8

以霍华德的解决方案为基础:

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)