1. 程式人生 > >python(七)高階函式,匿名函式

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中的另外一個 高階函式,它的作用是把列表中的值依次作用於一個函式(當然,這裡是個匿名函式),然後儲存每一次作用後的結果,針對這些結果做“累積”運算!