閉包函數
- 閉包的內部函數中,對外部作用域的變量進行引用
- 閉包無法修改外部函數的局部變量
- 閉包可以保存當前的運行環境
# 普通方法實現
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