2012-03-24 3 views
6

요즘, 나는 haskell을 배우기 시작하고있다. 내가 그것을하는 동안 나는 파이썬에서 배운 아이디어를 구현하려고한다. 그러나, 나는 이것이 도전하는 것을 알았다. Haskell에서 함수를 다른 함수를 인수로 취해 인수의 순서를 뒤집어서 같은 함수를 반환 할 수 있습니다. 파이썬에서 비슷한 것을 할 수 있습니까? 예 :파이썬에서 함수의 인수 순서 뒤집기

def divide(a,b): 
    return a/b 

new_divide = flip(divide) 

# new_divide is now a function that returns second argument divided by first argument 

파이썬에서이 작업을 수행 할 수 있습니까?

+1

당신은 * args를 사용할 수 있고 그런 다음 argument list ... 또는 이와 비슷한 것을 reverse()한다고 생각합니다. –

답변

11

중첩 된 함수 정의를 사용하여 Python으로 클로저를 만들 수 있습니다. 순수한 기능적인 스타일에서

>>> from functools import wraps 
>>> def flip(func): 
     'Create a new function from the original with the arguments reversed' 
     @wraps(func) 
     def newfunc(*args): 
      return func(*args[::-1]) 
     return newfunc 

>>> def divide(a, b): 
     return a/b 

>>> new_divide = flip(divide) 
>>> new_divide(30.0, 10.0) 
0.3333333333333333 
+0

흠, 그래,이게 효과가있다. – yasar

+0

좋지만 조금 자세한 정보가 아닙니다. – georg

+2

@ thg435'flip'의 정의 시점에서만. 그런 종류의 자세한 정보는 * 좋은 * 자세한 정보 IMHO입니다. 플립 내부에서 무슨 일이 벌어지고 있는지 분명하게 보여주기 때문입니다. – Ben

6

:

flip = lambda f: lambda *a: f(*reversed(a)) 

def divide(a, b): 
    return a/b 

print flip(divide)(3.0, 1.0) 

좀 더 흥미로운 예 :

unreplace = lambda s: flip(s.replace) 

replacements = ['abc', 'XYZ'] 
a = 'abc123' 
b = a.replace(*replacements) 
print b 
print unreplace(b)(*replacements) # or just flip(b.replace)(*replacements) 
이것은 당신이 원래의 기능을 인수 순서를 반전 한 후 호출하는 새로운 기능을 만들 수 있습니다
+5

아니, 그건 공평하지 않아! @ Raymond의 대답은 스택 추적을 읽기 쉽게 유지하기 때문에 실제적인 관점에서 보면 실제로 훨씬 우수합니다. 누구든지이 글을 읽으면 그의 대답을 먼저 읽어야합니다. 다시 받아주세요. – georg