2012-03-24 39 views
6

Ngày nay, tôi bắt đầu học haskell, và trong khi tôi làm điều đó, tôi cố gắng thực hiện một số ý tưởng tôi đã học được từ nó trong Python. Nhưng, tôi thấy cái này đầy thách thức. Bạn có thể viết một hàm trong Haskell, có một hàm khác làm đối số và trả về cùng một hàm với thứ tự của đối số của nó được lật. Có thể làm một điều tương tự trong Python? Ví dụ:Lật thứ tự đối số của hàm trong Python

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 

Bạn có thể làm điều này bằng Python không?

+1

Tôi nghĩ rằng bạn có thể sử dụng * args và sau đó đảo ngược() mà đối số danh sách ... hoặc một cái gì đó như thế. –

Trả lời

11

Bạn có thể tạo một đóng bằng Python bằng cách sử dụng các định nghĩa hàm lồng nhau. Điều này cho phép bạn tạo một chức năng mới mà đảo ngược thứ tự tranh cãi và sau đó gọi hàm gốc:

>>> 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, vâng, điều này sẽ hoạt động. – yasar

+0

tốt, nhưng một chút tiết là nó không. – georg

+2

@ thg435 Chỉ ở điểm định nghĩa của 'lật'. Đó là loại verbosity là * tốt * verbosity IMHO, bởi vì nó làm cho nó rõ ràng những gì đang xảy ra bên trong flip. – Ben

6

Trong một phong cách chức năng thuần túy:

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

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

print flip(divide)(3.0, 1.0) 

ví dụ thú vị hơn Một chút:

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

KHÔNG, điều đó không công bằng! @ Raymond của câu trả lời là thực sự tốt hơn nhiều từ quan điểm thực tế, bởi vì nó giữ ngăn xếp dấu vết có thể đọc được. Bất cứ ai đọc chủ đề này nên đọc câu trả lời của mình đầu tiên. Hãy phản ứng lại. – georg

Các vấn đề liên quan