ฟังก์ชัน Lambda ใน Python: ควรใช้เมื่อไร และเมื่อไรไม่ควรใช้
บทเรียนนี้แปลจากต้นฉบับภาษาอังกฤษRead in EnglishLeer en españolЧитать на русскомLer em portuguêsแจ้งข้อผิดพลาดในการแปล
ลองนึกภาพว่าคุณต้องฝากโน้ตสั้น ๆ ไว้ให้ใครสักคนว่า "เดี๋ยวกลับมาใน 5 นาที" คุณคงไม่เขียนจดหมายทางการที่มีคำขึ้นต้น เนื้อความสามย่อหน้า และลายเซ็น แต่จะเขียนลงกระดาษโน้ตแผ่นเล็ก ๆ แล้วก็จบ
ฟังก์ชัน lambda คือกระดาษโน้ตของ Python เป็นฟังก์ชันเล็ก ๆ ที่ไม่มีชื่อ (anonymous) ใช้แล้วทิ้ง สำหรับตอนที่คุณต้องการฟังก์ชันบรรทัดเดียวแบบเร็ว ๆ และการเขียนบล็อก def เต็มรูปแบบก็เกินความจำเป็น
ในบทเรียนนี้ คุณจะได้เรียนวิธีเขียนฟังก์ชัน lambda งานที่ lambda ทำได้ดี (การเรียงลำดับ การกรอง และการแปลงค่า) และที่สำคัญไม่แพ้กันคือ เมื่อไรควรข้าม lambda แล้วใช้ฟังก์ชันปกติแทน
วิธีเขียนฟังก์ชัน Lambda
ฟังก์ชัน lambda สร้างด้วยคีย์เวิร์ด lambda ตามด้วยพารามิเตอร์ เครื่องหมายโคลอน และนิพจน์หนึ่งนิพจน์ นิพจน์นั้นจะถูกคืนค่าโดยอัตโนมัติ ไม่ต้องใช้คีย์เวิร์ด return
10 10
รูปแบบไวยากรณ์คือ lambda parameters: expression ไม่มีชื่อฟังก์ชัน (จึงเรียกว่า "นิรนาม" หรือ anonymous) ไม่มี def ไม่มี return และไม่มีเนื้อฟังก์ชันหลายบรรทัด มีแค่นิพจน์เดียวที่ถูกประเมินค่าแล้วคืนค่ากลับมา
lambda รับพารามิเตอร์หลายตัวได้ เหมือนฟังก์ชันปกติ:
10 Ada Lovelace
การใช้ Lambda กับ sorted()
การใช้งาน lambda ที่พบบ่อยที่สุดคือใช้เป็นอาร์กิวเมนต์ key ของ sorted() พารามิเตอร์ key บอก Python ว่า "ก่อนเปรียบเทียบสมาชิก ให้แปลงแต่ละตัวด้วยฟังก์ชันนี้ก่อน"
['Bob', 'Charlie', 'alice'] ['alice', 'Bob', 'Charlie']
lambda lambda name: name.lower() บอก sorted() ให้เปรียบเทียบสตริงแต่ละตัวในรูปตัวพิมพ์เล็ก สตริงต้นฉบับยังคงเหมือนเดิม lambda มีผลแค่กับการเปรียบเทียบเท่านั้น
lambda มีประโยชน์อย่างยิ่งในการเรียงลำดับข้อมูลที่ซับซ้อน เช่น ลิสต์ของทูเพิลหรือลิสต์ของดิกชันนารี:
Charlie: 72 Alice: 88 Diana: 91 Bob: 95
Mouse: $25 Keyboard: $75 Laptop: $999
การใช้ Lambda กับ map() และ filter()
map() นำฟังก์ชันไปใช้กับสมาชิกทุกตัวในลิสต์ แล้วให้ผลลัพธ์ที่แปลงแล้วกลับมา filter() เก็บไว้เฉพาะสมาชิกที่ฟังก์ชันคืนค่า True ทั้งสองรับฟังก์ชันเป็นอาร์กิวเมนต์ตัวแรก ซึ่งเป็นตำแหน่งที่เหมาะกับ lambda มาก
[2, 4, 6, 8, 10] [2, 4]
เราครอบ map() และ filter() ด้วย list() เพราะทั้งสองคืนค่าเป็น iterator แบบ lazy (สร้างค่าเมื่อถูกขอ) ไม่ใช่ลิสต์ การเรียก list() บังคับให้สร้างผลลัพธ์ทั้งหมดออกมาในครั้งเดียว
นี่คือตัวอย่างที่ใช้งานจริงมากขึ้น ได้แก่ การดึงและกรองข้อมูล:
[11.55, 26.39, 5.5, 49.5, 14.03] [23.99, 45.0]
doubled = list(map(
lambda x: x * 2, numbers
))
evens = list(filter(
lambda x: x % 2 == 0, numbers
))doubled = [x * 2 for x in numbers]
evens = [x for x in numbers
if x % 2 == 0]Lambda กับ def: ควรใช้แบบไหนเมื่อไร
lambda ชวนให้ใช้เพราะดูฉลาดและกะทัดรัด แต่ก็มีข้อจำกัดจริง ๆ นี่คือแนวทางว่าควรใช้แต่ละแบบเมื่อไร:
ใช้ lambda เมื่อ:
key=, map() หรือ filter()ใช้ def เมื่อ:
if/else ลูป หรือการจัดการข้อผิดพลาด['apple', 'banana', 'cherry'] ['apple', 'banana', 'cherry']
รูปแบบการใช้ Lambda ที่พบบ่อย
นี่คือรูปแบบบางส่วนที่คุณจะเจอในโค้ด Python จริง การจำรูปแบบเหล่านี้ได้จะช่วยให้คุณอ่านโค้ดของคนอื่นออก และรู้ว่าเมื่อไร lambda คือเครื่องมือที่เหมาะสม
Alex: 30 Zara: 22
even odd
awesome is
แบบฝึกหัด
โค้ดนี้แสดงผลอะไร? พิมพ์ผลลัพธ์ให้ตรงทุกตัวอักษร
operation = lambda a, b: a * b + 1
print(operation(3, 4))
print(operation(0, 10))จากลิสต์ของคำที่กำหนดให้ ใช้ sorted() กับ lambda เพื่อเรียงคำตาม ตัวอักษรตัวสุดท้าย แล้วแสดงลิสต์ที่เรียงแล้ว
ใช้ลิสต์นี้: words = ['hello', 'world', 'python', 'code']
ผลลัพธ์ที่ควรได้: ['world', 'code', 'python', 'hello']
จากลิสต์ของตัวเลขที่กำหนดให้ ใช้ filter() กับ lambda เพื่อเก็บเฉพาะตัวเลขที่มากกว่า 10 จากนั้นใช้ map() กับ lambda เพื่อยกกำลังสองตัวเลขที่เหลือแต่ละตัว แล้วแสดงลิสต์สุดท้าย
ใช้ลิสต์นี้: numbers = [3, 15, 7, 20, 8, 12]
ผลลัพธ์ที่ควรได้: [225, 400, 144]
จากลิสต์ทูเพิลของนักเรียน (name, gpa) ให้เรียงตามเกรดเฉลี่ยจาก สูงสุดไปต่ำสุด โดยใช้ sorted() กับ lambda แล้วแสดงนักเรียนบรรทัดละคนในรูปแบบ name: gpa
ใช้ลิสต์นี้:
students = [('Alice', 3.5), ('Bob', 3.9), ('Charlie', 3.2), ('Diana', 3.7)]ผลลัพธ์ที่ควรได้:
Bob: 3.9
Diana: 3.7
Alice: 3.5
Charlie: 3.2จากลิสต์ของคำที่กำหนดให้ ใช้ sorted() กับ lambda เพื่อเรียงคำตามความยาว (สั้นที่สุดก่อน) ถ้าคำสองคำยาวเท่ากัน ให้เรียงตามลำดับตัวอักษร แล้วแสดงลิสต์ที่เรียงแล้ว
ใช้ลิสต์นี้: words = ['fig', 'apple', 'date', 'kiwi', 'banana', 'pear', 'plum']
ผลลัพธ์ที่ควรได้: ['fig', 'date', 'kiwi', 'pear', 'plum', 'apple', 'banana']