python(七)高階函式,匿名函式
1,高階函式
還記得第一篇中我這麼說:python中的物件不是以變數為準,而是以“字串”為準。
那這裡的“字串”的含義可以是數字、字串、列表、元組、集合、字典等python中所允許的任意的資料型別。
函式,可以看做是python中一種特殊的資料型別。因此我可以這麼說:定義函式的過程,其實是聲明瞭一個特殊的變數,這個變數指向了記憶體中的一段程式碼,這段程式碼就是我們定義的函式。
所以可以得出結論:python中函式名稱也是變數。請看這個示例:
那所謂的高階函式,其實就是為了闡明這個道理,同時還強調了一點就是,既然函式名稱是變數,那麼變數是可以傳遞到函式內部的,所以函式名也可以傳遞到函式內部,也就是說:一個函式是可以接受另外一個函式作為引數的。
舉例如下:
那麼同樣的,引數可以傳入就同樣可以返回,就像下面這樣,當呼叫一個函式的時候,這個函式返回另外一個函式,這樣就允許你拿著返回回來的函式,做對應的操作。
對於函式中返回函式這種情況而言,其實很少會出現這種情況,除非你不想在呼叫“父函式”的時候就立即執行操作,而是返回一個“子函式”,當你需要的時候再通過呼叫“子函式”來執行對應的邏輯。
但是,由於python的這種特性。
什麼特性?
在函式中,還可以定義和呼叫其他函式!
於是,我們的程式碼可以這麼寫:
在函式中呼叫函式,python會根據“就近原則”去決定到底呼叫那一個函式。
其實,只要你理解了:函式名也是變數
2,高階函式舉例
一個常見的場景是,我們需要對列表、集合或者字典中的元素進行“過濾”。
filter 函式:接收一個函式和一個序列,它會依次把序列中的元素放到函式中,然後根據函式返回值是 True 還是 False 來決定是否保留該元素
一個案例:把一個列表中,不是素數的元素全部都過濾掉
另一個常見的場景就是排序。
sorted 函式:可以根據指定的函式,對列表,字典等進行排序。sorted 函式規定,對於兩個元素 x,y ,如果 x > y 則返回1,x < y 則返回 -1,x == y 則返回 0
一個案例:對列表中的元素實現倒序排列
3,匿名函式
匿名函式,就是python中有名的“lambda”表示式。
對於這種匿名函式,它的一個限制就是函式體的程式碼只能有一個表示式,而且不需要寫 return,改函式的返回值就是函式的呼叫結果。
一個簡單的案例:對兩個數做加法
根據案例可以確定,匿名函式採用關鍵字“lambda”宣告,然後 “:”前面是函式的引數,後面則是運算的表示式。該“lambda”表示式返回的值是一個“function”,然後可以通過該返回值來呼叫這個匿名函式,當然了,你也可以直接呼叫,就像下面這樣!
複雜的案例:求給定數 n 的階乘
其中 reduce 是python中的另外一個 高階函式,它的作用是把列表中的值依次作用於一個函式(當然,這裡是個匿名函式),然後儲存每一次作用後的結果,針對這些結果做“累積”運算!