Nattawut Phetmak
Jack of all Trades
แลมดาฟังก์ชัน (lambda function) เป็นมรดกตกทอดจากฝั่ง functional มันคือ syntax สำหรับประกาศฟังก์ชันในอีกรูปแบบหนึ่ง เช่น
def cubic_origin(x):
return x**3
cubic_lambda = lambda x: x**3
print(cubic_origin(10))
print(cubic_lambda(10))
# get same result
และเรายังสามารถใช้มันได้โดยไม่ต้องประกาศชื่อ ใช้เสร็จครั้งเดียวก็จบ ไม่ต้องประกาศเป็นฟังก์ชันให้วุ่นวาย
argument_list = [0,2,3,8,14]
def filter_function(x):
return x < 3
me_origin = list(filter(filter_function, argument_list))
me_lambda = list(filter(lambda x: x < 3, argument_list))
# both return [0,2]
ข้อดีคือ ใน code ที่มีขนาดใหญ่มากๆ จะช่วยลดความสับสนของเราไปได้ครับ
สำหรับส่วนปิดกั้น (closure) คือเหตุการณ์ที่เกิดขึ้นตอนประกาศฟังก์ชันที่เมื่อมีการขอใช้ตัวแปรจาก nonlocal
มันจะ freeze ค่านั้นไว้ เพื่อให้การเรียกใช้ฟังก์ชันนี้ในอนาคตไม่มีผลข้างเคียง ไม่ว่าค่าของตัวแปรที่ไปอ้างอิงมานั้นจะเปลี่ยนแปลงไป
# error sample when closure not occur
pi = 3.1416
circle_area = lambda x: pi * x**2
print(circle_area(1))
# get: 3.1416
# assume that we make mistake by changing pi value
pi = 3.1000
print(circle_area(1))
# get: 3.1000
แม้ว่า Python จะไม่มี syntax เฉพาะสำหรับประกาศ closure เช่นภาษาอื่น แต่ด้วยการส่งผ่านตัวแปร by value และหน้าตาของ scope ตัวแปร ทำให้การสร้าง closure สามารถทำได้ดังนี้ครับ
# make a closure
def freeze_scope(freeze_var):
return lambda x: freeze_var * x**2
pi = 3.1416
circle_area = freeze_scope(pi)
print(circle_area(1))
# get: 3.1416
# change pi
pi = 3.1000
print(circle_area(1))
# still get: 3.1416