私はこれよりももう少しエレガントなものを求めています。
次のように F を実装する最もエレガントな方法は何ですか?
F(a,b,c,d,e)
->lambda args: a(b(c(d(e(*args)))))
私はこれよりももう少しエレガントなものを求めています。
次のように 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
1行で実行することもできますが、エレガントではないように感じます:
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
ます。
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