Python閉包函數和計時器

閉包函數

  • 閉包的內部函數中,對外部作用域的變量進行引用
  • 閉包無法修改外部函數的局部變量
  • 閉包可以保存當前的運行環境
# 普通方法實現
def output_student(name, gender, grade=1):
    print(F"新學期開學啦,學生{name}是{gender},他是{grade}年級學生")


output_student('李白', '男生')
output_student('趙雲', '男生')
output_student('孫尚香', '女生')
# 閉包函數
def student_grade(grade):
    def output_student(name, gender):
        print(F"新學期開學啦,學生{name}是{gender},他是{grade}年級學生")
    return output_student


student_info = student_grade(3)
student_info('李白', '男生')
student_info('趙雲', '男生')
student_info('孫尚香', '女生')

需求:在函數調用的時候打印函數開始和函數結束

def aaa():
    print('good good study, happy happy everyday')


def bbb():
    print('everything is ok')


# 把中間的執行函數使用參數替代
def function_tips(func):
    print("函數開始執行")
    # 不寫死函數,使用外部調用的方式
    func()
    print("函數結束執行")


# 傳入一個函數對象
function_tips(bbb)

代碼運行步驟:

func參數等於上方的bbb函數,下方調用func就等於調用bbb函數,然後把bbb的內容帶入func

最後執行代碼實現

使用裝飾器實現

# 使用裝飾器實現
# 閉包定義,1、定義兩個函數,一個內函數,一個外函數,timer是外函數
# 5、在裝飾器執行的過程中傳入一個參數,這個參數就是被裝飾函數的對象
def timer(func):
    # inner作用:執行裝飾器的邏輯;inner是內函數
    def inner():
        # 2、在內函數裏面添加裝飾器的邏輯
        print("代碼開始運行")
        func()  # 6、添加被裝飾函數的執行步驟
        print("代碼結束運行")
    # 3、把內函數返回出去,之後可以被調用
    return inner


# 4、裝飾器的使用:@+裝飾器名稱
@timer
def aaa():
    print('ccccc')


aaa()

---------->
代碼開始運行
ccccc
代碼結束運行

裝飾器的練習

題目:實現一個計時器的裝飾器,計算函數的執行時間

import datetime


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 calc():
    print("aaaaaaa")


calc()

------------------------------->
aaaaaaa
函數執行時間0:00:00

被裝飾函數存在參數怎麼解決

# 裝飾器的練習
# 題目:實現一個計時器的裝飾器,計算函數的執行時間
import datetime


def timer(func):
    """
    1、如果裝飾器內有參數,需要寫在內置函數內,在調用的時候也要帶上
    2、如果寫死一個參數,但無法確定被裝飾器的參數數量,這種寫法會報錯
    3、解決方法:把兩個地方的參數全部換成不定長參數*args, **kwargs
    :param func:
    :return:
    """
    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 calc(name, age, gender):
    print("aaaaaaa")
    print(name)
    print(age)
    print(gender)


calc('lili', 3, "女")

-------------------------------->
aaaaaaa
lili
3
女
函數執行時間0:00:00
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章