python 學習筆記 day11 裝飾器

2022-02-06 23:16:58 字數 2037 閱讀 1191

現在有乙個需求,我們想計算一段程式執行的時間,可以採用time模組的time函式:

def

func():

print("

哈哈哈哈")

func()

我們可以這樣做:

import

time

deffunc():

start=time.time() #

函式體內**執行開始的時間

time.sleep(0.02) #

因為這個程式太簡單,執行時間太快0.0

print("

哈哈哈哈")

但是我們可以發現,我們原來的func()函式就夾雜了time函式這些亂七八糟的東西,我們現在想讓func()函式的**獨立,應該怎麼做:

import

time

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()函式**獨立,又不讓之前用我**的人修改呢:

import

time

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 有乙個引...