ทำความเข้าใจ lambda ใน python และใช้เพื่อส่งผ่านหลายอาร์กิวเมนต์


91

หลังจากอ่านทุกอย่างที่หาได้จาก lambda แล้วฉันก็ยังไม่เข้าใจว่าจะทำอย่างไรให้มันเป็นไปตามที่ฉันต้องการ

ทุกคนใช้ตัวอย่าง:

lambda x, y : x + y

เหตุใดคุณจึงต้องระบุทั้งก่อนxและyหลัง:? คุณจะทำให้มันส่งคืนหลายอาร์กิวเมนต์ได้อย่างไร?

ตัวอย่างเช่น:

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

แค่นี้ก็ใช้ได้ดี แต่รหัสต่อไปนี้ไม่:

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

ทำให้เกิดข้อผิดพลาด:

TypeError: () ไม่มีอาร์กิวเมนต์ (ให้ 1 ครั้ง)

คำตอบ:


138

ทำไมคุณต้องระบุทั้ง 'x' และ 'y' ก่อนเครื่องหมาย ':'

เนื่องจากแลมบ์ดาเป็น (แนวความคิด) เหมือนกับฟังก์ชันเพียงเขียนแบบอินไลน์ ตัวอย่างของคุณเทียบเท่ากับ

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

fเพียงโดยไม่ต้องผูกพันกับชื่อเหมือน

คุณจะทำให้มันส่งคืนหลายอาร์กิวเมนต์ได้อย่างไร?

เช่นเดียวกับฟังก์ชัน โดยเฉพาะอย่างยิ่งคุณส่งคืนทูเพิล:

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

หรือรายการหรือชั้นเรียนหรืออะไรก็ได้

สิ่งที่self.entry_1.bindควรได้รับคำตอบจาก Demosthenex


2
เพื่อให้ได้ประโยชน์น้อยที่สุดคุณอาจลองใช้การเขียนโปรแกรมเชิงฟังก์ชันซึ่งเป็นประสบการณ์ที่ยอดเยี่ยมเมื่อคุณเริ่มเข้าใจและอาจทำให้คุณเป็นโปรแกรมเมอร์ที่ดีขึ้นได้ </propaganda>
phipsgabler

3
คุณคือพระเจ้าของฉันและโฆษณาชวนเชื่อของคุณคือขนมปังประจำวันของฉัน แต่ฉันพยายามใช้กับทูเพิล: (train["pred_idx_cos"],train["target"]).apply(lambda x,y: get_result(x, y))และดูเหมือนว่ามันจะไม่ได้ผล โปรดช่วยวิญญาณของฉันจากหมอกของการเขียนโปรแกรมขั้นตอน
Revolucion for Monica

@RevolucionforMonica ตอบช้าไปหน่อย แต่นี่คือตัวอย่างโค้ด REPL ของ Python 3 สำหรับวิธีการทำ: repl.it/@foobar123/ScarceWhimsicalMainframe
Mass Dot Net

11

ฉันเชื่อว่าการผูกพยายามส่งพารามิเตอร์เหตุการณ์เสมอ ลอง:

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

คุณยอมรับพารามิเตอร์และไม่เคยใช้


โอ้ฉันทำงานนี้มานานแล้วฉันก็ได้รับคำตอบที่ใช้งานได้ใน 1 นาทีแบน ... Btw คุณรู้ไหมว่าทำไมสิ่งต่าง ๆ จึงอยู่ตรงหน้าเครื่องหมายโคลอน?
Talisin

2
เพราะพวกเขามีfuction พารามิเตอร์
phipsgabler

3
คุณยังสามารถลอง "event = None" เพื่อให้เป็นค่าเริ่มต้นจากนั้นสามารถใช้ฟังก์ชันสำหรับผูกและปุ่มได้
Demosthenex

5

ทำไมคุณต้องระบุทั้งสองอย่าง xyก่อนและหลัง:?

เนื่องจากเป็นคำจำกัดความของฟังก์ชันและจำเป็นต้องทราบว่าฟังก์ชันยอมรับพารามิเตอร์ใดและเรียงลำดับอย่างไร มันไม่สามารถดูที่นิพจน์และใช้ชื่อตัวแปรในนั้นได้เนื่องจากชื่อเหล่านั้นบางชื่อคุณอาจต้องการใช้ค่าตัวแปรภายในหรือทั่วโลกที่มีอยู่และแม้ว่าจะทำเช่นนั้น แต่ก็ไม่ทราบว่าเรียงลำดับอย่างไร ควรคาดหวังว่าจะได้รับ

ข้อความแสดงข้อผิดพลาดของคุณหมายความว่า Tk กำลังเรียกแลมด้าของคุณด้วยอาร์กิวเมนต์เดียวในขณะที่แลมบ์ดาของคุณเขียนขึ้นเพื่อไม่ยอมรับข้อโต้แย้ง หากคุณไม่ต้องการข้อโต้แย้งเพียงแค่ยอมรับข้อโต้แย้งหนึ่งข้อและอย่าใช้มัน ( Demosthenex มีรหัสฉันจะโพสต์ แต่ถูกทุบตี)


ขอบคุณสำหรับคำอธิบาย ฉันคิดว่าในที่สุดฉันก็เข้าใจเรื่องนี้
Talisin

3

ทำไมคุณต้องระบุทั้ง 'x' และ 'y' ก่อนเครื่องหมาย ':'

คุณสามารถทำได้จริงในบางสถานการณ์ (เมื่อคุณมีอาร์กิวเมนต์เดียว) อย่าใส่ x และ y นำหน้า ":"

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

แต่ฉันในแลมด้าจะถูกผูกมัดด้วยชื่อดังนั้น

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

แตกต่างจากสิ่งที่คุณต้องการ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.