1,高階函數python
還記得第一篇中我這麼說:python中的對象不是以變量爲準,而是以「字符串」爲準。函數
那這裏的「字符串」的含義能夠是數字、字符串、列表、元組、集合、字典等python中所容許的任意的數據類型。spa
函數,能夠看作是python中一種特殊的數據類型。所以我能夠這麼說:定義函數的過程,實際上是聲明瞭一個特殊的變量,這個變量指向了內存中的一段代碼,這段代碼就是咱們定義的函數。對象
因此能夠得出結論:python中函數名稱也是變量。請看這個示例:排序
那所謂的高階函數,其實就是爲了闡明這個道理,同時還強調了一點就是,既然函數名稱是變量,那麼變量是能夠傳遞到函數內部的,因此函數名也能夠傳遞到函數內部,也就是說:一個函數是能夠接受另一個函數做爲參數的。內存
舉例以下:作用域
那麼一樣的,參數能夠傳入就一樣能夠返回,就像下面這樣,當調用一個函數的時候,這個函數返回另一個函數,這樣就容許你拿着返回回來的函數,作對應的操做。字符串
對於函數中返回函數這種狀況而言,其實不多會出現這種狀況,除非你不想在調用「父函數」的時候就當即執行操做,而是返回一個「子函數」,當你須要的時候再經過調用「子函數」來執行對應的邏輯。io
可是,因爲python的這種特性。function
什麼特性?
在函數中,還能夠定義和調用其餘函數!
因而,咱們的代碼能夠這麼寫:
在函數中調用函數,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中的另一個 高階函數,它的做用是把列表中的值依次做用於一個函數(固然,這裏是個匿名函數),而後保存每一次做用後的結果,針對這些結果作「累積」運算!
-----------------------------------------------華麗的分割線------------------------------------------
下一步,模塊!