python-lambda-expression
python-lambda-expression

ถ้าให้พูดจริงๆแล้ว เราสามารถเลือกที่จะไม่ใช้ Lambda ในชีวิตจริงเลยก็ได้ แต่การใช้มันเนี่ยจะช่วยให้เราลดสถานการณ์นี้ได้

  • ลดความซํ้าซ้อนของ code พวกโค้ดขยะ
  • อ่านได้ง่ายขึ้น และ มีความหมายที่ชัดเจนมากๆ (ยังไงลงไปอ่านข้างล่างพวก use cases เลย)

ซึ่งจะทําให้เราเขียนโค้ดได้สะอาดมากขึ้น 🙂

เจ้า Lambda Operator หรือ Lambda Function จริงแล้วเป็นวิธีการสร้าง Anonymous function (นั้นก็คือ function ที่ไม่มีชื่อนั้นแหละ) ซึ่งเทคนิคนี้น่ะเป็นที่นิยมมากของการเขียน Functional Programming

โดยปกติแล้วเราจะนําเอา Lambda Function นี้ไปผสมกับ Map,Reduce,Filter ซึ่งจะนํามาพูดวันนี้แหละ

ตัวอย่าง Lambda Expression 

#python lambda syntax
lambda arguments: expression 

#normal way of python function
def add(x, y):
   return x + y

#lambda function
additive = lambda: x,y: x+y

print(add(1,2)) # เท่ากับ 3
print(additive(1,2)) # เท่ากับ 3 เหมือนกัน

แต่สังเกตุมั้ยว่าเจ้าตัว additive เนี่ยเราสามารถเป็น variables ที่สามารถนําไปใช้โยนไปใช้กับ function อื่นได้ ซึ่งสามารถนําไปออกแบบใน function หลายๆอย่างๆได้ง่ายขึ้น เช่น dynamics function ที่รับเข้าไป exec แล้วเอาข้อมูลลง 🙂

ซึ่งการใช้ lambda เนี่ยปกติแล้ว เราจะนําไปใช้กับ function หลักๆ 3 อย่างนี้ เพื่อให้เกิดประสิทธิ์ภาพสูงสุด นั้นก็คือ

  1. Map
  2. Filter
  3. Reduce

Map

ทําไมเราต้องสนใจเจ้า Map ด้วย? เพราะสิ่งที่เวลาเราเขียนโปรแกรมทุกๆครั้งนี้อะ ไม่พ้นการ iterate list และเอาผลลัพธ์ออกมาใช้ต่อ ถูกต้องมั้ย?

python-iterate-list
python-iterate-list (http://www.bogotobogo.com/python/python_fncs_map_filter_reduce.php)

แบบตัวอย่างนี้เลย สมมุติต้องการคํานวณค่า square ก็สร้าง list แล้วก็ iterate นั้นเอง เป็นท่าเบสิคสุดๆ

python-map-function
python-map-function (http://www.bogotobogo.com/python/python_fncs_map_filter_reduce.php)

แต่เจ้า Map function เนี่ยมันมาช่วยให้เราเขียนโค้ดสไตล์ functional programming ที่ให้สะอาด และอ่านง่ายขึ้น โดยการโยน function sqr เข้าไป แล้วก็ให้มัน exec เข้า list ไปเลย แต่ด้วยวิธีนี้มันยังเลอะเทอะอยู่ดี

python-map-anonymous-function
python-map-anonymous-function (http://www.bogotobogo.com/python/python_fncs_map_filter_reduce.php)

เลยต้องใช้เป็น anonymous function หรือ lambda ในที่นี้นั้นเอง โดยการย่อเหลือบรรทัดเดียว แล้วได้ผลลัพธ์เลย จะเห็นว่ามันสะอาด และอ่านเข้าใจง่ายกว่าเยอะมาก 🙂

โดยหน้าตาของ syntax ก็จะประมาณข้างล่างนี้

#python map function syntax
r = map(func, seq1, seq2, .. ,seqX) 

เจ้าประโยคนี้สิ่งท่ีมันทําก็คือ รับ function เข้ามา

 

โดยการใช้ function map เราสามารถส่ง seq กี่ตัวก็ได้เข้าไปใน function map โดยมีข้อแม้อย่างเดียวคือ ต้องมี size ที่เท่ากันนั้นเอง เช่นมี list length 4 ก็ต้อง 4 เท่ากันหมด

python-annonymous-function-with-multiple-list
python-annonymous-function-with-multiple-list (https://www.python-course.eu/lambda.php)

ไม่เพียงแต่ list ของ seq น่ะ เจ้า function ก็ทําเป็น list ได้เหมือนกัน

python-map-multiple-function
python-map-multiple-function (http://www.bogotobogo.com/python/python_fncs_map_filter_reduce.php)

จําง่ายๆๆเลยก็คือ Map === For Loop นั้นเอง 🙂

ข้อดีอีกอย่างคือ Map เร็วกว่า LOOP !!!! ด้วยน่ะ เพราะฉะนั้นเขียนโปรแกรม คิดถึง Performance ด้วยล่ะ

คล้ายๆกับ List comprehension expression แต่แทนที่จะใช้ +-*/ กลับใช้ function แทน

Reduce

มาดูตัวต่อไปบ้าง เจ้า Reduce ขอทําเป็นรูปใหญ่เพราะ น่าสนใจ 🙂

python-reduce-function
python-reduce-function (https://www.python-course.eu/lambda.php)

มันค่อนข้างแปลกกว่าตัวอื่นๆคือ มันรับ function iterator เหมือนกัน แต่ผลลัพธ์มันไม่ออกมาเป็น list น่ะ มันจะออกมาเป็น single value …. ไม่น่าละถึงชื่อว่า reduce มันลดรูปจนเหลือเพียงค่าเดียวนั้นเอง

อย่างตัวอย่างจากรูปเนี่ยรับ list เข้าไปและประมวลผลจนเหลือถึงค่าสุดท้าย โดยการเอาค่าวนไปเรื่อยๆๆนั้นเอง ตัวอย่าง use cases ของ reduce ที่น่าสนใจ

python-reduce-use-cases
python-reduce-use-cases (https://www.python-course.eu/lambda.php)

cases พวกนี้น่าจะเกิดได้จริงเวลาเราเขียน feature ต่างๆนั้นเอง

Filter

เจ้าตัวนี้เข้าใจง่ายรองลงมาจาก Map เลย คือมันทํา filter ตามชื่อมันเลยนั้นแหละ โดยการโยน function เข้าไปจัดการกับ Iterator นั้นๆๆเช่น

python-filter-lambda
python-filter-lambda (http://www.bogotobogo.com/python/python_fncs_map_filter_reduce.php)

เห็นม่ะ?​ มันจัดการ filter ตัวที่ไม่จําเป็นออกไป ให้เหลือเท่าที่ต้องการเลย 🙂 แสดงว่าเวลาเราทํา feature อะไรใหม่ๆ เราก็ใช้ filter function เครียล์ตัวที่ไม่ต้องการออกไปได้เลยล่ะ

สรุปหน่อย

จริงๆพึ่งมาใส่ใจการใช้ functional programming จริงๆจังๆ เร็วๆนี้ ดูแล้วมันช่วยลดโค้ดขยะลงไปได้เยอะมากเลยน่ะ โดยยึดจาก use cases ต่างๆของ Map,Reduce,Filter พวกนี้ประยุกต์ได้เยอะมากลย 🙂 ลองเอาไปใช้ในสถานการณ์จริงกันน่ะ … แต่อย่าลืมเขียน unit test ล่ะ มันคือ Life Saver เลย

2
Leave a Reply

avatar
1 Comment threads
1 Thread replies
0 Followers
 
Most reacted comment
Hottest comment thread
2 Comment authors
Martaui Recent comment authors

This site uses Akismet to reduce spam. Learn how your comment data is processed.

newest oldest most voted
aui
aui

มาร์ทน่าจะบอกอีกหน่อยว่า “Map === For Loop โดยมีข้อดีคือ map เร็วกว่า loop”