網站首頁 編程語言 正文
#最近在網上看代碼時,出現了@???的代碼,看了好久也不知道是什么意思,經過了解原來是裝飾器,我給大家舉個例子講解一下,幫助大家快速理解:
##大家在寫函數的時候,可能會想測試這個函數的運行時間,如果每個函數都加一個類似于:
start=time.time()
函數主體
over=time.time()
Time=over-start
print(Time)
def haha():
start=time.time()
for i in range(1200):
if i%2==0:
print('這是個偶數:',i)
over=time.time()
print("總共花費的時間:",over-start)
haha()
這樣函數的可讀性也不高,如果要測試好幾個函數還會大量浪費時間。
下面引入裝飾器:
1簡單的裝飾器操作:
(先定義一個函數1(里面傳遞一個參數),然后在函數1里面再定義一個函數2負責計算時間,并在時間中間調用定義函數1的參數,然后返回這個函數2):
!!!當我們想調用裝飾器時,只需@函數1的名字,放在想要使用的函數前面即可。
import time
def decorator(fun):
def wrapper():
t1=time.time()
fun()
t2=time.time()
print('總共花費的時間:',t2-t1)
return wrapper
@decorator
def haha():
#start=time.time()
for i in range(1200):
if i%2==0:
print('這是個偶數:',i)
#over=time.time()
#print("總共花費的時間:",over-start)
haha()
2,裝飾器升級版(如果我們想套用的函數中,具有返回對應的值這個功能共時使用):
例如這個函數:
def haha():
a=0
#start=time.time()
for i in range(1200):
if i%2==0:
print('這是個偶數:',i)
a=a+i
return a
#我們如果還用1中的裝飾器就不能返回對應的值,這就需要改動裝飾器:
(在裝飾器中也要把函數中定義參數的返回值給表示出來,并且利用return 給返回值,輸出出來)
import time
def decorator1(fun):
def wrapper2():
t1=time.time()
result=fun()
t2=time.time()
print('總共花費的時間:',t2-t1)
return result
return wrapper2
@decorator1
def haha():
a=0
#start=time.time()
for i in range(1200):
if i%2==0:
print('這是個偶數:',i)
a=a+i
return a
#over=time.time()
#print("總共花費的時間:",over-start)
aaa=haha()
print(aaa)
可能有同學會問,為什么后面要用到aaa=haha(),
這是因為我們要接受返回值result,并將其用print()打印出來。
3,裝飾器的升級升級版(當我們需要使用的函數haha中,不但有返回值,還有傳入的參數時使用。)
(只需要在我們的函數2和調用的函數1中的參數()里面加上關鍵字傳參*args,即可)
import time
def decorator1(fun):
def wrapper2(*args):
t1=time.time()
result=fun(*args)
t2=time.time()
print('總共花費的時間:',t2-t1)
return result
return wrapper2
@decorator1
def haha(key):
a=0
#start=time.time()
for i in range(key):
if i%2==0:
print('這是個偶數:',i)
a=a+i
return a
#over=time.time()
#print("總共花費的時間:",over-start)
aaa=haha(1200)
print(aaa)
可不要忘了,調用函數haha時要傳入參數哦。
原文鏈接:https://blog.csdn.net/Superman980527/article/details/127593379
相關推薦
- 2022-12-11 React中Redux核心原理深入分析_React
- 2022-05-10 原生ajax 在服務器響應前撤銷請求
- 2023-03-20 淺談Redis在秒殺場景的作用_Redis
- 2022-07-13 Android 動態獲取 Resource ID
- 2022-01-12 對比原生Node封裝的Express路由 和 express框架路由
- 2023-11-13 Linux Ubuntu修改用戶名和主機名
- 2022-10-11 Linux中數據傳輸命令scp/rsync
- 2022-05-20 ElasticSearch 7.X系列之:細節問題
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支