将一系列函数应用于某些参数

时间:2013-05-21 10:31:17

标签: python functional-programming

我正在追求比this更优雅的东西。

实现F的最优雅方式是:

F(a,b,c,d,e) - > lambda args: a(b(c(d(e(*args)))))

3 个答案:

答案 0 :(得分:2)

a = lambda n: n + 2
b = lambda n: n * 2
def F(*funcs):
    def G(*args):
        res = funcs[-1](*args)
        for f in funcs[-2::-1]:
            res = f(res)
        return res
    return G

>>> F(a, b)(1)
4

或者像@DanielRoseman

这样的reduce更好
def F(*funcs):
    def G(*args):
        return reduce(lambda x, y: y(x), funcs[-2::-1], funcs[-1](*args))
    return G

>>> F(a, b)(1)
4

你甚至可以在一行中完成它,但我觉得它不那么优雅:

def F(*funcs):
  return lambda *args: reduce(lambda x, y: y(x), funcs[-2::-1], funcs[-1](*args))

答案 1 :(得分:2)

你可能想要reduce:可能是这样的:

reduce(lambda x, y: y(x), [a, b, c, d, e], initial_value)

答案 2 :(得分:1)

这适用于多个输入值,因此您可以拥有lambdas,它们都会获取N个参数,并返回N个值。

def F(*funcs):
    def _(*arg):
        if len(arg) ==  1:
            arg = arg[0]
            for f in reversed(funcs):
                arg = f(arg)
        else:
            for f in reversed(funcs):
                arg = f(*arg)
        return arg
    return _

测试(多个):

a = lambda n,m: (n + m,m)
b = lambda n,m: (n*m,n)
print(F(a,b)(1,2))
>>> 
(3, 1)

测试(单曲):

a = lambda n: n + n
b = lambda n: n ** 2
print(F(a,b)(1))
>>> 
2