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

1行で実行することもできますが、エレガントではないように感じます:

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ます。

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 に答える