天天看點

Python-高階函數

一.函數

函數本身也可以指派給變量,即:變量可以指向函數。

<a href="https://s5.51cto.com/wyfs02/M01/A4/47/wKioL1mntX_AsFvwAAAu6QEdFKk108.png" target="_blank"></a>

函數名其實就是指向函數的變量!

下述操作發現:abs為函數名,給abs=1重新指派後,abs已不是函數,而是一個整數。

<a href="https://s4.51cto.com/wyfs02/M02/05/96/wKiom1mntZXAJPAaAABSXBwZsrU556.png" target="_blank"></a>

二.内置的高階函數

變量可以指向函數,函數的參數能接收變量,那麼一個函數就可以接收另一個函數作為參數,這種函數就稱之為高階函數。

1.map

map() 函數接收兩個參數,一個是函數,一個是序列, map 将傳入的函數依次作用到序列的每個元素,并把結果作為新的 list 傳回。

<a href="https://s5.51cto.com/wyfs02/M01/05/96/wKiom1mntzvxzjcpAABWf0ft3_w711.png" target="_blank"></a>

2.reduce

reduce 把一個函數作用在一個序列[x1, x2, x3...]上,這個函數必須接收兩個參數,reduce 把結果繼續和序列的下一個元素做累積計算。

reduce(f,[1,2,3,4])  === &gt; add(add(add(1,2),3),4)   

reduce(cheng,range(1,11))

 求10的階乘:

<a href="https://s5.51cto.com/wyfs02/M02/05/97/wKiom1mnup3gKc7iAAA31v0xDfo530.png" target="_blank"></a>

3. filter

filter() 也接收一個函數和一個序列。和 map() 不同的時,filter() 把傳入的函數依次作用于每個元素,然後根據傳回值是 True還是 False 決定保留還是丢棄該元素。

<a href="https://s4.51cto.com/wyfs02/M02/05/97/wKiom1mnu7CxMMZPAABKZXovgrE520.png" target="_blank"></a>

4.sorted()

排序也是在程式中經常用到的算法。 無論使用冒泡排序還是快速排序,排序的核心是比較兩個元素的大小。通正常定如下:

x &lt; y, return -1

x == y, return 0

x &gt; y, return 1

<a href="https://s1.51cto.com/wyfs02/M01/A4/48/wKioL1mnu-nThREvAAAgBKtLINU399.png" target="_blank"></a>

<a href="https://s1.51cto.com/wyfs02/M00/05/97/wKiom1mnu_-i7hgKAAAr5frHdjI077.png" target="_blank"></a>

<a href="https://s3.51cto.com/wyfs02/M00/A4/48/wKioL1mnvCCRRa7yAAByaLPqHxM737.png" target="_blank"></a>

倒序排序:

<a href="https://s1.51cto.com/wyfs02/M00/05/97/wKiom1mnvbnBgA9KAAB2x1_Qdmk788.png" target="_blank"></a>

三.函數作為傳回值

高階函數除了可以接受函數作為參數外,還可以把函數作為結果值傳回。

<a href="https://s2.51cto.com/wyfs02/M01/05/CE/wKiom1msy9SCQZ9wAACEZUuSD7M170.png" target="_blank"></a>

四.匿名函數

1.當我們在傳入函數時,有些時候,不需要顯式地定義函數,直接傳入匿名函數更友善。

2.關鍵字 lambda 表示匿名函數,冒号前面的 x 表示函數參數。

<a href="https://s1.51cto.com/wyfs02/M02/A4/7F/wKioL1mszMKyEaF3AABMW_YoJyI627.png" target="_blank"></a>

<a href="https://s1.51cto.com/wyfs02/M02/A4/80/wKioL1msz6HxV9udAAAkuvxBM80249.png" target="_blank"></a>

3.匿名函數有隻能有一個表達式,不用寫 return ,傳回值就是該表達式的結果。

4. 因為匿名函數沒有名字,不必擔心函數名沖突。 此外,匿名函數也是一個函數對象,也可以把匿名函數指派給一個變量,再利用變量來調用該函數。

<a href="https://s3.51cto.com/wyfs02/M00/A4/7F/wKioL1mszTrAMyIFAAAztY21CwM676.png" target="_blank"></a>

5.也可以把匿名函數作為傳回值傳回

<a href="https://s1.51cto.com/wyfs02/M01/05/CE/wKiom1mszgjxVqJiAAAymi5Gx1E416.png" target="_blank"></a>

6.死則運算示例:

<a href="https://s5.51cto.com/wyfs02/M00/05/CE/wKiom1ms0K-hYa_XAAErAVpvMIM039.png" target="_blank"></a>

五.裝飾器

裝飾器就是用來裝飾函數。

想要增強原有函數的功能;

但不希望修改now()函數的定義;

在代碼運作期間動态增加功能的方式;

定義的裝飾器實質是傳回函數的高階函數。(試試下面的裝飾器)

例一:

檢視子產品的運作時間

<a href="https://s5.51cto.com/wyfs02/M01/A4/7F/wKioL1mszofij4WYAACApkTvcDE515.png" target="_blank"></a>

<a href="https://s5.51cto.com/wyfs02/M00/05/CE/wKiom1mszqPR2gP4AABoXstez10856.png" target="_blank"></a>

<a href="https://s5.51cto.com/wyfs02/M02/A4/7F/wKioL1mszoeRhgU0AAA-RJauLkI755.png" target="_blank"></a>

裝飾器:

可以加功能

不改變調用方式

例二:

@timer 等于 register = timer(register)

<a href="https://s1.51cto.com/wyfs02/M00/A4/80/wKioL1mszuqiut7oAABhUIAHi4Q785.png" target="_blank"></a>

<a href="https://s1.51cto.com/wyfs02/M02/A4/80/wKioL1mszurzszRRAABTVTJgUu0519.png" target="_blank"></a>

<a href="https://s1.51cto.com/wyfs02/M02/05/CE/wKiom1mszwajiVsVAABFyBikd4Q318.png" target="_blank"></a>

      本文轉自一百個小排 51CTO部落格,原文連結:http://blog.51cto.com/anfishr/1961202,如需轉載請自行聯系原作者