一、函數引用
- 函數可以被引用
- 函數可以被指派給一個變量
def hogwarts():
print("hogwarts")
# hogwarts() # 函數調用
print(hogwarts)
print('----------------')
harry = hogwarts # 把函數對象指派給一個變量
print(harry)
print('----------------')
harry() # 引用函數
二、閉包函數
- 閉包的内部函數中,對外部作用域的變量進行引用
- 閉包無法修改外部函數的局部變量
- 閉包可以儲存目前的運作環境
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)
# 使用裝飾器的代碼
# 第一步,定義兩個函數,一個内函數,一個外函數
# 第五步,在裝飾器執行過程中,會自動傳入一個參數,參數就是被裝飾函數的函數對象
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/}