Hiểu lambda trong python và sử dụng nó để chuyển nhiều đối số


90

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.

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ả hai xytrước :? Ngoài ra, làm thế nào để bạn làm cho nó trả về nhiều đối số?

ví dụ:

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

Điều 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ó dẫn đến lỗi:

TypeError: () không có đối số (1 đã cho)

Câu trả lời:


135

Tại sao bạn cần phải ghi cả 'x' và 'y' trước ':'?

Bởi vì lambda (về mặt khái niệm) giống như một hàm, chỉ được 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ỉ mà không ràng buộc nó với một cái tên như thế nào f.

Ngoài ra, làm thế nào để bạn làm cho nó trả về nhiều đối số?

Cách tương tự như với một hàm. Tốt hơn là bạn trả về một tuple:

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

Hoặc một danh sách, hoặc một lớp, hoặc bất cứ điều gì.

Điều có self.entry_1.bindcần được trả lời bởi Demosthenex.


2
Để thực sự có được chút ít trong số họ, bạn có thể thử một số chương trình chức năng, đó là một trải 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 viên tốt hơn </ tuyên truyền>.
phipsgabler

3
Bạn là chúa của tôi và tuyên truyền của bạn là bánh mì hàng ngày của tôi. Tuy nhiên, tôi đã thử áp dụng nó trên một tuple: (train["pred_idx_cos"],train["target"]).apply(lambda x,y: get_result(x, y))và có vẻ như nó không hoạt động. Xin vui lòng, tiết kiệm linh hồn tôi khỏi sương mù của lập trình thủ tục
Revolucion cho Monica

@RevolucionforMonica Trả lời hơi muộn, nhưng đây là ví dụ về mã REPL trong Python 3 về cách thực hiện: repl.it/@foobar123/ScarceWhimsicalMainframe
Mass Dot Net

11

Tôi tin rằng ràng buộc luôn cố gắng gửi một tham số sự kiện. 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 nó.


omg, tôi đã làm việc đó trong một thời gian dài và sau đó tôi nhận được câu trả lời hữu ích trong vòng 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
Bởi vì chúng là các tham số fuction .
phipsgabler

3
Bạn cũng có thể thử "event = None" để cung cấp cho nó một giá trị mặc định, sau đó hàm có thể được sử dụng cho ràng buộc và nút.
Demosthenex

5

Tại sao bạn cần phải nêu cả hai xytrước :?

Bởi vì đó là một định nghĩa hàm và nó cần biết hàm chấp nhận những tham số nào 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 đó, bởi vì một số tên trong số đó 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à ngay cả khi nó đã làm như vậy, nó sẽ không biết thứ tự của nó. 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 và không sử dụng nó. ( Demosthenex có mã , tôi đã đăng nó nhưng đã bị đánh bại.)


Cảm ơn vì lời giải thích. Tôi nghĩ rằng cuối cùng tôi cũng nhận ra được vấn đề này.
Talisin

3

Tại sao bạn cần phải ghi cả 'x' và 'y' trước ':'?

Thực ra, trong một số tình huống (khi bạn chỉ có một đối số), không đặt x và y trước ":".

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

nhưng tô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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.