1.高階函數
1.1什麼是高階函數?
- 第一個特點 接收一個或者多個函數作爲參數
- 第二個特點 將函數作爲函數值返回(也稱爲閉包)
- 以上特點符合一個,就爲高階函數
當我們使用一個函數作爲參數,實際上是指將指定的代碼傳遞進了目標函數
'''
定義一個函數
可以將指定的列表中的所有偶數,
保存到一個新的列表中返回
'''
list = [1,2,3,4,5,6,7,8,9,10]
# 定義一個函數 用來檢測一個偶數
def fn1(j):
if j % 2 == 0:
return True
# 定義一個 查找3的倍數的函數
def fn3(n):
if n % 3 == 0:
return True
# 定義一個大於5的函數
def fn2(k):
if k > 5:
return True
return False
'''
當我們使用一個函數作爲參數,
實際上是指將指定的代碼傳遞進了目標函數
'''
def fn (func,list):
# 參數func 調用的函數
# list 要進行篩選列表
# 創建一個新的列表
new_list = []
for i in list:
if func(i):
new_list.append(i)
return new_list
print(fn(fn3,list)) # [3, 6, 9]
2.閉包
- 通過閉包可以創建一些只有當前函數能訪問的變量
- 可以將一些私有數據藏到閉包中
# 求多個數的平均值
def make_average():
nums = []
#定義一個函數計算平均值
def average(i):
#將num添加到列表中
nums.append(i)
#求平均值
return sum(nums)/len(nums)
return average
vaule = make_average()
print(vaule(1),vaule(2),vaule(3)) #
- 形成閉包的條件
- 函數嵌套
- 內部函數作爲返回值返回
- 內部函數必須使用外部函數的變量
3.裝飾器的引入
當我直接修改某個程序時,直接修改會殘生幾個問題:
- 如果修改的函數較多,修改起來非常麻煩
- 不方便後期維護
- 直接修改違反開閉原則(ocp)
- 程序設計要求開發對程序的擴展 要關閉對程序的修改
4.裝飾器的引用
- 簡單地說,裝飾器可以不改變原函數的情況下,來對函數進行擴展。
"""
用來對其他函數進行擴展
在函數執行的時候 提示開始執行
執行完畢提示 提示執行完畢
"""
def fn():
print("我是fn函數")
# 求任意兩個數的和
def add(a,b):
return a + b
"""
start_end(old) 函數就是裝飾器
"""
def start_end(old):
# 參數 old 表示要擴展的函數
# 創建一個新函數
def new_function(*args,**kwargs):
print("開始執行")
result = old(*args,**kwargs)
print("執行完畢")
return result
return new_function
f = start_end(add)
r = f(15,56)
print(r) #執行結果如下
'''
開始執行
執行完畢
71
'''
@start_end # 另一種調用方法法
# 求任意兩個數的積
def mul(a,b):
return a * b
k = mul(15,56)
print(k) #執行結果如下
'''
開始執行
執行完畢
840
'''