ฟังก์ชันแลมบ์ดาคืออะไร
†<
ใน Python ฟังก์ชันเป็นวัตถุ: สามารถกำหนดให้กับตัวแปร สามารถส่งคืนจากฟังก์ชันอื่น เก็บไว้ในรายการหรือ dicts และส่งผ่านเป็นพารามิเตอร์สำหรับฟังก์ชันอื่น ลองพิจารณาตัวอย่างเช่น map()
ฟังก์ชั่นในตัว ไวยากรณ์ของมันคือ map(function, iterable)
และนำไปใช้ได้อย่างคล่องแคล่ว function
ให้กับทุกองค์ประกอบของ iterable
.
map()
ส่งคืนจริงiterator
วัตถุ. ในทางปฏิบัติ เราโยนผลลัพธ์เป็นlist
,tuple
,set
,dict
ฯลฯ แล้วแต่สะดวกครับ
†<
สมมติว่าคุณต้องการยกกำลังสองทุกพจน์ของรายการโดยใช้map()
การทำงาน. ในการทำเช่นนั้น เราจะกำหนด asquare()
ฟังก์ชันและใช้เป็นพารามิเตอร์สำหรับ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**2
def named_square(x): return x**2
print(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
ฟังก์ชั่นเป็นเครื่องมือที่มีประโยชน์ในการทำให้โค้ดของเราง่ายขึ้น แต่ควรใช้อย่างชาญฉลาด