2

我追求比更优雅的东西。

实现 F 的最优雅方法是什么:

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

4

3 回答 3

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

或者reduce像@DanielRoseman 这样更好

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))
于 2013-05-21T10:44:23.623 回答
2

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

reduce(lambda x, y: y(x), [a, b, c, d, e], initial_value)
于 2013-05-21T10:44:35.837 回答
1

这适用于多个输入值,因此您可以拥有全部采用N参数并返回N值的 lambda。

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
于 2013-05-21T11:16:07.780 回答