我追求比这更优雅的东西。
实现 F 的最优雅方法是什么:
F(a,b,c,d,e)
->lambda args: a(b(c(d(e(*args)))))
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))
你可能想要reduce
:也许是这样的:
reduce(lambda x, y: y(x), [a, b, c, d, e], initial_value)
这适用于多个输入值,因此您可以拥有全部采用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