Lambda

แลมดาฟังก์ชัน (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

Nattawut Phetmak

Jack of all Trades

blog comments powered by Disqus