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 方法,將列表 元組 字串等變成乙個可迭代的物件,...