老衛帶你學 python裝飾器

2021-10-24 02:26:41 字數 2665 閱讀 1182

python的裝飾器,就是在不修改原有**的基礎上,增加額外的功能

假如我們原有乙個函式,這個函式它的功能是尋找1-n範圍內的偶數

def

func()

:for i in

range

(1000):

if i%2==

0:print

(i)r=func(

)

此時列印如下:

...

988990

992994

996998..

.

那如果我們需要 增加乙個計時功能,計算該函式的運算時間

那我們可以這樣寫:

import time

deffunc()

: start_time=time.time(

)for i in

range

(1000):

if i%2==

0:print

(i) end_time = time.time(

)print

(end_time-start_time)

r=func(

)

對應的輸出為:

...

992994

996998

0.002000570297241211..

.

這樣是可以滿足我們的需求的

可是如果我們有很多的函式,都需要增加乙個計時功能,那我們就需要重寫很多次這樣的**,並且不符合我們設計模式的閉包原則

那這個時候裝飾器的作用就體現出來了

我們可以寫乙個裝飾器,這個裝飾器就是專門用來提供額外的計時功能

def

wfunc

(func)

:def()

: start_time = time.time(

) func(

) end_time = time.time(

)print

(end_time-start_time)

import time

@wfunc

deffunc()

:for i in

range

(1000):

if i%2==

0:print

(i)r=func(

)

對應輸出為:

...

990992

994996

9980.0030012130737304688..

.

滿足需求,並且通過裝飾器,減少了大量的重複**

如果這時候我們原有的函式有返回值,那我們就需要進行以下修改

def

wfunc

(func)

:def()

: start_time = time.time(

) r=func(

) end_time = time.time(

)print

(end_time-start_time)

return r

import time

@wfunc

deffunc()

: count=

0for i in

range

(1000):

if i%2==

0:count+=

1print

(i)return count

r=func(

)print

(r)

輸出如下:

...

996998

0.001998424530029297

500.

..

如果我們 原有函式有引數,那我們需要做以下修改:

def

wfunc

(func)

:def

(*args)

: start_time = time.time(

) r=func(

*args)

end_time = time.time(

)print

(end_time-start_time)

return r

import time

@wfunc

deffunc

(n):

count=

0for i in

range

(n):

if i%2==

0:count+=

1print

(i)return count

r=func(

10000

)print

(r)

輸出如下:

...

9994

9996

9998

0.03300642967224121

5000..

.

老衛帶你學 PYTHON之WITH語句原理

我們看乙個with處理檔案操作的例項 with open etc passwd as f for line in f print line 這段 的作用 開啟乙個檔案,如果一切正常,把檔案物件賦值給f,然後用迭代器遍歷檔案中每一行,當完成時,關閉檔案 而無論在這段 的任何地方,如果發生異常,此時檔案...

老衛帶你學 numpy集合運算

集合運算 2018 11 11 1.np.unique 唯一值 它用幹找出陣列中的唯一值並返回已排序的結果 names np.array bob joe will bob np.unique names array bob will bob joe dtype sorted set names 等價...

老衛帶你學 python迭代器和生成器

實現了迭代器協議的物件,稱為迭代器。2 可迭代物件 遵循了 實現了 迭代器協議的物件。物件內部定義了乙個 iter 方法,以實現迭代器協議 所以 列表 元組 字典 字串等等的都不是可迭代物件,當用for迴圈遍歷的時候,其實for先去執行了l.iter 方法,將列表 元組 字串等變成乙個可迭代的物件,...