Lambda function ในภาษา Python

7 March 2021

ในบทนี้ คุณจะได้เรียนรู้เกี่ยวกับ Lambda function ในภาษา Python เราจะมาดูกันว่ามันคืออะไรและสามารถนำไปใช้ได้อย่างไรในการเขียนโปรแกรม พร้อมกับตัวอย่างการใช้งาน Lambda function ในการเขียนโปรแกรม นี่เป็นเนื้อหาในบทนี้

  • Lambda function คืออะไร
  • การประกาศ Lambda function
  • ตัวอย่างการใช้งาน Lambda function
  • การใช้งานกับฟังก์ชัน filter
  • การใช้งานกับฟังก์ชัน map

Lambda function คืออะไร

Lambda function หรือ Anonymous function เป็นฟังก์ชัน Expression ที่แสดงถึงค่าของฟังก์ชัน (Function literal) ซึ่งสามารถสร้างและเก็บค่าไว้ในตัวแปร หรือส่งเป็นพารามิเตอร์ของฟังก์ชันอื่นได้ นั่นหมายความว่ามันไม่จำเป็นต้องมีชื่อในการประกาศ แต่เราสามารถใช้มันได้เหมือนกับค่าๆ หนึ่งในภาษา Python

Lambda function เป็นอีกรูปแบบหนึ่ีงของการประกาศฟังก์ชัน โดยวัตถุประสงค์ก็เพื่อเอาไว้ประกาศฟังก์ชันเพื่อส่งเป็น Callback ของฟังก์ชันอื่นๆ หรือเก็บเป็นค่าไว้ในตัวแปร ดังนั้นรูปแบบการประกาศของมันจึงสั้นและเรียบง่ายกว่า และที่สำคัญมันสามารถมีได้เพียงหนึ่งคำสั่ง (Expression) เท่านั้นซึ่งจะเป็นค่าส่งกลับของฟังก์ชันเสมอ

นี่เป็นตัวอย่างของการประกาศ Lambda function ในภาษา Python ซึ่งเป็นฟังก์ชันสำหรับตรวจสอบว่าตัวเลขเป็นจำนวนคู่หรือไม่

is_even = lambda n : n % 2 == 0

ฟังก์ชันนี้รับหนึ่งพารามิเตอร์เป็นตัวเลขที่ต้องการตรวจสอบ จากนั้นส่งค่ากลับโดย Expression ของมันเป็น Boolean เพื่อบ่งบอกว่าตัวเลขเป็นจำนวนคู่หรือไม่ ซึ่งนี่จะมีการทำงานเหมือนกับฟังก์ชันปกติที่ถูกประกาศด้วย

def is_even(n):
    return n % 2 == 0

ฟังก์ชันทั้งสองรูปแบบให้ผลลัพธ์การทำงานที่เหมือนกัน แต่ Lambda function ถูกออกแบบมาสำหรับการประกาศฟังก์ชันแบบสั้นและกระทัดรัด และสามารถนำไปใช้งานได้ทันที คุณไม่จำเป็นต้องกำหนดมันใส่ในตัวแปรเหมือนกับที่เราทำ

การประกาศ Lambda function

นี่เป็นรูปแบบของการประกาศ Lambda function ในภาษา Python

lambda param1, param2, ...: expr

ในรูปแบบการประกาศ เราใช้คำสั่ง lambda สำหรับประกาศ Lambda function ตามด้วยพารามิเตอร์ที่คั่นแต่ละพารามิเตอร์ด้วยเครื่องหมายคอมมา (,) ถ้าหากฟังก์ชันไม่มีพารามิเตอร์ เราสามารถละเว้นมันออกไปดังนี้

lambda: expr

หลังจากเครื่องหมายโคลอน (:) เป็นการกำหนดการทำงานของ Lambda function โดย expr นั้นสามารถเป็นนิพจน์ (Expression) ใดๆ ในภาษา Python นี่เป็นเพียงคำสั่งเดียวที่ฟังก์ชันสามารถมีได้ และมันถูกใช้เป็นค่าส่งกลับของฟังก์ชันเสมอ

Lambda function เป็นฟังก์ชันที่ไม่มีชื่อ โดยที่ lambda ที่เห็นในตัวอย่างนั้นเป็นเพียงคำสั่งสำหรับประกาศฟังก์ชันเท่านั้น คุณสามารถสร้างฟังก์ชันและกำหนดใส่ไว้ในตัวแปรได้ และเราจะสามารถเรียกใช้มันได้เหมือนกับฟังก์ชันปกติ ยกตัวอย่างเช่น

fn = lambda param1, param2, ...: expr

คุณสามารถจินตนาการได้ว่า Lambda function เป็นเหมือนค่าค่าหนึ่งในภาษา Python ในกรณีนี้คือค่าของฟังก์ชัน (Function expression หรือ Function literal) หลังจากที่เรากำหนดมันไว้ในตัวแปร fn เราสามารถเรียกใช้งานมันได้ด้วยคำสั่ง fn() ซึ่งจะเหมือนกับการเรียกใช้ฟังก์ชันในรูปแบบปกติ

ตัวอย่างการใช้งาน Lambda function

ต่อไปมาดูตัวอย่างของการประกาศและใช้งาน Lambda function ในภาษา Python ในตัวอย่างนี้ เราจะสร้าง Lambda function สำหรับหาผลรวมของตัวเลขสองตัวที่ส่งเป็นพารามิเตอร์ของฟังก์ชัน และเร่ียกใช้งานฟังก์ชันดังกล่าว

lambda_add.py
add = lambda a, b: a + b

print(add(2, 3))
print(add(4, 6))

นี่เป็นผลลัพธ์การทำงานของโปรแกรม

5
10

ในตัวอย่าง เราได้ประกาศ Lambda function ที่รับพารามิเตอร์สองตัวคือ a และ b และส่งค่ากลับเป็นผลรวมของพารามิเตอร์ทั้งสอง เราได้กำหนดฟังก์ชันไว้ในตัวแปร add เพื่อเรียกใช้งานมันในภายหลัง จากนั้นเรียกใช้งานฟังก์ชันและแสดงผลลัพธ์การทำงานออกทางหน้าจอ

และอย่างที่คุณเห็น รูปแบบของการประกาศฟังก์ชันนั้นสั้นและเรียบง่าย เมื่อเทียบกับการใช้ฟังก์ชันในรูปแบบปกติ ซึ่งสามารถเขียนได้เป็น

def add(a, b):
    return a + b

มันไม่มีความแตกต่างของการทำงานระหว่างการประกาศแบบ Lambda function หรือฟังก์ชันปกติ แต่อย่างที่เราบอกไป Lambda function สามารถประกอบไปด้วยเพียงคำสั่งเดียวเท่านั้น ดังนั้นมันจึงเหมาะสำหรับประกาศฟังก์ชันที่ง่ายและไม่ซับซ้อน และสามารถนำไปใช้ได้ทันที

มาดูตัวอย่างต่อไปสำหรับการประกาศและใช้งาน Lambda function ในภาษา Python ในตัวอย่างนี้ มาสร้าง Lambda function สำหรับแสดงข้อความออกทางหน้าจอ

greeting.py
hi = lambda: print("Hi everyone")
hello = lambda name: print("Hello %s" % name)

hi()
hello("Metin")

นี่เป็นผลลัพธ์การทำงานของโปรแกรม

Hi everyone
Hello Metin

ในตัวอย่าง เราได้สร้างสอง Lambda function สำหรับกล่าวคำทักทาย โดยการกำหนดค่าของฟังก์ชันไว้ในตัวแปร hi และ hello ตามลำดับ โดยฟังก์ชัน hi ใช้สำหรับแสดงคำกล่าวทักทายทุกคน และมันไม่ต้องมีพารามิเตอร์ในการทำงาน ส่วนฟังก์ชัน hello รับหนึ่งพารามิเตอร์ซึ่งเป็นชื่อของคนที่ต้องการกล่าวคำทักทาย

นิพจน์การทำงานของฟังก์ชันคือการเรียกใช้ฟังก์ชัน print สำหรับแสดงข้อความออกทางหน้าจอ นั่นหมายความว่าผลลัพธ์การทำงานของฟังก์ชัน print จะกลายมาเป็นค่าที่ส่งกลับจาก Lambda function ซึ่งคือ None

print(hi()) # None
print(hello("Metin")) # None

หรือกล่าวอีกในหนึ่ง ผลลัพธ์ของคำสั่งที่ทำงานในฟังก์ชันจะกลายมาเป็นค่าส่งกลับของฟังก์ชันเสมอ

นอกจากนี้ Lambda function ยังถูกออกแบบมาสำหรับส่งค่าเป็นฟังก์ชัน Callback ให้กับเหล่าฟังก์ชันที่รับฟังก์ชันเพื่อทำงาน ยกตัวอย่างเช่น ฟังก์ชัน filter และ map ในภาษา Python เราจะมาดูการใช้งานร่วมกับสองฟังก์ชันที่ว่านี้

การใช้งานกับฟังก์ชัน filter

ฟังก์ชัน filter ใช้สำหรับกรองข้อมูลจาก Sequence จากฟังก์ชันกรองที่กำหนดเป็นฟังก์ชัน Callback ในตัวอย่างนี้่เป็นการใช้ฟังก์ชัน filter สำหรับกรองเอาเพียงเลขคู่ภายในลิสต์ โดยการใช้มันร่วมกับ Lambda function

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
even_numbers = filter(lambda n: n % 2 == 0, numbers)
print(list(even_numbers))

นี่เป็นผลลัพธ์การทำงานของโปรแกรม

[2, 4, 6, 8, 10]

ในตัวอย่างเรา ได้ประกาศลิสต์ numbers ที่เก็บตัวเลขจำนวนเต็มสิบตัว และเราได้ใช้ฟังก์ชัน filter สำหรับกรองเอาตัวเลขคู่ภายในลิสต์ เราส่ง Lambda function เป็นฟังก์ชัน Callback สำหรับฟังก์ชัน filter เพื่อทำงาน

lambda n: n % 2 == 0

นั่นหมายความว่าแต่ละค่าภายในลิสต์จะถูกส่งเข้ามายัง Lambda function ที่เรากำหนดให้กับฟังก์ชัน filter ผ่านพารามิเตอร์ n ของ Lambda function ถ้าหากค่าๆ ภายในลิสต์ส่งผลให้ผลลัพธ์การทำงานของ Lambda function เป็นจริง ค่าดังกล่าวจะถูกเลือก

print(list(even_numbers))

ฟังก์ชัน filter ส่งค่ากลับเป็นออบเจ็คของค่าใหม่ทั้งหมดที่ถูกเลือก ดังนั้นเราแปลงมันกลับมายังลิสต์และแสดงผลออกทางหน้าจอ

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

def is_even(n):
    return n % 2 == 0

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
even_numbers = filter(is_even, numbers)
print(list(even_numbers))

จะเห็นว่าเราต้องประกาศฟังก์ชัน is_even ก่อนจากนั้นนำชื่อของมันมาใช้งาน ดังนั้นการใช้ Lambda function เราสามารถส่งเข้าไปยังฟังก์ชัน filter ได้ทันที โดยที่ไม่ต้องประกาศฟังก์ชันและเก็บไว้ในตัวแปรก่อน แม้ว่าจะทำแบบนั้นได้ก็ตาม

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

ฟังก์ชัน map ใช้สำหรับแปลงข้อมูลจาก Sequence เป็นค่าใหม่ที่ได้จากผลลัพธ์ของฟังก์ชัน Callback ที่กำหนดให้กับฟังก์ชัน ในตัวอย่างนี้เราจะเขียนโปรแกรมสำหรับแปลงตัวเลขภายในลิสต์ให้เป็นสองเท่า

numbers = [1, 2, 3, 4, 5, 7, 8]
doubled = map(lambda n: n * 2, numbers)
print(list(doubled))

นี่เป็นผลลัพธ์การทำงานของโปรแกรม

[2, 4, 6, 8, 10, 14, 16]

ฟังก์ชัน map จะวนรอบค่าภายในลิสต์ numbers และส่งแต่ละค่าเข้าไปยัง Lambda function ที่เราส่งเป็นพารามิเตอร์ของฟังก์ชัน ผลลัพธ์ที่ส่งกลับมาจากฟังก์ชันจะกลายมาเป็นค่าใหม่ของลิสต์

lambda n: n * 2

นั่นหมายความว่าในตอนท้ายเราจะได้ลิสต์ใหม่ที่มีตัวเลขเพิ่มขึ้นเป็นสองเท่า จากผลการทำงานของนิพจน์ n * 2 ซึ่งเป็นค่าส่งกลับของ Lambda function

และอย่างที่คุณเห็น การใช้ Lambda function เป็นวิธีที่ง่ายและรวดเร็วสำหรับการสร้างฟังก์ชันเพื่อส่งเป็น Callback function ของฟังก์ชันอื่น ในกรณีนี้คือ map และ filter อย่างไรก็ตาม ในภาษา Python ยังมีฟังก์ชันอื่นๆ ที่รับฟังก์ชันเป็นพารามิเตอร์เพื่อทำงาน

ในบทนี้ คุณได้เรียนรู้และทำความรู้จักกับ Lambda function ในภาษา Python การประกาศและการใช้งาน Lambda function พร้อมกับการใช้งานร่วมกับฟังก์ชันอื่นๆ อย่างเช่น map และ filter เป็นต้น และเราหวังว่าคุณสามารถนำมันไปประยุกต์ใช้เพื่อทำให้การเขียนโปรแกรมของคุณง่ายขึ้น

บทความนี้เป็นประโยชน์หรือไม่?Yes·No