高級函數是個啥?

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
'''


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章