ฟังก์ชันแลมบ์ดาใน Python

ฟังก์ชันแลมบ์ดาคืออะไร

†<
ใน Python ฟังก์ชันเป็นวัตถุ: สามารถกำหนดให้กับตัวแปร สามารถส่งคืนจากฟังก์ชันอื่น เก็บไว้ในรายการหรือ dicts และส่งผ่านเป็นพารามิเตอร์สำหรับฟังก์ชันอื่น ลองพิจารณาตัวอย่างเช่น map() ฟังก์ชั่นในตัว ไวยากรณ์ของมันคือ map(function, iterable) และนำไปใช้ได้อย่างคล่องแคล่ว function ให้กับทุกองค์ประกอบของ iterable.

map() ส่งคืนจริง iterator วัตถุ. ในทางปฏิบัติ เราโยนผลลัพธ์เป็น list, tuple, set, dictฯลฯ แล้วแต่สะดวกครับ
†<
สมมติว่าคุณต้องการยกกำลังสองทุกพจน์ของรายการโดยใช้ map() การทำงาน. ในการทำเช่นนั้น เราจะกำหนด a square() ฟังก์ชันและใช้เป็นพารามิเตอร์สำหรับ map():

my_list = [1,2,3,4,5]
def square(x):
    return x**2

my_modified_list = list(map(square, my_list))
print(my_modified_list)
[1, 4, 9, 16, 25]

†<
แต่ถ้าใช้เฉพาะของเรา square() ฟังก์ชันคือการสร้างรายการนี้ การใช้ a lambda ฟังก์ชั่น:

my_list = [1,2,3,4,5]
my_modified_list = list(map(lambda x: x**2, my_list))
print(my_modified_list)
[1, 4, 9, 16, 25]

ในไพทอน lambda ฟังก์ชันเป็นฟังก์ชันที่ไม่ระบุตัวตนซึ่งใช้ชื่อและไวยากรณ์จาก Alonzo Church's แคลคูลัสแลมบ์ดา. ไวยากรณ์ของพวกเขาคือ:

lambda x_1,..., x_n : expression(x_1, ..., x_n)

สิ่งนี้สร้างฟังก์ชันนิรนามที่รับเป็นอินพุตของตัวแปร x_1, ..., x_n และส่งคืนการประเมิน expression(x_1, ..., x_n).
†<
วัตถุประสงค์ของการ lambda ฟังก์ชันจะใช้เป็นพารามิเตอร์สำหรับฟังก์ชันที่รับฟังก์ชันเป็นพารามิเตอร์เหมือนที่เราทำกัน map() ข้างบน. Python อนุญาตให้คุณกำหนดไฟล์ lambda ฟังก์ชั่นให้กับตัวแปร แต่การ คู่มือสไตล์ PEP 8 ให้คำแนะนำกับมัน หากคุณต้องการกำหนดฟังก์ชันอย่างง่ายให้กับตัวแปร ควรทำแบบนิยามบรรทัดเดียวจะดีกว่า สิ่งนี้ทำให้มั่นใจได้ว่าออบเจกต์ผลลัพธ์ได้รับการตั้งชื่ออย่างถูกต้อง ปรับปรุงความสามารถในการอ่านย้อนกลับ:

anonymous_square = lambda x : x**2def named_square(x): return x**2print(anonymous_square.__name__)
print(named_square.__name__)


a = anonymous_square
b = named_square
print(a.__name__)
print(b.__name__)

เหตุใดจึงต้องใช้ฟังก์ชันแลมบ์ดา

หลังจากย่อหน้าที่แล้ว คุณอาจสงสัยว่าทำไมคุณถึงต้องการใช้ a lambda การทำงาน. ท้ายที่สุด อะไรก็ตามที่สามารถทำได้ด้วย a lambda ฟังก์ชันสามารถทำได้ด้วยฟังก์ชันที่มีชื่อ
†<
คำตอบคือ lambda ฟังก์ชั่น วัตถุประสงค์ คือการอยู่ภายในนิพจน์ที่ใหญ่กว่าซึ่งเป็นตัวแทนของการคำนวณ วิธีหนึ่งในการคิดเกี่ยวกับสิ่งนี้คือการเปรียบเทียบกับตัวแปรและค่าต่างๆ พิจารณารหัสต่อไปนี้:

x = 2

ตัวแปร x เป็นตัวยึดตำแหน่ง (หรือชื่อ) สำหรับจำนวนเต็ม 2. เช่น โทร print(x) และ print(2) ให้ผลลัพธ์ที่เหมือนกันทุกประการ ในกรณีของฟังก์ชัน:

def square(x): return x**2

ฟังก์ชั่น square() เป็นตัวยึดสำหรับการคำนวณกำลังสองของจำนวน การคำนวณนี้สามารถเขียนแบบไม่ระบุชื่อได้เป็น lambda x: x**2.
†<
ต่อไปนี้การพูดนอกเรื่องทางปรัชญา เรามาดูตัวอย่างการใช้งานสำหรับ lambda ฟังก์ชั่น
†<

การใช้ Lambda กับฟังก์ชัน sorted()

พื้นที่ sorted() ฟังก์ชันเรียงลำดับการวนซ้ำได้ มันยอมรับฟังก์ชั่นของมัน key อาร์กิวเมนต์และผลลัพธ์ของฟังก์ชันที่ใช้กับแต่ละองค์ประกอบของ iterable จะใช้ในการเรียงลำดับองค์ประกอบ
†<
นี้เหมาะอย่างยิ่งสำหรับก lambda ฟังก์ชั่น: โดยการตั้งค่า key พารามิเตอร์ด้วย a lambda ฟังก์ชัน เราสามารถจัดเรียงตามคุณลักษณะขององค์ประกอบชนิดใดก็ได้ ตัวอย่างเช่น เราสามารถจัดเรียงรายชื่อตามนามสกุล:

name_list = ['Grace Hopper', 'Ada Lovelace', 'Emmy Noether', 'Marie Curie']
​
sorted_by_surname = sorted(name_list, key = lambda x: x.split()[1])
​
print(sorted_by_surname)
['Marie Curie', 'Grace Hopper', 'Ada Lovelace', 'Emmy Noether']

การใช้ Lambda กับฟังก์ชัน 'filter()'

พื้นที่ filter() ฟังก์ชันมีไวยากรณ์ดังต่อไปนี้: filter(function, iterable) และมันส่งออกองค์ประกอบของ iterable ซึ่งประเมิน function(element) เป็นจริง (มันคล้ายกับ an WHERE ข้อใน SQL) เราสามารถใช้ lambda ทำหน้าที่เป็นพารามิเตอร์สำหรับ filter() เพื่อเลือกองค์ประกอบจาก iterable

พิจารณาตัวอย่างต่อไปนี้:

num_list = list(range(0,100))
​
multiples_of_15= filter(lambda x: (x % 3 == 0) and (x % 5 == 0), num_list)
​
print(list(multiples_of_15))
[0, 15, 30, 45, 60, 75, 90]

filter() ใช้กับ lambda ฟังก์ชัน lambda x: (x % 3 == 0) and (x % 5 == 0) ให้กับแต่ละองค์ประกอบของ range(0,100)และส่งกลับ filter วัตถุ. เราเข้าถึงองค์ประกอบโดยการหล่อเป็น list.
†<

การใช้ Lambda กับฟังก์ชัน map()

†<
ตัวอย่างสุดท้ายของเราคือสิ่งที่เราได้เห็นในบทนำ – the map() ฟังก์ชัน map() ไวยากรณ์ของฟังก์ชันคือ: map(function, iterable)และ map() มีผลบังคับใช้ function ให้กับแต่ละองค์ประกอบของ iterable, กลับก map วัตถุที่สามารถเข้าถึงได้โดยการส่งไปยัง list.

เราได้เห็นแล้วว่าสิ่งนี้สามารถนำไปใช้กับรายการได้อย่างไร แต่ก็สามารถนำไปใช้กับคำสั่งโดยใช้ dict.items() วิธี:

my_data = {'Mary':1, 'Alice':2, 'Bob':0}
map_obj = map(lambda x: f'{x[0]} had {x[1]} little lamb', my_data.items())
print(', '.join((map_obj)))
Mary had 1 little lamb, Alice had 2 little lamb, Bob had 0 little lamb

หรือเป็นสตริง:

my_string = 'abcdefg'
''.join(map(lambda x: chr(ord(x)+2),my_string))
'cdefghi'

ดูคู่มือเชิงปฏิบัติสำหรับการเรียนรู้ Git ที่มีแนวทางปฏิบัติที่ดีที่สุด มาตรฐานที่ยอมรับในอุตสาหกรรม และเอกสารสรุปรวม หยุดคำสั่ง Googling Git และจริงๆ แล้ว เรียน มัน!

เราสามารถใช้ map() ฟังก์ชันในรูปแบบที่แยบยล ตัวอย่างหนึ่งคือการใช้หลายฟังก์ชันกับอินพุตเดียวกัน

ตัวอย่างเช่น สมมติว่าคุณกำลังสร้าง API ที่รับสตริงข้อความ และคุณต้องการใช้รายการฟังก์ชันกับ API

แต่ละฟังก์ชันจะแยกคุณลักษณะบางอย่างออกจากข้อความ คุณสมบัติที่เราต้องการแยกคือจำนวนคำ คำที่สอง และตัวอักษรที่สี่ของคำที่สี่:

def number_of_words(text):
  return len(text.split())
​
def second_word(text):
  return text.split()[1]
​
def fourth_letter_of_fourth_word(text):
  return text.split()[3][3]
​
function_list = [number_of_words, second_word, fourth_letter_of_fourth_word]
​
my_text = 'Mary had a little lamb'
map_obj = map(lambda f: f(my_text), function_list)
​
feature_list = list(map_obj)
​
print(feature_list)
[5, 'had', 't']

†<

สรุป

†<
ในคู่มือนี้ เราได้สำรวจการทำงานของ lambda ฟังก์ชันใน Python เราได้เห็นแล้วว่า lambda ฟังก์ชันเป็นฟังก์ชันที่ไม่ระบุตัวตนเพื่อใช้เป็นพารามิเตอร์ฟังก์ชันอินไลน์สำหรับฟังก์ชันอื่นๆ เราได้เห็นกรณีการใช้งานบางอย่างรวมถึงเวลาที่ไม่ควรใช้
†<
เมื่อเขียนโปรแกรม สิ่งสำคัญคือต้องนึกถึงคำพูดของ Donald Knuth ที่ว่า “โปรแกรมมีไว้เพื่อให้มนุษย์อ่านได้ และบังเอิญให้คอมพิวเตอร์ทำงานเท่านั้น” โดยคำนึงถึงสิ่งนี้ lambda ฟังก์ชั่นเป็นเครื่องมือที่มีประโยชน์ในการทำให้โค้ดของเราง่ายขึ้น แต่ควรใช้อย่างชาญฉลาด

ประทับเวลา:

เพิ่มเติมจาก สแต็ค