現在有乙個需求,我們想計算一段程式執行的時間,可以採用time模組的time函式:
def我們可以這樣做:func():
print("
哈哈哈哈")
func()
importtime
deffunc():
start=time.time() #
函式體內**執行開始的時間
time.sleep(0.02) #
因為這個程式太簡單,執行時間太快0.0
print("
哈哈哈哈")
但是我們可以發現,我們原來的func()函式就夾雜了time函式這些亂七八糟的東西,我們現在想讓func()函式的**獨立,應該怎麼做:
importtime
deffunc():
print("
哈哈哈"
)def
timer(f):
start=time.time()
time.sleep(0.02)
f()
#執行上面定義的func()函式
end=time.time()
print(end-start)
timer(func)
#這樣我們只需要呼叫timer()函式,裡面傳乙個引數(要執行的函式名)即可計算該函式的執行時間
但是我們發現,func()函式的**是獨立了,但是如果我們想計算乙個函式func()的執行時間(比如上面第一種方法是直接呼叫func() 但是func()**不獨立),呼叫的不是func()而是timer(func),裡面的引數是要計算執行時間的函式名;
這樣就有乙個問題,比如我這個函式原來是給很多人用,現在我改了為了讓func()**獨立,可是在計算func()函式的執行時間時得改成呼叫timer() ,很麻煩的;
所以我們可不可以既保證func()函式**獨立,又不讓之前用我**的人修改呢:
importtime
deffunc():
print("
哈哈哈哈哈")
deftimer(f):
def inner(): #
使用了閉包
start=time.time()
time.sleep(0.02)
f()end=time.time()
print(end-start)
return
inner
func=timer(func)
func()
#這樣使用者還是呼叫func()就可以計算func()函式的執行時間
說一下上面使用閉包這段**的流程:
不想修改原來函式的功能(func()函式),但是又想給原來的函式增加功能(比如計算func()函式的執行時間)
這裡的timer(f)函式就是裝飾器函式,裡面的引數f其實就是乙個函式名 而函式 f() 就是被裝飾的函式;
封閉:對修改是封閉的;
開放:對擴充套件是開放的;
其實一些軟體版本的更新2.0,3.0等其實就是功能的擴充套件,對原來的一些函式的功能是不改動的;
裝飾器就完美地體現了開放封閉原則,不改變原來的函式功能,在其基礎上進行功能的擴充套件;
機器學習學習筆記 day11
周志華 機器學習 學習筆記 最近開始學習機器學習,參考書籍西瓜書,做點筆記。第十一章 特徵選擇與稀疏學習 11.1 子集搜尋與評價 無關特徵 與訓練任務無關的特徵 冗餘特徵 包含的資訊能從其他特徵中推演出來 子集搜尋 前向 後向 雙向 子集評價 計算子集增益 資訊增益越大意味著特徵自己包含的有助於分...
Python廖雪峰教程學習筆記 Day11
養成乙個好的習慣只需要堅持21天,day11 這兩天主要學習一下物件導向的高階程式設計。使用 slots 由之前學習類的定義和例項的建立,我們可以給例項繫結不同的屬性,例如 class student object pass s student s.name tom 動態給例項繫結乙個屬性 prin...
Python全棧學習筆記day 11 裝飾器
原則 開放封閉原則 開放 對擴充套件是開放的 封閉 對修改是封閉的 裝飾器的作用 在不改變原函式的呼叫方式的情況下,在函式的前後新增功能 裝飾器的本質 閉包函式 裝飾器的作用 不想修改函式的呼叫方式 但是還想在原來的函式前後新增功能 裝飾器形成的過程 1 最簡單的裝飾器 2 有返回值的 3 有乙個引...