5分鐘掌握 Python 中的裝飾器
↑↑↑關(guān)注后"星標(biāo)"簡說Python 人人都可以簡單入門Python、爬蟲、數(shù)據(jù)分析 ?簡說Python推薦? 來源:Python中文社區(qū) 作者:鞏慶奎

import?time?
def?timethis(func):
????def?inner(*args,**kwargs):
????????print('start?timer:')
????????start?=?time.time()
????????result?=?func(*args,**kwargs)?
????????end?=?time.time()
????????print('end?timer:%fs.'%(end?-?start))
????????return?result?
????return?inner
@timethis
def?sleeps(seconds):
????print('??sleeps?begin:')
????time.sleep(seconds)
????print('????sleep?%d?seconds.\n??sleeps?over.'%seconds)
????return?seconds
print(sleeps(3))
start?timer:
??sleeps?begin:
????sleep?3?seconds.
??sleeps?over.
end?timer:3.002512s.
3
一、理解@標(biāo)識符
@timethis
def?sleeps(seconds):
????print('??sleeps?begin:')
????time.sleep(seconds)
????print('????sleep?%d?seconds.\n??sleeps?over.'%seconds)
????return?seconds
def?sleeps(seconds):
????print('??sleeps?begin:')
????time.sleep(seconds)
????print('????sleep?%d?seconds.\n??sleeps?over.'%seconds)
????return?seconds
????
sleeps?=?timethis(sleeps)
二、裝飾器是一個函數(shù)
根據(jù)上文timethis裝飾器的定義,它毫無疑問是一個函數(shù)。名稱是timethis,參數(shù)是func,返回值是inner。 根據(jù) sleeps = timethis(sleeps),可知參數(shù)func是被裝飾的函數(shù)sleeps。根據(jù) return inner,可知返回值inner是嵌套定義在裝飾器中的一個函數(shù)。
三、函數(shù)是一等對象
3.1運行時創(chuàng)建
>>>?def?reverse(word):
...?????return?word[::-1]
...
>>>?reverse
<function?reverse?at?0x027A4C40>
>>>?reverse('hello?world!')
'!dlrow?olleh'
3.2可賦值給變量或數(shù)據(jù)結(jié)構(gòu)
>>>?backward=reverse
>>>?backward('hello?world!')
'!dlrow?olleh'
3.3函數(shù)作為參數(shù)傳遞
cars?=?['Honda','toyota','hyundai','byd','ford','suzuki','peuguot','nissan','citroen','kia','vw','gm','audi','bmw','beniz']
print(sorted(cars,key=reverse))
['Honda',?'kia',?'toyota',?'ford',?'byd',?'hyundai',?'audi',?'suzuki',?'gm',?'nissan',?'citroen',?'peuguot',?'bmw',?'vw',?'beniz']
3.4函數(shù)作為返回值返回
def?cmpLib():
????def?reverse(word):
????????return?word[::-1]
????return?reverse
print(sorted(cars,key=cmpLib())
['Honda',?'kia',?'toyota',?'ford',?'byd',?'hyundai',?'audi',?'suzuki',?'gm',?'nissan',?'citroen',?'peuguot',?'bmw',?'vw',?'beniz']
def inner(*args,**kwargs):的參數(shù)命名形式呢?四、可接受任意數(shù)量參數(shù)的函數(shù)
def inner(*args,**kwargs): 是約定俗成的固定寫法。來看個例子就可以理解這種寫法了。def?star(*args,**kwargs):
????print(args,kwargs)
star(1,2,3)
star(4,5,name='zhang')
star(7,name='lisi',gender='m')
輸出結(jié)果:
(1,?2,?3)?{}
(4,?5)?{'name':?'zhang'}
(7,)?{'name':?'lisi',?'gender':?'m'}
五、增強被裝飾函數(shù)的行為
print('start?timer:')
start?=?time.time()
result?=?func(*args,**kwargs)?
end?=?time.time()
print('end?timer:%fs.'%(end?-?start))
result = func(*args,**kwargs)前后,包裹上相應(yīng)的計時功能。六、變量作用域
b=3
def?func(a):
????print(a)
????print(b)
????b=2
func(2)
讓我們猜猜運行結(jié)果,應(yīng)該是1,3對吧,但執(zhí)行卻提示出錯:
File?"dec.py",?line?47,?in?func
????print(b)
UnboundLocalError:?local?variable?'b'?referenced?before?assignment
七、閉包
八、返回值和返回函數(shù)
第一個返回值,返回的是func的執(zhí)行結(jié)果,它屬于inner函數(shù)的返回值,等效于sleeps函數(shù)的返回值,這是sleep函數(shù)的應(yīng)有之意。保持了原函數(shù)sleeps對外結(jié)構(gòu)的一致性。 第二個返回值是inner函數(shù)本身,也就是第三部分講述的函數(shù)作為返回結(jié)果的用法。依據(jù)slepps=timethi(sleeps)語法,其返回結(jié)果是inner函數(shù),傳遞給sleeps函數(shù),使sleeps函數(shù)實際上等同于inner函數(shù)。所以調(diào)用sleeps(3)相當(dāng)于調(diào)用inner(3)。再加上圍繞他的計時功能,故而無損增加了計時功能。
掃碼回復(fù):2021
獲取最新學(xué)習(xí)資源
長按掃碼關(guān)注,一起學(xué)Python 學(xué)習(xí)更多: 整理了我開始分享學(xué)習(xí)筆記到現(xiàn)在超過250篇優(yōu)質(zhì)文章,涵蓋數(shù)據(jù)分析、爬蟲、機器學(xué)習(xí)等方面,別再說不知道該從哪開始,實戰(zhàn)哪里找了
干貨文章,點個“贊”不過分吧?
評論
圖片
表情
