โปรดอธิบายการทำงานของแลมบ์ดา [ซ้ำกัน]

สิ่งที่ซ้ำกันที่เป็นไปได้:
แลมบ์ดาคืออะไร และตัวอย่างการใช้งานคืออะไร

นี่คือรหัสสำหรับแลมบ์ดา (จาก Byte of Python):

def make_repeater(n):
    return lambda s: s * n

twice = make_repeater(2)

print twice('word')
print twice(5)

ผลลัพธ์คือ:

wordword
10

ใครช่วยอธิบายหน่อยได้ไหมว่าแลมบ์ดาทำงานในรูปแบบยาวได้อย่างไร word และ 5 ส่งต่อไปยัง s ในฟังก์ชันแลมบ์ดาได้อย่างไร

ขอบคุณ.


person dopatraman    schedule 30.12.2011    source แหล่งที่มา
comment
ทำได้ดีมากที่ถามคำถามที่ดีกว่าคำถามซ้ำที่เป็นไปได้ แต่คำตอบแรกนั้นยอดเยี่ยมมาก   -  person sarnold    schedule 31.12.2011
comment
ฉันคิดว่าฉันจะได้รับข้อผิดพลาดการล้นของจิตจากการถามคำถามซ้ำซ้อน ...   -  person Brigand    schedule 31.12.2011
comment
ดู understand-lambda-functions ใน python   -  person nawfal    schedule 04.07.2014


คำตอบ (2)


ตามที่ Jake อธิบายไว้แล้ว make_repeater ของคุณส่งคืนฟังก์ชันอื่นโดยที่ n ถูกผูกไว้กับ 2 (ซึ่งเรียกว่า ปิด) ดังนั้นโค้ดของคุณจึงเทียบเท่ากับ:

twice = lambda s: s * 2

print twice('word')
print twice(5)

ซึ่งจะเทียบเท่ากับ:

def twice(s):
    return s * 2

print twice('word')
print twice(5)

ซึ่งจะเทียบเท่ากับ:

print 'word' * 2
print 5 * 2

ดังนั้นสิ่งที่คุณทำจริงๆ คือ:

  • ประเมินนิพจน์ 'word' * 2 ซึ่งส่งผลให้เกิด 'wordword' (การคูณสตริงถูกกำหนดโดย Python เป็นการทำซ้ำสตริงตามจำนวนครั้งที่กำหนด)
  • ประเมินนิพจน์ 5 * 2 ซึ่งส่งผลให้เป็น 10 (ซึ่งไม่ควรทำให้คุณประหลาดใจ)

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

person Niklas B.    schedule 30.12.2011

ฟังก์ชัน make_repeater ส่งคืนฟังก์ชันอื่น (แลมบ์ดา) ในตัวอย่างของคุณ ฟังก์ชัน lambda ได้รับการตั้งชื่อว่า "twice" แลมบ์ดามีหนึ่งอาร์กิวเมนต์ "s" และค่า "คงที่" หนึ่งค่า "n" - "n" ถูกกำหนดเมื่อมีการสร้างแลมบ์ดา (ในกรณีนี้ จะถูกกำหนดให้กับ "2") ค่าของ "s" จะถูกกำหนดเมื่อมีการเรียกใช้แลมบ์ดา - ทั้ง "word" หรือ 5. word * 2 = "wordword" และ 5 * 2 = 10

person Jake Feasel    schedule 30.12.2011