Professional Documents
Culture Documents
06 Lambda Stream
06 Lambda Stream
กอนเปนแลมบดา
การนิยามฟงกชัน เพื่อใหเรียกฟงกชันใหใชงานตามชื่อ เปนวิธีการใชงานซ้ําของสิ่งที่สรางไวแลว แตถาเราไมตองการ
ใชงานซ้ํา เพียงแคตองการใช ณ เวลานั้น ก็ไมจําเปนตองนิยามฟงกชัน ใหใชงานในระยะตอไป
เรามาเริ่มทําความเขาใจ แลมบ จาก การสรางฟงกชัน ที่ทําหนาที่บวกยกกําลังสอง ของตัวแปรเขาหนึ่งตัวแลวคืนคา
ผลการยกกําลัง ดังตัวอยางตอไปนี้
Code 1.
>>> def powerOf(x):
... return x*x
...
>>> powerOf(-2)
4
มาเปนแลมปดา
การเขียนโปรแกรมเปนแลมบดา ใหความสะดวกมากกวาการสรางเปนฟงกชัน ประการแรกคือ ใชจํานวนการพิมพ
คําสั่งนอยกวา ดวยไมตองเขียนเต็มรูปแบบฟงกชัน ประการตอมา เขาใจคําสั่งไดงายกวาเพราะเนื้อความคําสั่งมีความหมายใน
ตัว
จากตัวอยางที่ผานมา ที่เขียนฟงกชันยกกําลังสอง ตอนนี้ปรับปรุงใหมใหเปนแลมบดา ซึ่งจะคืนคาผลดําเนินการเลข
ยกกําลังสอง
Code 2.
>>> doubleOf = lambda x : x*x
>>> doubleOf(-4)
16
Code 3.
>>> powerOf = doubleOf
การเขียนโปรแกรมเชิงฟงกชัน
เทคนิคการเขียนโปรแกรมเชิงฟงกชันคือ การสรางการทํางานบนขอมูลที่ไมอานแกไขได (immutable) จึงทําให
ฟงกชันอื่นใชขอมูลเดียวกันได โดยไมผลกระทบตอกัน ลักษณะนี้ถือวาไมใชสถานการณเปลี่ยนแปลงรวมกัน (no state
sharing) จึงไมผลกระทบออกไปยังภายนอกโปรแกรม (no side effects)
การอานขอมูลในลักษณะสงตอ ของฟงกชันอีกทีหนึ่ง หรือสงฟงกชันเปนตัวแปรของฟงกชัน เปนวิธีที่ใชนิยมใชของ
แลมบดา อยางในกรณีฟงกชันการเรียง sorted(data, key) ขอมูล data อยูในรูปขอมูล list และ key เปนเงื่อนไขการเรียง
เมื่อใหการใชเงื่อนไขการเรียงเปน แลมบดา ที่รับขอมูลตอจาก data เปนขอมูลเขาของแลมบดา แลวสงตอไปยังตัวแปร key
ของฟงกชัน sorted อีกที ดังตัวอยางการใชงาน ดังนี้
Code 4.
>>>num = [100, 200, 150]
>>>sorted(num, key:lambda n: n)
[100, 150, 200]
map( )
ฟงกชัน map( ) ใชในการเปลี่ยนแปลงขอมูล ในกลุมขอมูล เชน list, set, tuple, และ dict และจะคืนขอมูลที่
เปลี่ยนแปลงแลวกลับไปตามชนิดกลุมขอมูลนั้น เมื่อใชใสกลับไปในชนิดขอมูลนั้น เชน ใชดําเนินการกับ list ก็จะคืนคาเปน
ชนิด list เมื่อใสกลับลงไปใน list ดังตัวอยางตอไปนี้
Code 5.
>>> nums = [2,4,5]
>>> result = map(lambda x : x**2, nums)
>>>list_sqr = list(result)
>>> print(list_sqr)
[4, 16, 25]
Code 6.
>>> nums = [2,4,5]
>>> list_sqr = list(map(lambda x : x**2, mums))
>>> print(list_sqr)
[4, 16, 25]
ดังตัวอยางการใชนี้ รูปแบบ การใช map จะอยูในรูปทั่วไปคือ:
map(function, collection)
Code 11.
dict_1 = [{'title':'python', 'price':200}, {'title': 'ruby', 'price':300}]
ในไพธอน มีลักษณะคลายกับ การใช ฟงกชัน zip( ) หากยังจํากันได ในบทที่วาดวย กลุมขอมูล list, set, map อาจ
ทดลองเขียนใหมในรูปแบบ zip( ) หรือ แบบ map( ) อยางยอทดสอบความเขาใจ
filter( )
การเพิ่มเงื่อนไข เพื่อคัดกรองขอมูล เราไดเคยทํามาแลว ในการใชเงื่อนไข if ใน list หรือใน map( ) แตถาตองใชใน
เต็มรูปแบบซึ่งมีคําสั่งนี้โดยตรง คือ filter( ) รูปแบบการใชงานคือ
filter(function, iterable)
reduce( )
ฟงกชันนี้ทํางานแปลกวาที่ฟงกชันที่ผานมา อยางแรกคือ ฟงกชันนี้ ตองผานการนําเขาจาก functools กอน ซึ่งใช
งานกับ Python 3 แตสําหรับ Python 2 ไมจําเปนตองนําเขา อยางที่สองคือ ฟงกชัน reduce( ) นี้ จะคืนคาเดียว ไมคืนเปน
กลุมขอมูล เชน การหารวมกันภายใน list ซึ่งจะคืนคาทั้งหมดใน list ที่บวกกัน และคานี้เปนคาเดียว ดังยกตัวอยางไดดังนี้
Code 15.
>>> from functools import reduce
>>> data_reduce = reduce(lambda x, y: x+y, [2,4,6,8])
>>> print(data_reduce)
20
Code 16.
>>> sum([2,4,6])
12
>>> max([2,4,6])
6
Code 17.
>>> nums = [1,2,3,4,5]
>>> sum_sqr = reduce(lambda x,y: x*y, filter(lambda x: x%2==0, nums))
>>> sum_sqr
8
แบบฝกหัด
1. จาก [1, 3, 5, 7] จงแปลงใหเปนเลข ผลบวกของขอมูล แตละคู ซึ่งผลลัพธ คือ [4, 12]
2. จาก คลาส Product ที่ประกอบดวยสมาชิก id, name, price ใหสรางเปน ออบเจ็กต 4 ตัว ที่มี id, name, price
ตางกัน เก็บใน list แลวทําการแปลง list นี้ ใหมี ราคาเพิ่มขึ้น 7%
แหลงขอมูลนาอาน
Joe James. Python: Lambda, Map, Filter, Reduce Functions.
https://www.youtube.com/watch?v=cKlnR-CB3tk.(27 August 2019).
Kite. Best Practices for Using Functional Programming in Python.
https://kite.com/blog/python/functional-programming. (27 August 2019).