開始前的閒談:
最近python越發火熱,不管是炒作還是真火,相信每個火爆的事物,背後總有乙個不可替代的原因。總的來看,python之所以火是因為其語法簡單,靈活,非常適合初學者,讓「從入門到放棄」的時間有所拉長。有人說python並不能讓你獨當一面,或者說只掌握python不能成為乙個「能走得更遠」的程式設計師。我認為與其擔心、觀望、往復糾結,不如踏踏實實先掌握它。老實想想,自己真的「掌握了python嗎?」,我相信真正掌握後,對於繼續學習和使用其它語言也是不無幫助的。
言歸正傳:先來看乙個例子,判斷乙個數字是否能被3整除:
def
is_div_three
(num)
:return num %3==
0print
(is_div_three(6)
)
執行結果顯然是true
接下來,例如我們需要列印1-10000裡能被3整除的數,很簡單:
def
nums_is_div_tree()
:for i in
range(1
,10000):
if is_div_three(i)
:print
(i)nums_is_div_tree(
)
輸出結果是一連串能被3整除的數字。試想我們又有乙個需求,想知道這個程式執行的效率,即求執行時間,顯然我們可以把上面的函式進行改造:
import time #引入time模組
deftime_is_div_tree()
: t1 = time.time(
)#在執行迴圈前先記錄系統時間
for i in
range(1
,10000):
if is_div_three(i)
:print
(i) t2 = time.time(
)#在執行迴圈後再次記錄時間
return t2-t1 #兩個時間相減獲得執行時間
t = time_is_div_tree(
)print
(t)
def
print_time
(func)
:#裝飾器本身是乙個函式,引數func是需要執行的函式
def():
t1 = time.time(
) func(
) t2 = time.time(
)print
('running time: {} s'
.format
(t2-t1)
)
然後,在上面的nums_is_div_tree()函式上加一行:@print_time:
@print_time
defnums_is_div_tree()
:for i in
range(1
,10000):
if is_div_three(i)
:print
(i)nums_is_div_tree(
)
@print_time
defnums_is_div_tree
(maxnum)
:#使用傳入maxnum
for i in
range(1
, maxnum)
:if is_div_three(i)
:print
(i)nums_is_div_tree(
10000
)
def
print_time
(func)
:#裝飾器本身是乙個函式,引數func是需要執行的函式
def(arg)
: t1 = time.time(
) func(arg)
#將arg傳入需要執行的函式
t2 = time.time(
)print
('running time: {} s'
.format
(t2-t1)
)
執行一切正常~
又有人提出需求,如果裝飾器本身也帶有引數呢?比如,求執行時間時,我們需要列印出一段文字:「裝飾器print_time正在執行中」
我們再去修改裝飾器:
def
print_time
(text)
:#這裡傳入引數
defdecorator
(func)
:#巢狀decorator函式來接收需要執行的函式func
def(arg)
: t1 = time.time(
) func(arg)
#將arg傳入需要執行的函式
t2 = time.time(
)print
(text)
print
('running time: {} s'
.format
(t2-t1)
) return decorator
繼續執行:
@print_time(
'裝飾器print_time正在執行中'
)#傳入我們需要列印的內容
defnums_is_div_tree
(maxnum)
:for i in
range(1
, maxnum)
:if is_div_three(i)
:print
(i)nums_is_div_tree(
10000
)
執行結果,拿到了我們想要的結果:
至此,python裝飾器討論結束,有沒有感覺豁然開朗呢。
python裝飾器介紹 Python之裝飾器簡介
python函式式程式設計之裝飾器 1.開放封閉原則 簡單來說,就是對擴充套件開放,對修改封閉。在物件導向的程式設計方式中,經常會定義各種函式。乙個函式的使用分為定義階段和使用階段,乙個函式定義完成以後,可能會在很多位置被呼叫。這意味著如果函式的定義階段 被修改,受到影響的地方就會有很多,此時很容易...
python 找到裝飾器 Python之裝飾器
裝飾器本質上就是乙個python函式,他可以讓其他函式在不需要做任何 變動的前提下,增加額外的功能,裝飾器的返回值也是乙個函式物件。裝飾器的作用 在不改變原函式及原函式的執行的情況下,為原函式增加一些額外的功能,比如列印日誌 執行時間,登入認證等等。乙個簡單的裝飾器 import time def ...
Python之裝飾器
裝飾器就是乙個以函式作為引數並返回乙個替換函式的可執行函式 即裝飾器是乙個函式,其引數為函式,返回值也為函式 可理解為對函式的功能進行拓展,所以叫裝飾 outer為裝飾器,效果為給被裝飾函式返回值結果加負號 defouter fun definner x return fun x return in...