2012-03-24 15 views
6

W dzisiejszych czasach zaczynam uczyć się haskell, a gdy to robię, próbuję implementować niektóre pomysły, które nauczyłem się z niego w Pythonie. Ale uznałem to za trudne. Możesz napisać funkcję w Haskell, która przyjmuje inną funkcję jako argument i zwraca tę samą funkcję z odwróconą kolejnością argumentów. Czy można zrobić coś podobnego w Pythonie? Na przykład,Odwracanie kolejności argumentów funkcji w Pythonie

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 

można ewentualnie zrobić w Pythonie?

+1

Myślę, że możesz użyć * args, a następnie odwrócić() tę listę argumentów ... lub coś w tym stylu. –

Odpowiedz

11

Możesz utworzyć zamknięcie w Pythonie za pomocą zagnieżdżonych definicji funkcji. To pozwala utworzyć nową funkcję, która odwraca kolejność argumentów, a następnie wywołuje pierwotną funkcję:

>>> 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

Hmm, tak, to powinno działać. – yasar

+0

Dobrze, ale trochę gadatliwy, prawda. – georg

+2

@ thg435 Tylko w punkcie definicji 'flip'. Taka gadatliwość to * dobra * gadatliwość IMHO, ponieważ to wyjaśnia, co dzieje się wewnątrz klapki. – Ben

6

w czystym stylu funkcjonalnym:

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

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

print flip(divide)(3.0, 1.0) 

Nieco bardziej interesujący przykład:

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

NIE, to niesprawiedliwe! Odpowiedź Raymonda jest w rzeczywistości o wiele lepsza z praktycznego punktu widzenia, ponieważ pozwala zachować czytelne znaki na stosie. Ktokolwiek czyta ten wątek, powinien najpierw przeczytać odpowiedź. Proszę ponownie. – georg

Powiązane problemy