Python中的高階函數與匿名函數
高階函數
高階函數就是把函數當做參數傳遞的一種函數。其與C#中的委托有點相似,個人認為。
def add(x,y,f): return f( x)+ f( y) print add(-18,11,abs)
它將這么執行:
abs(-18) + abs(11)
結果則會是:
29
map()函數
map()是 Python 內置的高階函數,它接收一個函數 f 和一個list,並通過把函數 f 依次作用在 list 的每個元素上,得到一個新的 list 並返回。
def f(x): return x* x print map(f,[1,2,3,4,5,6,7]) #list里的每個元素都會走一遍f(x)方法
結果將會是:
[1, 4, 9, 10, 25, 36, 49]
reduce()函數
reduce()函數也是Python內置的一個高階函數。reduce()函數接收的參數和 map()類似,一個函數 f,一個list,但行為和 map()不同,reduce()傳入的函數 f 必須接收兩個參數,reduce()對list的每個元素反復調用函數f,並返回最終結果值。
def f(x ,y ): return x* y print reduce(f,[1,2,3,4]) #1*2*3*4
它的結果將會是這樣:
24
如若想給初始值呢?需要這樣:
def f(a,b): return a+ b print reduce(f,[1,2,3,4],10) #1+2+3+4+10.這里的第三個參數是做為初始值的。
結果會是:
20
filter()函數
filter()函數是 Python 內置的另一個有用的高階函數,filter()函數接收一個函數 f 和一個list,這個函數 f 的作用是對每個元素進行判斷,返回 True或 False,filter()根據判斷結果自動過濾掉不符合條件的元素,返回由符合條件元素組成的新list。
def is_odd(x): return x%2==1
print filter(is_odd,[1,2,3,4,5,6,7])
結果是:
[1, 3, 5, 7]
自定義排序函數
Python內置的 sorted()函數可對list進行排序:
sorted([36, 5, 12, 9, 21])
結果是:
[5, 9, 12, 21, 36]
但 sorted()也是一個高階函數,它可以接收一個比較函數來實現自定義排序,比較函數的定義是,傳入兩個待比較的元素 x, y,如果 x 應該排在 y 的前面,返回 -1,如果 x 應該排在 y 的后面,返回 1。如果 x 和 y 相等,返回 0。
匿名函數
高階函數是可以把函數當參數來傳遞的,那么當不需要顯示傳遞的函數名稱時應該怎么辦呢?我們就可以用到匿名函數。
比如上面講了Map()函數,當時的例子是這樣:
def f(x): return x* x print map(f,[1,2,3,4,5,6,7]) #list里的每個元素都會走一遍f(x)方法
要將其改成匿名函數,匿名函數的話需要用到lambda關鍵字,后面跟參數,然后冒號,再后面就寫表達式,也就是返回的結果,不用寫return。那么這個匿名方法將會是這樣:
print map(lambda x:x*x,[1,2,3,4,5,6,7])
最后將上面的reduce()函數改成匿名函數吧,略體會下匿名方法的寫法。原本是這樣:
def f(x ,y ): return x* y print reduce(f,[1,2,3,4]) #這里是寫"f",而不是"f()"
匿名方法將是:
print reduce(lambda x,y:x+y,[1,2,3,4,5])