มาทำความรู้จักกับ Lambda Function ใน 5 นาทีกันเถอะ
เคยไหมครับ เวลาเขียนโค้ดไปเยอะๆแล้วต้องการใช้งานคำสั่งเดิมๆจะแก้ปัญหาอย่างไร ทุกคนก็คงจะอ๋อ แล้วตอบว่าก็สร้างฟังก์ชันซะสิ แต่ถ้าฟังก์ชันที่เราสร้างมันมีเยอะเกินไปจนปวดหัวกับการต้องมาตั้งชื่อให้กับฟังก์ชันทีละฟังก์ชันล่ะจะทำยังไง วิธีแก้ก็ง่ายๆครับ ก็ไม่ต้องตั้งชื่อมันซะเลย ในวันนี้ผมจะพาทุกคนมารู้จักกับ Lambda Function อีกชื่อที่เค้าเรียกกันว่า Annonymous Function หรือฟังก์ชันไม่ประกาศชื่อนั่นเองง โอเคว่าแล้วไปดูกันเลย
lambda function คืออะไร
ในภาษา Python นั้น Lambda Function คือ ฟังก์ชันที่ไม่ประกาศชื่อ และมีอีกชื่อเรียกหนึ่งว่า Anonymous Function หรือฟังก์ชันนิรนาม ทีนี้ประโยชน์ของมันนอกจากจะไม่ต้องประกาศชื่อแล้ว ยังใช้ทำคอมโบกับ Built in function ชื่อดังตัวอื่นของ Python เช่น filter , map เป็นต้น เอาล่ะเกริ่นมาเยอะแล้วมาดู Syntax การใช้งานกันบ้างดีกว่า
Lambda Function Syntax
lambda arguments : expressions
คำอธิบาย
- arguments คือ ตัวแปรที่จะต้องรับเข้ามาในฟังก์ชันจะมีกี่ตัวก็ได้ เช่น x,y อื่นๆ
- expressions คือ สิ่งที่ต้องการให้ฟังก์ชันทำอะไร
- lambda คือ keyword ที่ต้องประกาศทุกครั้งเมื่อต้องการสร้างฟังก์ชันนิรนาม เพื่อบอกให้ Python รู้ว่า นี่คือฟังก์ชันนิรนาม หรือ Lambda Function นะ
ทีนี้มาดูตัวอย่างการใช้งานกันครับ ในที่นี้ผมจะเปรียบเทียบให้ดูว่าระหว่างเขียนฟังก์ชันธรรมดา กับ Lambda Function มันต่างกันยังไง
เขียนฟังก์ชันแบบธรรมดา
def plus(x,y):
return x+y
เขียนแบบ Lambda Function
plus = lambda x,y : x+y
คำอธิบาย
จะสังเกตุว่าถ้าเราเขียนแบบ Lambda Function แล้วจะทำให้โค้ดของเราสั้นลงกว่าเขียนแบบฟังก์ชันปกติที่ต้องประกาศคำว่า def ก่อนมากจนเหลือแค่บรรทัดเดียว ซึ่งประโยชน์ของมันนอกจากจะสั้นแล้ว ยังสามารถไปทำคอมโบกับ Built in หรือ Library ชื่อดังอย่าง Threading เพื่อเขียนโปรแกรมแบบเทรดได้อีกด้วย ทีนี้บางคนก็จะบอกว่า อ้าว ไหนบอกว่าฟังก์ชันไม่มีชื่อ แต่เมื่อกี้ยังเห็นตั้งชื่อว่า plus อยู่เลย ในส่วนนี้ผมจะอธิบายว่าถ้าเราต้องการจะเรียกใช้ Lambda Function หลายครั้ง เราสามารถสร้างตัวแปรขึ้นมาเก็บ Lambda Function แล้วเรียกใช้งานผ่านตัวแปรได้ แต่ถ้าเราไม่ต้องการจะสร้างตัวแปรมาเก็บก็สามารถใช้งานแบบนี้ได้เช่นกัน
Lambda Function แบบไม่มีตัวแปรมาเก็บ
print((lambda x,y:x+y)(2,5))
หรือ
result = (lambda x,y:x+y)(2,5)
print(result)
Lambda Function แบบมีตัวแปรมาเก็บ
f = lambda x,y: x+y
print(f(2,5))
เอาละครับทีนี้นักอ่านทุกท่านคงไปลองใช้ Lambda Function กันมาแล้วไม่มากก็น้อย บางคนก็จะถามผมอีกทีว่าทำคอมโบกับ Built in ที่บอกมาตอนแรกอะคือใช้ยังไง ซึ่งก็จะเป็นหัวข้อต่อไปที่ผมกำลังจะพาทุกท่านทำไปพร้อมๆกันเลยครับ โอเคครับถ้าพร้อมแล้วมาเริ่มกันเลย
map
เจ้า map เป็น Built in function ตัวหนึ่งของ Python ทำหน้าที่รับพารามิเตอร์มา 2 ตัว ได้แก่ ตัวที่ 1 จะเป็นฟังก์ชัน และ ตัวที่ 2 เป็น List หรือ numpy array ก็ได้ แล้วมันจะทำการ map ค่าแต่ละค่าใน List หรือ numpy array เข้ากับฟังก์ชันนั่นเองครับ มาดูตัวอย่างกันเลย
ตัวอย่างการใช้งาน
A = [1,2,3,4,5]
print(list(map(lambda x:2*x,A)))
ผลลัพธ์การรัน
[2,4,6,8,10]
คำอธิบาย
เนื่องจากผลลัพธ์จากการ map จะได้ผลลัพธ์ออกมาเป็น < map object > เราจะต้องทำการแปลงผลลัพธ์ให้เป็น List หรือ numpy array ด้วย เพื่อเอาผลลัพธ์ไปใช้งานต่อไป ตามตัวอย่างข้างบนเลยครับ
filter
ทีนี้มาดูตัวถัดมากัน ชื่อของมันก็คือ filter ครับ ตามชื่อเลย ก็คือเจ้า filter เนี่ยมันจะทำหน้าที่กรองสมาชิกใน List หรือ numpy array ออกมานั่นเองครับ แน่นอนมันก็จะรับพารามิเตอร์ 2 ตัว เหมือนกับ map เลย ก็คือ ตัวแรกเป็นฟังก์ชัน ตัวที่ 2 เป็น List หรือ numpy array ทีนี้เรามาดูตัวอย่างการใช้งานกันเลยครับ
ตัวอย่างการใช้งาน
x = filter(lambda x:x>2,[1,2,3,4,5,6])
print(list(x))
ผลลัพธ์การรัน
[3,4,5,6]
reduce
แถมให้อีกตัวก็คือเจ้า reduce นั่นเองครับ ไอ้เจ้า reduce มาจาก library ที่ชื่อว่า functools เป็น library ที่มีติดเครื่องทุกคนอยู่แล้วครับ ไอ้เจ้า functools เนี่ยเป็น library ที่เก็บฟังก์ชันที่ทำงานเป็นเหมือนตัว iterator ไว้ครับ ซึ่งเจ้า reduce ก็เป็นหนึ่งในนั้นครับ ตัวอย่างถ้าผมต้องการจะหาผลรวมเลขทั้งหมดใน List ผมสามารถใช้ไอ้เจ้า reduce ที่มีคุณสมบัติเป็นตัว iterator เข้ามาช่วยได้ครับ
ตัวอย่างการใช้งาน
from functools import reduce
print(reduce(lambda x,y:x+y,[1,2,3,4,5]))
ตัวอย่างผลลัพธ์
15
ความจริงแล้ว functools ยังมี iterator อีกหลายตัวเลยครับ เช่น ตัวเด็ดๆก็ partial , wraps , total_ordering , update_wrapper , Iru_cache , singledispatch และอื่นๆอีกมากมาย ถ้านักอ่านท่าไหนต้องการศึกษาเพิ่มผมจะทิ้ง referenced link ไว้ที่ References นะครับ
สรุป
จริงๆแล้ว Lambda Function ไม่ได้มีแค่ในภาษา Python แค่ภาษาเดียว แต่ภาษาอื่นค่ายดังๆไม่ว่าจะเป็น Java หรือ Kotlin ต่างก็มี Lambda Function กันทั้งนั้น แต่ในภาษา Java อาจจะค่อนข้างใช้ยากกว่า Python หน่อยๆ เนื่องจากต้องมีการสร้าง Interface ก่อนแล้วค่อยเรียกใช้งาน Lambda Function ผ่าน Interface ที่เราสร้างขึ้นอีกที แต่ก็เป็นที่ชื่นชอบของคนที่เขียนแอพแอนดรอยด์ (Android Application) เพราะถ้าเป็นคนเขียนแอพแอนเรอยด์ (Android Application) หรือเดสก์ท็อปแอพ (Desktop Application ) จะได้ใช้ประโยชน์จากเจ้า Lambda Function ตัวนี้ค่อนข้าวบ่อยเลยทีเดียว สุดท้ายนี้ก็ขอให้นักอ่านทุกท่านทำความเข้าใจเอาไว้ให้ดี สุดท้ายนี้ก็ขอขอบคุณนักอ่านทุกท่านที่แวะเข้ามาอ่าน แล้วเจอกันบทความหน้า สวัสดีครับ
References
https://www.w3schools.com/python/python_lambda.asp
https://www.geeksforgeeks.org/functools-module-in-python/