this보다 조금 더 우아합니다.일부 인수에 일련의 함수를 적용하십시오.
는 F를 구현하는 가장 우아한 방법은 무엇입니까 있도록 :
F(a,b,c,d,e)
->lambda args: a(b(c(d(e(*args)))))
this보다 조금 더 우아합니다.일부 인수에 일련의 함수를 적용하십시오.
는 F를 구현하는 가장 우아한 방법은 무엇입니까 있도록 :
F(a,b,c,d,e)
->lambda args: a(b(c(d(e(*args)))))
당신은 아마 reduce
원하는 :
reduce(lambda x, y: y(x), [a, b, c, d, e], initial_value)
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))
'A (B (1))''4' 복귀하지'6'. 당신의 기능이'b (a (1)) '라고 생각합니다. – Volatility
대답에 'b (1) = 2'과'a (2) = 4 '라는 오류가있어서'F (a, b) (1) '는'6 '이 아니라'4 '이어야합니다. 함수는'a (b (* args)) '를 사용하지 않습니다. 그러나 – Joe
@Volatility는'[-2 :: - 1]'시작 인덱스 – jamylak
당신이 모든 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
당신의 목록이 반대가되어서는 안된다고 고치셨습니까? – jamylak
'y (x)'는 함수 구성이 아닙니다. 나는 그것이'reduce (lambda f, g : lambda * args : f (g (* args)), [a, b, c, d, e])'이어야한다고 생각합니다. – nymk
@nymk x는 이전 (부분) 값이고, y는 적용 할 현재 함수입니다 ... – fortran