ข้ามไปยังเนื้อหาหลัก
Editor

ฟังก์ชัน Lambda ใน Python: ควรใช้เมื่อไร และเมื่อไรไม่ควรใช้

ปานกลาง20 นาที5 แบบฝึกหัด70 XP

บทเรียนนี้แปลจากต้นฉบับภาษาอังกฤษRead in EnglishLeer en españolЧитать на русскомLer em portuguêsแจ้งข้อผิดพลาดในการแปล

0/5 แบบฝึกหัด

ลองนึกภาพว่าคุณต้องฝากโน้ตสั้น ๆ ไว้ให้ใครสักคนว่า "เดี๋ยวกลับมาใน 5 นาที" คุณคงไม่เขียนจดหมายทางการที่มีคำขึ้นต้น เนื้อความสามย่อหน้า และลายเซ็น แต่จะเขียนลงกระดาษโน้ตแผ่นเล็ก ๆ แล้วก็จบ

ฟังก์ชัน lambda คือกระดาษโน้ตของ Python เป็นฟังก์ชันเล็ก ๆ ที่ไม่มีชื่อ (anonymous) ใช้แล้วทิ้ง สำหรับตอนที่คุณต้องการฟังก์ชันบรรทัดเดียวแบบเร็ว ๆ และการเขียนบล็อก def เต็มรูปแบบก็เกินความจำเป็น

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

วิธีเขียนฟังก์ชัน Lambda

ฟังก์ชัน lambda สร้างด้วยคีย์เวิร์ด lambda ตามด้วยพารามิเตอร์ เครื่องหมายโคลอน และนิพจน์หนึ่งนิพจน์ นิพจน์นั้นจะถูกคืนค่าโดยอัตโนมัติ ไม่ต้องใช้คีย์เวิร์ด return

Lambda กับ def: ได้ผลเหมือนกัน
# Regular function
def double(x):
return x * 2
# Same thing as a lambda
double_lambda = lambda x: x * 2
print(double(5))
print(double_lambda(5))
ผลลัพธ์
10
10

รูปแบบไวยากรณ์คือ lambda parameters: expression ไม่มีชื่อฟังก์ชัน (จึงเรียกว่า "นิรนาม" หรือ anonymous) ไม่มี def ไม่มี return และไม่มีเนื้อฟังก์ชันหลายบรรทัด มีแค่นิพจน์เดียวที่ถูกประเมินค่าแล้วคืนค่ากลับมา

lambda รับพารามิเตอร์หลายตัวได้ เหมือนฟังก์ชันปกติ:

Lambda ที่มีพารามิเตอร์หลายตัว
add = lambda a, b: a + b
print(add(3, 7))
full_name = lambda first, last: first + ' ' + last
print(full_name('Ada', 'Lovelace'))
ผลลัพธ์
10
Ada Lovelace

การใช้ Lambda กับ sorted()

การใช้งาน lambda ที่พบบ่อยที่สุดคือใช้เป็นอาร์กิวเมนต์ key ของ sorted() พารามิเตอร์ key บอก Python ว่า "ก่อนเปรียบเทียบสมาชิก ให้แปลงแต่ละตัวด้วยฟังก์ชันนี้ก่อน"

เรียงลำดับโดยไม่สนตัวพิมพ์เล็กพิมพ์ใหญ่ด้วย lambda
names = ['Charlie', 'alice', 'Bob']
# Default sort is case-sensitive (uppercase first)
print(sorted(names))
# Sort by lowercase version (case-insensitive)
print(sorted(names, key=lambda name: name.lower()))
ผลลัพธ์
['Bob', 'Charlie', 'alice']
['alice', 'Bob', 'Charlie']

lambda lambda name: name.lower() บอก sorted() ให้เปรียบเทียบสตริงแต่ละตัวในรูปตัวพิมพ์เล็ก สตริงต้นฉบับยังคงเหมือนเดิม lambda มีผลแค่กับการเปรียบเทียบเท่านั้น

lambda มีประโยชน์อย่างยิ่งในการเรียงลำดับข้อมูลที่ซับซ้อน เช่น ลิสต์ของทูเพิลหรือลิสต์ของดิกชันนารี:

เรียงทูเพิลตามสมาชิกตัวที่สอง
students = [
('Alice', 88),
('Bob', 95),
('Charlie', 72),
('Diana', 91),
]
# Sort by grade (second element)
by_grade = sorted(students, key=lambda s: s[1])
for name, grade in by_grade:
print(name + ': ' + str(grade))
ผลลัพธ์
Charlie: 72
Alice: 88
Diana: 91
Bob: 95
เรียงดิกชันนารีตามฟิลด์
products = [
{'name': 'Laptop', 'price': 999},
{'name': 'Mouse', 'price': 25},
{'name': 'Keyboard', 'price': 75},
]
# Sort by price, cheapest first
by_price = sorted(products, key=lambda p: p['price'])
for item in by_price:
print(item['name'] + ': $' + str(item['price']))
ผลลัพธ์
Mouse: $25
Keyboard: $75
Laptop: $999

การใช้ Lambda กับ map() และ filter()

map() นำฟังก์ชันไปใช้กับสมาชิกทุกตัวในลิสต์ แล้วให้ผลลัพธ์ที่แปลงแล้วกลับมา filter() เก็บไว้เฉพาะสมาชิกที่ฟังก์ชันคืนค่า True ทั้งสองรับฟังก์ชันเป็นอาร์กิวเมนต์ตัวแรก ซึ่งเป็นตำแหน่งที่เหมาะกับ lambda มาก

map() และ filter() กับ lambda
numbers = [1, 2, 3, 4, 5]
# Double every number
doubled = list(map(lambda x: x * 2, numbers))
print(doubled)
# Keep only even numbers
evens = list(filter(lambda x: x % 2 == 0, numbers))
print(evens)
ผลลัพธ์
[2, 4, 6, 8, 10]
[2, 4]

เราครอบ map() และ filter() ด้วย list() เพราะทั้งสองคืนค่าเป็น iterator แบบ lazy (สร้างค่าเมื่อถูกขอ) ไม่ใช่ลิสต์ การเรียก list() บังคับให้สร้างผลลัพธ์ทั้งหมดออกมาในครั้งเดียว

นี่คือตัวอย่างที่ใช้งานจริงมากขึ้น ได้แก่ การดึงและกรองข้อมูล:

map และ filter ในงานจริง
prices = [10.50, 23.99, 5.00, 45.00, 12.75]
# Add 10% tax to each price
with_tax = list(map(lambda p: round(p * 1.1, 2), prices))
print(with_tax)
# Filter prices over $20
expensive = list(filter(lambda p: p > 20, prices))
print(expensive)
ผลลัพธ์
[11.55, 26.39, 5.5, 49.5, 14.03]
[23.99, 45.0]
Lambda กับ map/filter
doubled = list(map(
    lambda x: x * 2, numbers
))
evens = list(filter(
    lambda x: x % 2 == 0, numbers
))
List comprehension (มักนิยมมากกว่า)
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 ลูป หรือการจัดการข้อผิดพลาด
  • ต้องการชื่อที่สื่อความหมายเพื่อใช้อธิบายโค้ด
  • จะนำฟังก์ชันไปใช้ซ้ำในหลายที่
  • ตรรกะการเรียงลำดับแบบง่ายกับแบบซับซ้อน
    # Lambda: fine for simple key functions
    words = ['banana', 'apple', 'cherry']
    print(sorted(words, key=lambda w: len(w)))
    # def: better when logic is complex
    def sort_key(word):
    '''Sort by length, then alphabetically.'''
    return (len(word), word)
    print(sorted(words, key=sort_key))
    ผลลัพธ์
    ['apple', 'banana', 'cherry']
    ['apple', 'banana', 'cherry']

    รูปแบบการใช้ Lambda ที่พบบ่อย

    นี่คือรูปแบบบางส่วนที่คุณจะเจอในโค้ด Python จริง การจำรูปแบบเหล่านี้ได้จะช่วยให้คุณอ่านโค้ดของคนอื่นออก และรู้ว่าเมื่อไร lambda คือเครื่องมือที่เหมาะสม

    รูปแบบ: เรียงลิสต์ของดิกชันนารี
    # Pattern 1: Sort by dictionary key
    people = [{'name': 'Zara', 'age': 22}, {'name': 'Alex', 'age': 30}]
    by_name = sorted(people, key=lambda p: p['name'])
    for p in by_name:
    print(p['name'] + ': ' + str(p['age']))
    ผลลัพธ์
    Alex: 30
    Zara: 22
    รูปแบบ: lambda ที่มีเงื่อนไข
    # Pattern 2: Conditional expression in lambda
    classify = lambda x: 'even' if x % 2 == 0 else 'odd'
    print(classify(4))
    print(classify(7))
    ผลลัพธ์
    even
    odd
    รูปแบบ: max/min พร้อม key
    # Pattern 3: Using max/min with a key
    words = ['python', 'is', 'awesome']
    longest = max(words, key=lambda w: len(w))
    print(longest)
    shortest = min(words, key=lambda w: len(w))
    print(shortest)
    ผลลัพธ์
    awesome
    is

    แบบฝึกหัด

    ทายผลลัพธ์ของ Lambda
    ทายผลลัพธ์

    โค้ดนี้แสดงผลอะไร? พิมพ์ผลลัพธ์ให้ตรงทุกตัวอักษร

    operation = lambda a, b: a * b + 1
    print(operation(3, 4))
    print(operation(0, 10))
    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']

    words = ['hello', 'world', 'python', 'code']
    # Sort by last character and print
    กรองและแปลงค่า
    เขียนโค้ด

    จากลิสต์ของตัวเลขที่กำหนดให้ ใช้ filter() กับ lambda เพื่อเก็บเฉพาะตัวเลขที่มากกว่า 10 จากนั้นใช้ map() กับ lambda เพื่อยกกำลังสองตัวเลขที่เหลือแต่ละตัว แล้วแสดงลิสต์สุดท้าย

    ใช้ลิสต์นี้: numbers = [3, 15, 7, 20, 8, 12]

    ผลลัพธ์ที่ควรได้: [225, 400, 144]

    numbers = [3, 15, 7, 20, 8, 12]
    # Filter numbers > 10, then square them
    เรียงนักเรียนตามเกรดเฉลี่ย (GPA)
    เขียนโค้ด

    จากลิสต์ทูเพิลของนักเรียน (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
    students = [('Alice', 3.5), ('Bob', 3.9), ('Charlie', 3.2), ('Diana', 3.7)]
    # Sort by GPA (highest first) and print
    เรียงคำตามความยาว
    เขียนโค้ด

    จากลิสต์ของคำที่กำหนดให้ ใช้ sorted() กับ lambda เพื่อเรียงคำตามความยาว (สั้นที่สุดก่อน) ถ้าคำสองคำยาวเท่ากัน ให้เรียงตามลำดับตัวอักษร แล้วแสดงลิสต์ที่เรียงแล้ว

    ใช้ลิสต์นี้: words = ['fig', 'apple', 'date', 'kiwi', 'banana', 'pear', 'plum']

    ผลลัพธ์ที่ควรได้: ['fig', 'date', 'kiwi', 'pear', 'plum', 'apple', 'banana']

    words = ['fig', 'apple', 'date', 'kiwi', 'banana', 'pear', 'plum']
    # Sort by length, then alphabetically

    บทเรียนที่เกี่ยวข้อง

    บทเรียนนี้มีประโยชน์หรือไม่