2013-05-21 3 views

답변

2

당신은 아마 reduce 원하는 :

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

당신의 목록이 반대가되어서는 안된다고 고치셨습니까? – jamylak

+1

'y (x)'는 함수 구성이 아닙니다. 나는 그것이'reduce (lambda f, g : lambda * args : f (g (* args)), [a, b, c, d, e])'이어야한다고 생각합니다. – nymk

+1

@nymk x는 이전 (부분) 값이고, y는 적용 할 현재 함수입니다 ... – fortran

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 

당신은 그것을 할도 수 한 줄에 있지만 덜 우아한 느낌이 들었습니다.

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

'A (B (1))''4' 복귀하지'6'. 당신의 기능이'b (a (1)) '라고 생각합니다. – Volatility

+0

대답에 'b (1) = 2'과'a (2) = 4 '라는 오류가있어서'F (a, b) (1) '는'6 '이 아니라'4 '이어야합니다. 함수는'a (b (* args)) '를 사용하지 않습니다. 그러나 – Joe

+0

@Volatility는'[-2 :: - 1]'시작 인덱스 – jamylak

1

당신이 모든 N paramters을 람다 있고, 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 
관련 문제