***ทั้ง3หัวข้อด้านล่างนี้อ่ะค่ะ หาข้อมูลมานานมากแต่ยังไม่แคบพอจะเข้าใจในแต่ละหัวข้อเลยค่ะ
1.) Higher-order functions 2.) Lambda expressions/functions 3.) ตัวอย่างการใช้งาน
ลองดูบทที่ 1 ดูครับ
http://gnosis.cx/TPiP/
พวกนี้มันเป็น functional programming ครับ
{syntaxhighlighter class="brush: python"} f = lambda x: x+1 f(5) # return 6 (lambda x: x*2)(21) # return 42 {/syntaxhighlighter}
{syntaxhighlighter class="brush: python"} h = lambda f, x: f(x+1) h(lambda x: x*2, 5) # return 12 {/syntaxhighlighter}
อธิบายเรื่อง Higher-order function เพิ่มให้ละกัน
อ้างจาก Wikipedia, function ที่เป็น higher-order function ต้องมีคุณบัติอย่างน้อยหนึ่งข้อจากสองข้อนี้
ยึดตามนิยามนี้ ดูตัวอย่างเคสแรกลอง นึกถึง function บางอันใน python ที่รับ parameter เข้าไปเป็น function เช่น list.sort()
{syntaxhighlighter python}
a = [-100,2,-3,4] a.sort(key=abs) a [2, -3, 4, -100] help(a.sort) Help on built-in function sort:
sort(...) L.sort(cmp=None, key=None, reverse=False) -- stable sort IN PLACE; cmp(x, y) -> -1, 0, 1 {/syntaxhighlighter}
ในตัวอย่างเราส่ง function abs (absolute) เข้าไปเป็น parameter ที่ชื่อ key ของ sort เพื่อให้เรียงลำดับค่าตามค่าสัมบูรณ์ ดังนั้น list.sort จัดว่าเป็น higher-order function
อีกตัวอย่างที่ return ค่าเป็น function บ้าง เช่น เราอาจจะอยากได้ fn ที่ return fn คำนวณออกมาตาม string ที่ใส่เข้าไป
ในตัวอย่างด้านล่าง getoperator เป็น higher-order fn เพราะมัน return ผลลัพธ์ออกมาเป็น fn (เช่นใน op1 และ op2)
def add(x,y): ... return x + y ... def subtract(x,y): ... return x - y ... def multiply(x,y): ... return x * y ... def getoperator(symbol): ... if symbol == '+': ... return add ... elif symbol == '-': ... return subtract ... else: ... return multiply ... op1 = getoperator('+') op2 = getoperator('*') op2(op1(21,19), 10) 400 op1 op2 {/syntaxhighlighter}
def add(x,y): ... return x + y ... def subtract(x,y): ... return x - y ... def multiply(x,y): ... return x * y ... def getoperator(symbol): ... if symbol == '+': ... return add ... elif symbol == '-': ... return subtract ... else: ... return multiply ... op1 = getoperator('+') op2 = getoperator('*') op2(op1(21,19), 10) 400 op1
op2
{/syntaxhighlighter}
มันเป็น Math functional programming ดีๆ นี่เอง
เมพจิงๆ
ลองดูบทที่ 1 ดูครับ
http://gnosis.cx/TPiP/
พวกนี้มันเป็น functional programming ครับ
{syntaxhighlighter class="brush: python"}
f = lambda x: x+1
f(5) # return 6
(lambda x: x*2)(21) # return 42
{/syntaxhighlighter}
{syntaxhighlighter class="brush: python"}
h = lambda f, x: f(x+1)
h(lambda x: x*2, 5) # return 12
{/syntaxhighlighter}
อธิบายเรื่อง Higher-order function เพิ่มให้ละกัน
อ้างจาก Wikipedia, function ที่เป็น higher-order function ต้องมีคุณบัติอย่างน้อยหนึ่งข้อจากสองข้อนี้
1. รับ parameter อย่างน้อยตัวหนึ่งที่เป็น function
2. return ผลลัพธ์ของมาเป็น function
ยึดตามนิยามนี้ ดูตัวอย่างเคสแรกลอง นึกถึง function บางอันใน python ที่รับ parameter เข้าไปเป็น function เช่น list.sort()
{syntaxhighlighter python}
sort(...)
L.sort(cmp=None, key=None, reverse=False) -- stable sort IN PLACE;
cmp(x, y) -> -1, 0, 1
{/syntaxhighlighter}
ในตัวอย่างเราส่ง function abs (absolute) เข้าไปเป็น parameter ที่ชื่อ key ของ sort เพื่อให้เรียงลำดับค่าตามค่าสัมบูรณ์ ดังนั้น list.sort จัดว่าเป็น higher-order function
อีกตัวอย่างที่ return ค่าเป็น function บ้าง เช่น เราอาจจะอยากได้ fn ที่ return fn คำนวณออกมาตาม string ที่ใส่เข้าไป
ในตัวอย่างด้านล่าง getoperator เป็น higher-order fn เพราะมัน return ผลลัพธ์ออกมาเป็น fn (เช่นใน op1 และ op2)
{syntaxhighlighter python}
มันเป็น Math functional programming ดีๆ นี่เอง
เมพจิงๆ