2013-01-23 33 views
5

Tôi đang nghiên cứu tính chất của hàm trong Python và tôi đã xem một bài tập yêu cầu:Chức năng Gọi với 3 hoặc nhiều trường nhập đối số - hàm()()()

Viết hàm trả về de power của một số. Điều kiện: Hàm chỉ có thể lấy 1 đối số và phải sử dụng hàm khác để trả về giá trị của sức mạnh của một số đã cho.

Các mã mà giải quyết bài tập này là:

def power(x): 
    return lambda y: y**x 

Ví dụ, nếu chúng ta muốn biết giá trị của sức mạnh: 2^3, chúng tôi sẽ gọi hàm như thế này: sức mạnh (3) (2)

Dưới đây là những gì tôi muốn biết:

có cách nào để viết một hàm rằng, khi được gọi, có cấu trúc tương tự: function()()(). Nói cách khác, có thể viết một hàm, yêu cầu ba hoặc nhiều dấu ngoặc đơn()()() khi được gọi? Nếu có thể, vui lòng cho tôi một mã ví dụ về chức năng đó và giải thích ngắn gọn về nó?

Ngoài ra:

def power(x): 
    def power_extra(y): 
     return y 

    def power_another(z): 
     return z 

    return power_extra and power_another 

có thể?

+0

Để biết thông tin của bạn, điều này được gọi là currying. – rlms

Trả lời

4

Chắc chắn bạn có thể:

def power_times(k): 
    """use as power_times(k)(x)(y) => k * y^x""" 
    return lambda x: lambda y: k * y**x 

print power_times(2)(3)(4) # returns 2 * 4^3 = 128 

Khi bạn gọi chức năng này với lập luận 2 (power_times(2)), nó sẽ trả về một hàm lambda hoạt động như lambda x: lambda y: 2 * y ** x (có nghĩa là, giống như chức năng ban đầu của bạn, chỉ với một thêm " lần 2 ").

Bạn có thể stack như nhiều lambda s trên đầu trang của mỗi khác như bạn thích:

def many_lambdas(x): 
    """many_lambdas(x)(y)(z)(q) => x + y * z^q""" 
    return lambda y: lambda z: lambda q: x + y * z ** q 

print many_lambdas(1)(2)(3)(4) # prints 163 

Trên thực tế, nó có thể là thậm chí rõ ràng hơn nếu bạn bỏ qua sử dụng def ở tất cả, và chỉ cần viết:

many_lambdas = lambda x: lambda y: lambda z: lambda q: x + y * z ** q 
Hoặc bạn có thể bỏ qua sử dụng lambda và sử dụng chúng làm chức năng lồng nhau:
+0

Có thể có hai hàm lồng nhau bên trong hàm mức cao nhất và cung cấp các đối số với cấu trúc: function () (<đối số cho hàm lồng nhau 1>, <đối số cho hàm lồng nhau 2>) hoặc theo cách khác ? – Testing360

+0

@ JoãoCastro: Bạn sẽ không cần lồng hai hàm để làm điều đó, bạn chỉ có thể thay đổi phần thân của hàm thành 'return lambda x, y: k * y ** x' và nó sẽ hoạt động như' power_times (2) (3, 4) '(trả về' 2 * 4^3'). Hay tôi đã bỏ lỡ quan điểm của bạn? –

+0

Tôi có nghĩa là nếu tôi có hai hàm với tên (thay vì lambdas) bên trong hàm. ^^ – Testing360

3

@ Câu trả lời của David sẽ trả lời bạn một cách thích hợp cho các cuộc gọi hàm lồng nhau cố định. Đối với việc lồng ghép không xác định, bạn có thể muốn xác định một lớp và quá tải phương thức __call__ cùng với __repr____int__ để phục vụ Mục đích của bạn.

>>> class Power(object): 
    def __init__(self, value): 
     self.value = value 
    def __call__(self, value): 
     self.value **= value 
     return self 
    def __int__(self): 
     return self.value 
    def __repr__(self): 
     return str(self.value) 


>>> print Power(2)(2)(2)(2)(2) 
65536 
>>> int(Power(2)(2)(2)(2)(2))/2 
32768 
+0

+1. Dễ thương đó. – kindall

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