MyBatis - PageHelper 分頁
阿新 • • 發佈:2022-03-05
閉包函式
1.特徵
閉:定義在函式的內部的函式
包:內部函式使用了外層函式數名空間中的名字
def outer():
x = 99
def inner():
print('from outer>>>inner',x)
return inner
x = 66
res =outer()
res()
閉包函式實際應用
# 閉包函式是給函式體傳參的另外一種方式 1.形參 def index(username): print(username) # 函式體程式碼需要什麼就可以在形參中寫什麼 index('jason') 2.閉包 def outer(username): username = 'jason' def index(): print(username) return index res = outer('kevin') # 形參username與值kevin臨時繫結 >>>:outer區域性名稱空間中 res() res1 = outer('jason') # 形參username與值kevin臨時繫結 >>>:outer區域性名稱空間中 res1()
裝飾器簡介
""" 裝飾器並不是一個新的知識點 而是由前兩天所有集合產物 名稱空間 函式名 閉包函式 """ 裝飾器的本質 在不改變被裝飾物件原有的'呼叫方式'和'內部程式碼' 的情況下給被裝飾物件新增新的功能 裝飾器的原則 對擴充套件開放 對修改封閉 import time print(time.time()) # 1970年1月1日0:00開始到現在的秒數 time.sleep(3) # 讓程式原地等待三秒 print('hello world') import time def index(): time.sleep(3) print('from index') '''給index函式增加了一個統計執行時間的功能''' start_time = time.time() # 函式執行之前獲取一個時間戳 index() end_time = time.time() # 函式執行之後獲取一個時間戳 print(end_time - start_time) # 兩個時間戳的差值就是函式的執行時間 ''' 1.思考:如果在很多地方都需要呼叫index 如何統計index執行時間 在很多地方都需要執行統計index函式執行時間的程式碼 在不同的地方需要執行相同的程式碼 >>>: 函式 直接通過傳參的方式 缺陷1: 程式碼寫死了 無法統計其他函式的執行時間 能否解決? 可以! 將函式名通過形參的形式傳入 缺陷2: 封裝成函式之後 呼叫方式改變了 不符合裝飾器原則 能否解決? 不可以 ''' # def get_time(func): # start_time = time.time() # 函式執行之前獲取一個時間戳 # func() # end_time = time.time() # 函式執行之後獲取一個時間戳 # print(end_time - start_time) # 兩個時間戳的差值就是函式的執行時間 # def home(): # time.sleep(3) # print('from home') # get_time(index) # get_time(home) import time def index(): time.sleep(1) print('from index') def home(): time.sleep(3) print('from home') print(home) def outer(func): # 真正的index被outer區域性名稱空間儲存了 def get_time(): start_time = time.time() # 函式執行之前獲取一個時間戳 func() # 呼叫了真正的index函式 end_time = time.time() # 函式執行之後獲取一個時間戳 print(end_time - start_time) # 兩個時間戳的差值就是函式的執行時間 return get_time home = outer(home) # 狸貓換太子
進階版本裝飾器
def outer(func_name):
def get_time(*args, **kwargs):
start_time = time.time()
func_name(*args, **kwargs)
end_time = time.time()
print(end_time - start_time)
return get_time
完整版本裝飾器
# 解決的是返回值問題 def outer(func_name): def get_time(*args, **kwargs): start_time = time.time() res = func_name(*args, **kwargs) # 執行真正的index函式 end_time = time.time() print(end_time - start_time) # return '不要急躁' # 如何在此處返回真正index函式的返回值 return res return get_time
裝飾器模板
''''編寫裝飾器其實有一套固定的程式碼 不需要做任何理解'''
def outer(func_name): # func_name用於接收被裝飾的物件(函式)
def inner(*args, **kwargs):
print('執行被裝飾函式之前 可以做的額外操作')
res = func_name(*args, **kwargs) # 執行真正的被裝飾函式
print('執行被裝飾函式之後 可以做的額外操作')
return res # 返回真正函式的返回值
return inner
裝飾器語法糖
def outer(func_name):
def inner(*args, **kwargs):
print('執行函式之前的操作')
res = func_name(*args, **kwargs)
# 額外操作
return res
return inner
@outer # 等價於 index = outer(index)
def index(*args, **kwargs):
print('from index')
# index = outer(index) # 總感覺這一行程式碼有點low!!!
@outer # 等價於 home = outer(home)
def home(*args,**kwargs):
print('from home')
print(index)
print(home)
"""
語法糖內部原理
1.使用的時候最好緊跟在被裝飾物件的上方
2.語法糖會自動將下面緊挨著的函式名傳給@後面的函式呼叫
ps:針對之前的週末大作業 只需要單獨寫一個裝飾器 之後使用語法糖裝飾即可
"""