2012-04-27 26 views
53

Sau khi đọc tất cả mọi thứ tôi có thể tìm thấy trên lambda, tôi vẫn không hiểu làm thế nào để làm cho nó làm những gì tôi muốn.Hiểu lambda trong python và sử dụng nó để vượt qua nhiều đối số

Mọi người sử dụng ví dụ:

lambda x, y : x + y 

Tại sao bạn cần phải nêu cả xy trước :? Ngoài ra làm thế nào để bạn làm cho nó trở lại nhiều đối số?

ví dụ:

self.buttonAdd_1 = Button(self, text='+', command=lambda : self.calculate(self.buttonOut_1.grid_info(), 1)) 

này hoạt động tốt. Nhưng đoạn mã sau không:

self.entry_1.bind("<Return>", lambda : self.calculate(self.buttonOut_1.grid_info(), 1)) 

Nó mang lại các lỗi:

TypeError:() takes no arguments (1 given)

Trả lời

87

Why do you need to state both 'x' and 'y' before the ':'?

Bởi vì một lambda là (theo lý thuyết) giống như một chức năng, chỉ cần viết nội tuyến. Ví dụ của bạn tương đương với

def f(x, y) : return x + y 

chỉ cần không gắn nó với tên như f.

Also how do you make it return multiple arguments?

Cách tương tự như với chức năng. Tốt hơn, bạn trả lại một bộ dữ liệu:

lambda x, y: (x+y, x-y) 

Hoặc danh sách hoặc lớp học hoặc bất kỳ thứ gì.

Điều với self.entry_1.bind phải được trả lời bởi Demosthenex.

+2

Để thực sự có được ít nhất trong số họ, bạn có thể thử một số lập trình chức năng, đó là một kinh nghiệm tuyệt vời khi bạn bắt đầu hiểu nó, và có lẽ sẽ làm cho bạn một lập trình tốt hơn. – phg

9

tôi tin ràng buộc luôn cố gắng để gửi một tham số sự kiện. Hãy thử:

self.entry_1.bind("<Return>", lambda event: self.calculate(self.buttonOut_1.grid_info(), 1)) 

Bạn chấp nhận tham số và không bao giờ sử dụng thông số này.

+0

omg, tôi đã làm việc trên đó quá lâu và sau đó tôi nhận được câu trả lời trong 1 phút ... Btw, bạn có biết tại sao mọi thứ lại đi trước dấu hai chấm không? – Talisin

+2

Vì chúng là các tham số _fuction_. – phg

+2

Bạn cũng có thể thử "event = None" để đặt giá trị mặc định, sau đó chức năng có thể được sử dụng cho liên kết và nút. – Demosthenex

5

Why do you need to state both x and y before the : ?

Vì đó là định nghĩa hàm và cần biết thông số nào hàm sẽ chấp nhận và theo thứ tự nào. Nó không thể chỉ nhìn vào biểu thức và sử dụng các tên biến trong đó, vì một số tên mà bạn có thể muốn sử dụng các giá trị biến cục bộ hoặc toàn cục hiện có, và thậm chí nếu nó đã làm điều đó, nó sẽ không biết thứ tự nó là gì nên mong đợi để có được chúng.

Thông báo lỗi của bạn có nghĩa là Tk đang gọi lambda của bạn với một đối số, trong khi lambda của bạn được viết để chấp nhận không có đối số. Nếu bạn không cần đối số, chỉ cần chấp nhận một đối số và không sử dụng nó. (Demosthenex has the code, tôi đã có thể đăng nó nhưng đã bị đánh đến nó.)

+0

Cảm ơn bạn đã giải thích. Tôi nghĩ cuối cùng tôi cũng đã có được cái đầu. – Talisin

2

Why do you need to state both 'x' and 'y' before the ':'?

Bạn có thể thực sự trong một số trường hợp (khi bạn chỉ có một đối số) không đặt dấu x và y trước ":".

>>> flist = [] 
>>> for i in range(3): 
...  flist.append(lambda : i) 

nhưng i trong lambda sẽ bị ràng buộc bởi tên, vì vậy,

>>> flist[0]() 
2 
>>> flist[2]() 
2 
>>> 

khác với những gì bạn có thể muốn.

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