Python – Anonymous function

og:image

Python – Anonymous function

anonymous ฟังก์ชัน คือฟังก์ชันที่ประกาศขึ้นมาโดยไม่ทำการระบุชื่อของฟังก์ชันในการเรียกใช้งาน สำหรับการประกาศฟังก์ชันโดยทั่วไปต้องระบุคีย์เวิร์ด def ไว้หน้าชื่อของฟังก์ชัน เช่น
def calculate_price:

แต่สำหรับฟังก์ชันแบบ anonymous นั้น จะระบุการประกาศฟังก์ชันโดยใช้คีย์เวิร์ด lambda แทน เราจึงสามารถเรียกฟังก์ชันแบบนี้ว่า lambda ฟังก์ชันได้เช่นเดียวกัน

โครงสร้างการใช้งาน anonymous ฟังก์ชัน
lambda <ตัวแปร1, ตัวแปร2 …>: <ประโยคคำสั่งของฟังก์ชัน>

การสร้างฟังก์ชัน anonymous(lambda ฟังก์ชัน)นี้ เราสามารถทำการกำหนดข้อมูลตัวแปรที่ส่งเข้าไปกี่ตัวก็ได้ขึ้นอยู่กับจุดประสงค์การทำงานของฟังก์ชันที่เราเขียนขึ้นมา แต่สามารถระบุ ประโยคคำสั่ง ได้แค่คำสั่ง(expression)เดียวเท่านั้น โดยโปรแกรมจะทำการประมวลผลข้อมูลที่ป้อนเข้าไปด้วยคำสั่งที่กำหนด แล้วจึงคืนผลลัพท์ออกมา

ตัวอย่างการใช้งานของฟังก์ชัน lambda

# สร้าง anonymous ฟังก์ชันสำหรับแปลงข้อมูลในหน่วยเซนติเมตร เป็นหน่วยฟุต
length_in_foot = lambda length_in_cm: length_in_cm * 0.032808

# กำหนดความยาวในหน่วยเซนติเมตร
length_in_cm = 30

# ใช้ฟังก์ชันที่กำหนดทำการแปลงข้อมูลในหน่วยเซนติเมตรเป็นหน่วยฟุต
length_in_foot = length_in_foot(length_in_cm)
print("ความยาว {} เซนติเมตร มีค่าเป็น {:.2f} ฟุต".format( length_in_cm, length_in_foot) )

# โปรแกรมทำการปรินต์ค่า
# ความยาว 30 เซนติเมตร มีค่าเป็น 0.98 ฟุต

โดยฟังก์ชันดังกล่าวจะทำการแปลงค่าความยาวจากหน่วยเซนติเมตรให้เป็นหน่วยฟุต โดยใช้ lambda ฟังก์ชันซึ่งจะรับค่าความยาวหน่วยเป็นเซนติเมตรแล้วทำการแปลงค่าให้เป็นหน่วยของฟุต ดังนี้
lambda length_cm: length_cm * 0.032808

เรามักจะใช้ฟังก์ชัน anonymous(lambda ฟังก์ชัน)เมื่อเราต้องการสร้างฟังก์ชันแบบไม่ต้องระบุชื่อ และต้องการใช้คำสั่งนั้นดำเนินการใดเพียงแค่ช่วงสั้นๆ เราอาจใช้ anonymous ฟังก์ชันนี้ ร่วมกันกับฟังก์ชันที่มีอยู่แล้วเช่น ฟังก์ชัน filter() หรือ map()

การใช้งาน anonymous ฟังก์ชันร่วมกับฟังก์ชัน filter()

ฟังก์ชัน filter จะรับข้อมูลเข้าไปประมวลผล 2 ตัว โดยตัวแรกเป็นฟังก์ชันสำหรับใช้ตรวจสอบ และตัวที่สองเป็นชุดข้อมูล โดยฟังก์ชัน filter จะนำข้อมูลแต่ละตัวในชุดข้อมูลมาส่งไปตรวจสอบโดยฟังก์ชันที่กำหนด แล้วทำการคืนค่าเป็นลิสต์ของข้อมูลใหม่ ซึ่งจะบรรจุข้อมูลที่ฟังก์ชันประมวลผลแล้วว่าเป็นจริงเท่านั้น โดยชุดข้อมูลใหม่อาจมีขนาดเท่ากันกับชุดข้อมูลที่ส่งเข้าไป หรือมีขนาดเล็กกว่าได้
การเรียกใช้งานฟังก์ชัน map
filter(<ฟังก์ชันที่จะใช้ประมวลผล>, <ชุดของข้อมูล>)

ตัวอย่างการใชังานฟังก์ชัน filter

# กำหนดลิสต์ข้อมูลจำนวนเต็มบวก
data_list = [0, 1, 2, 5, 8, 11, 12, 13, 14, 17, 20]

# ใช้งาน anonymous ฟังก์ชัน ร่วมกับการใช้งานฟังก์ชัน filter เพื่อเลือกเฉพาะข้อมูลที่เป็นจำนวนคู่ จากชุดข้อมูลที่กำหนด 
even_list = list( filter(  lambda x: (x%2 == 0), data_list ) )

print("ชุดข้อมูล {}".format(data_list))
print("ผลการตรวจสอบข้อมูลที่เป็นจำนวนคู่มีดังนี้")
for i in range(len(even_list)):
    print( "จำนวนคู่: {}".format( even_list[i] ) )

# โปรแกรมทำการปรินต์ค่า
# ชุดข้อมูล [0, 1, 2, 5, 8, 11, 12, 13, 14, 17, 20]
# ผลการตรวจสอบข้อมูลที่เป็นจำนวนคู่มีดังนี้
# จำนวนคู่: 0
# จำนวนคู่: 2
# จำนวนคู่: 8
# จำนวนคู่: 12
# จำนวนคู่: 14
# จำนวนคู่: 20

การใช้งาน anonymous ฟังก์ชันร่วมกับฟังก์ชัน map()

ฟังก์ชัน map นั้นจะรับข้อมูล 2 ตัวเข้าไปประมวลผล ตัวแรกเป็นฟังก์ชันที่ใช้ดำเนินการ และตัวที่สองเป็นลิสต์ของข้อมูล จากนั้นจึงนำข้อมูลแต่ละตัวในลิสต์ไปประมวลผลโดยฟังก์ชันที่กำหนดแล้วจึงสร้างเป็นสิสต์ข้อมูลใหม่ซึ่งมีขนาดเท่ากับลิสต์ของของมูลที่ส่งเข้าไป แต่จะเป็นข้อมูลใหม่ที่เกิดดำเนินการจากฟังก์ชันที่กำหนดแล้ว
การเรียกใช้งานฟังก์ชัน map
map( <ฟังก์ชันที่จะใช้ประมวลผล>, <ชุดของข้อมูล>)

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

import math
# กำหนดลิสต์ข้อมูลของรัศมีวงกลม
radius_list = [1, 2, 5, 8, 11, 12, 14]

# ใช้งาน anonymous function ร่วมกับฟังก์ชัน map เพื่อทำการคำนวณหาพื้นที่ของวงกลมจากชุดข้อมูลรัศมีที่กำหนด
area_list = list( map(  lambda radius: (math.pi * radius * radius),  radius_list ) )

print("ผลการคำนวณหาพื้นที่ของวงกลมจากรัศมีที่กำหนด")
for i in range(len(radius_list)):
    print("วงกลมที่มีรัศมี {} หน่วย มีพื้นที่ {:.2f} ตารางหน่วย".format(radius_list[i], area_list[i]))

# วงกลมที่มีรัศมี 1 หน่วย มีพื้นที่ 3.14 ตารางหน่วย
# วงกลมที่มีรัศมี 2 หน่วย มีพื้นที่ 12.57 ตารางหน่วย
# วงกลมที่มีรัศมี 5 หน่วย มีพื้นที่ 78.54 ตารางหน่วย
# วงกลมที่มีรัศมี 8 หน่วย มีพื้นที่ 201.06 ตารางหน่วย
# วงกลมที่มีรัศมี 11 หน่วย มีพื้นที่ 380.13 ตารางหน่วย
# วงกลมที่มีรัศมี 12 หน่วย มีพื้นที่ 452.39 ตารางหน่วย
# วงกลมที่มีรัศมี 14 หน่วย มีพื้นที่ 615.75 ตารางหน่วย

ที่มาของข้อมูล: https://www.programiz.com/python-programming/anonymous-function
อ่านเพิ่มเติมเกี่ยวกับฟังก์ชัน filter: filter
อ่านเพิ่มเติมเกี่ยวกับฟังก์ชัน map: map