天天看點

python閉包函數&裝飾器

一、函數引用

  • 函數可以被引用
  • 函數可以被指派給一個變量
def hogwarts(): 
    print("hogwarts") 

# hogwarts() # 函數調用 
print(hogwarts) 
print('----------------')
harry = hogwarts # 把函數對象指派給一個變量 
print(harry) 
print('----------------') 
harry() # 引用函數      
python閉包函數&裝飾器

二、閉包函數

  • 閉包的内部函數中,對外部作用域的變量進行引用
  • 閉包無法修改外部函數的局部變量
  • 閉包可以儲存目前的運作環境
def student_grade(grade): # 閉包無法修改外部函數的局部變量 
    grade = '22' 
    print('外函數年級:', grade) 
    
    def output_student(name, gender):
         grade = '11' 
         print('内函數年級為:', grade) 
        # print(f"霍格沃茲測試學社開學啦!" 
        # f"學生的名稱是{name}," 
        # f"性别是{gender}年級是{grade}")
         
    return output_student 

student = student_grade(1) 
student("羅恩", "男") 
student("哈利", "男") student("赫敏", "女")      

三、python裝飾器

  • 行業需求: 涉及 Python 技術棧,面試常見題
  • 使用需求: 優化代碼的可讀性,可維護性

四、裝飾器示例

  • 函數體開始執行與結束執行的時候分别添加列印資訊
""" 裝飾器示例 
函數體開始執行與結束執行的時候分别添加列印資訊 """ 
def hogwarts(): 
    print("霍格沃茲測試學社") 

def hogwarts2(): 
    print("霍格沃茲測試學社2") 

# 把中間的執行函數,使用參數代替 
def function_tips(func): 
    print("函數開始執行") 
# 不在寫死的任何的一個函數,而是任意外部傳入的函數 
    func() 
    print('函數結束執行') 

# 函數對象
function_tips(hogwarts) 
function_tips(hogwarts2)      
python閉包函數&裝飾器
# 使用裝飾器的代碼
# 第一步,定義兩個函數,一個内函數,一個外函數
# 第五步,在裝飾器執行過程中,會自動傳入一個參數,參數就是被裝飾函數的函數對象
def timer(func):
    def inner():
        # 第二步,在内函數添加裝飾器邏輯
        print("函數開始執行")
        func()
        print('函數結束執行')
        # 第三步,把内函數的函數對象return出去

    return inner


# 第四步,裝飾器的使用
@timer
def hogwarts():
    print("霍格沃茲測試學社")


hogwarts()


@timer
def hogwarts2():
    print("霍格沃茲測試學社2")


hogwarts2()      

五、裝飾器練習(裝飾器不帶參數)

實作一個計時器的裝飾器,計算函數執行時間

import datetime

"""
三步走: 1、定義一個外函數,外函數有一個形參,接受被裝飾的函數對象
        2、定義一個内函數,内函數内調用傳入函數
        3、定義外函數的傳回值,外函數傳回值固定的格式為内置函數對象
"""
"""實作一個計時器的裝飾器,計算函數執行時間"""


def timer(func):
    def inner():
        # 擷取目前時間
        start_time = datetime.datetime.now()
        func()
        end_time = datetime.datetime.now()
        print(f"函數的執行時間{end_time - start_time}")

    return inner


@timer
def hogwarts():
    print("霍格沃茲測試學社")


hogwarts()


@timer
def hogwarts2():
    print("霍格沃茲測試學社2")


hogwarts2()      

六、裝飾器帶參數

def timer(func):
    # 如果被裝飾函數有參數,那麼需要在内函數加形參以及在函數參數調用的時候添加參數資訊
    # 如果寫死一個參數,但是無法确定被裝飾函數的參數數量,這種寫法就不行,會報錯
    # 解決方法:把兩個地方的參數全部換成不定長參數
    def inner(*args, **kwargs):
        # 擷取目前時間
        start_time = datetime.datetime.now()
        func(*args, **kwargs)
        end_time = datetime.datetime.now()
        print(f"函數的執行時間{end_time - start_time}")

    return inner


@timer
def hogwarts(name, age):
    print("霍格沃茲測試學社", name, age)


hogwarts('Tom', 4)


@timer
def hogwarts2(name, age, sex):
    print("霍格沃茲測試學社2", name, age, sex)


hogwarts2('jack', 11, 'man')      

本文來自部落格園,作者:{jiuyou-emperor},轉載請注明原文連結:{https://www.cnblogs.com/jiuyou-emperor/}