高階函數


一、遞歸函數

1、含義:一個含直接或間接調用本函數語句的函數被稱之為遞歸函數(函數直接或間接調用函數本身,則該函數稱為遞歸函數)

2、遞歸函數需要滿足以下兩個條件:

1)在每一次調用自己時,必須是(在某種意義上)更接近於解;
2)必須有一個終止處理或者計算的准則

階層的遞歸函數
def factorial(n):
if(n == 0 or n == 1):
return 1
else:
return n * factorial(n-1)

3、最大遞歸邊界

1)默認的最大遞歸邊界是1000次

#獲取最大遞歸值
import sys
sys.getrecursionlimit()
#設置最大遞歸深度
sys.setrecursionlimit(5000)

2)從內存方面講解遞歸效率問題

a、python中不推薦使用遞歸,因為遞歸吃內存

b、遞歸調用自身時,都會占用一小塊內存存儲函數中的變量以及結果,使用緩存功能裝飾器可以緩存相同參數的函數調用結果,節省內存,提高運行速率

 

 

 4、通過緩存解決最大遞歸限制的問題

1、python的functools模塊中提供了很多高階函數的操作

2、lru_cache:緩存功能裝飾器

a、能夠緩存相同參數的函數調用結果,可以節約高開銷或I/O函數的調用時間

b、通過lru_cache裝飾遞歸函數

 

 

二、匿名函數

1、語法

lambda 參數:返回值

2、使用場景

a、用來定義一些比較簡單,不會重復使用的函數,

b、函數當作參數使用

def func(n):
return n * 3

以上創建匿名函數:
lambda n : n*3

 

 

 

 c、匿名函數結合三目運算符

1)lambda x: x * 10 if x < 5 else x * 2

參入的參數如果小於5就輸出x*10,否則輸出x * 2

2)可處理一些簡單的判斷邏輯

 

三、內置函數

1、filter內置函數

過濾函數,接收參數為兩個參數,第一個位置參數是函數,第二個位置參數是可迭代對象

res = filter(lambda n : n >3, [1,2,3,4,5,6,7,8,9])
print(list(res))

過濾出列表中大於3的數

第一個參數函數依次取第二個參數的列表中的元素,進行判斷,如果為true則保留,如果為false則去除

2、abs 獲取絕對值

3、exec 執行python代碼

4、all內置函數

判斷所有的值都不為空,迭代對象內所有的元素都為真,返回True

 

 

 傳入的是可迭代對象

5、any內置函數

迭代對象內只要有一個元素為真,返回True

 

 

 傳入可迭代對象

6、map內置函數

將函數應用於iterable中每一項並輸出其結果的迭代器

 

 

 

7、zip內置函數

聚合打包:以最短的列表為准

 

 

  

 

 

 8、其他內置函數

四、純函數和函數副作用

 1、純函數不是一種函數,是一種概念

2、純函數的好處

減輕代碼的耦合度

3、純函數的概念

簡單來說,一個函數的返回值結果只依賴於它的參數,並且在執行過程里面沒有副作用,我們就把這個函數叫做純函數

4、純函數的3個原則

1)變量都只在函數作用域內獲取,作為的函數參數傳入

2)不會產生副作用(side effects),不會改變被傳入的數據或者其他數據(全局變量)

3)相同的輸入保證相同的輸出

示例:

func是純函數,func2不是純函數,相同的輸入不能保證相同的輸出,變量不僅僅是自己的參數還有全局變量c

 

 

 func3不是純函數,它對外部環境有副作用,改變了列表的值

 

 

 5、函數的副作用

副作用是指函數被調用,完成了函數既定的計算任務,但同時因為訪問了外部數據,尤其是因為對外部數據進行了寫操作,從而一定程度地改變了系統環境

 

五、閉包與裝飾器

1、閉包
1)函數內部可定義函數
外層函數可以通過return返回內層函數
2)什么是閉包?
1、外層函數中嵌套一個內層函數
2、外層函數的返回值,是內層嵌套的函數名
3、內層函數對外部有非全局變量的引用

 

 2、裝飾器

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM