日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
@wraps修飾器:讓你的Python代碼更加簡(jiǎn)短可愛|從簡(jiǎn)單實(shí)例來認(rèn)識(shí)它

我們?cè)谏弦黄恼?Python實(shí)例來認(rèn)識(shí)并發(fā)與并行)中用到了 @timer ,在函數(shù)定義時(shí),加上一個(gè)小小的 @timer ,這樣,函數(shù)執(zhí)行結(jié)束后,就會(huì)自動(dòng)在控制臺(tái)匯報(bào)自己運(yùn)行的時(shí)間。

成都創(chuàng)新互聯(lián)公司長(zhǎng)期為近1000家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為寧縣企業(yè)提供專業(yè)的成都網(wǎng)站制作、成都網(wǎng)站建設(shè)、外貿(mào)營(yíng)銷網(wǎng)站建設(shè)寧縣網(wǎng)站改版等技術(shù)服務(wù)。擁有十年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。

比如下面這樣:

 
 
 
  1. @timer
  2. def piper():
  3.     for i in range(10000):
  4.         i = i * i ** 10
  5. piper()
  6. 輸出:
  7. timer: using 0.00600 s

實(shí)際上,這個(gè)計(jì)時(shí)器邏輯 @timer 是我們自己用 Python 中的修飾器特性[1]來實(shí)現(xiàn)的。

拆解邏輯

其實(shí)我們不用修飾器,自己也能實(shí)現(xiàn)計(jì)時(shí)的邏輯。

 
 
 
  1. def piper():
  2.     for i in range(10000):
  3.         i = i * i ** 10
  4. t = time.time()  # 記錄函數(shù)開始時(shí)時(shí)間
  5. piper()
  6. print(f"timer: using {time.time() - t :.5f} s")  # 獲取函數(shù)運(yùn)行時(shí)間并打印

注意到我們執(zhí)行函數(shù)時(shí),在其上下都包裹上了邏輯。如果我們希望函數(shù)自帶計(jì)時(shí)邏輯,那么為了包住原函數(shù),只能去新定義一個(gè)函數(shù)。

 
 
 
  1. def time_wrapper(func):
  2.     # func 是一個(gè)函數(shù)
  3.     t = time.time()
  4.     func()
  5.     print(f"timer: using {time.time() - t :.5f} s")
  6. time_wrapper(piper)
  7. 輸出:
  8. timer: using 0.00600 s

我們想測(cè)試某一個(gè)函數(shù)運(yùn)行時(shí)間時(shí),將函數(shù)名輸入到 time_wrapper 里面就好。

更優(yōu)雅的改進(jìn)

上述代碼顯然有缺點(diǎn):

  • 我們?cè)诰幊虝r(shí),心智負(fù)擔(dān)增大了;此外,代碼更冗長(zhǎng)了
  • 如果我們只是希望函數(shù)新增一個(gè)功能,顯然用 time_wrapper 是不行的,因?yàn)槠洳]有改變 piper 本身

于是我們請(qǐng)出今天的主角 修飾器@wraps[2] 。

還用我們的 timer 舉例子,我們讓所有在 @timer 下的函數(shù),都經(jīng)過如下處理:

 
 
 
  1. def timer(func):
  2.     @wraps(func)
  3.     def inner_func():
  4.         t = time.time()
  5.         rts = func()
  6.         print(f"timer: using {time.time() - t :.5f} s")
  7.         return rts
  8.     return inner_func

以 piper 為例,我們經(jīng)歷了如下變化。

 
 
 
  1. @timer
  2. def 原始piper():
  3.     for i in range(10000):
  4.         i = i * i ** 10

實(shí)際上,當(dāng)你再調(diào)用 piper 時(shí),你的 piper 內(nèi)部邏輯早已變?yōu)椋?/p>

 
 
 
  1. def 當(dāng)前piper():
  2.     t = time.time()
  3.     rts = 原始piper()
  4.     print(f"timer: using {time.time() - t :.5f} s")
  5.     return rts

總結(jié)

本文簡(jiǎn)單與讀者朋友們「科普」一下修飾器,注意到我們這里實(shí)際上僅僅修飾了無參數(shù)的函數(shù)。其實(shí),修飾器還有許多更加優(yōu)雅用途,比如傳入?yún)?shù) *args, **kwargs ,修飾類 __call__ 等用法。期待以后我遇到好的應(yīng)用場(chǎng)景,將經(jīng)驗(yàn)分享給朋友們。


網(wǎng)站題目:@wraps修飾器:讓你的Python代碼更加簡(jiǎn)短可愛|從簡(jiǎn)單實(shí)例來認(rèn)識(shí)它
分享路徑:http://m.5511xx.com/article/cdsiigj.html