教你搞一个比较简单的计时和进度条装饰器
- 什么是装饰器
- 为啥要用装饰器呢?
- 上代码!
- 如何使用装饰器
- 效果
什么是装饰器
装饰器的英文是:Decorator。装修的英文是:Decoration。顾名思义就是我们要用装饰器在函数func()上搞点儿事儿,哈哈哈。这个就是一个套你的函数func()并且实现一些功能的函数。譬如我们今天要分享的计时器或进度条。
为啥要用装饰器呢?
为了美化代码,和避免没必要的反复书写。每次我们有个for loop都要搞一遍tqdm么?每次我们想来测试一个函数func()的运行时间是多久,都要来一遍 time_start - time_end么?很显然,有了装饰器这玩意儿,会省去我们很多的麻烦。
上代码!
import time
from tqdm import tqdm
from functools imoprt wraps
from datetime import datetime as dt
def timer_pbar(func):
@wraps(func)
def wrapper(*args, **kwargs):
print(f"{dt.now().strftime('%H:%M:%S')}") # 显示当前时间
start = time.time() # 开始计时
with tqdm(
total=20, # 我是假设了20秒
bar_format='{l_bar}{bar:10}{r_bar}{bar:-10b}',
desc=f"Processing {func.__name__!r}",
position=0,
colour='#32CD32', # limegreen HEX code
) as pbar:
for i in range(20):
time.sleep(1)
pbar.update(1) # 每过一秒我加一块进度条
result = func(*args, **kwargs)
end = time.time() # 结束计时
print(f"运行时间{func.__name__!r}: {end - start:.3f}秒") # 返回运行消耗的时间
return result
return wrapper
这样我们的代码就编译完成了,那我们如何使用呢?其实很简单,就在你的函数前面加一行@装饰器就行了。
如何使用装饰器
ml是我自己的写的一个python脚本,里面有很多7788的东西和功能,其中就有这个装饰器。我可以直接导入就可以调用了。或者你也可以把装饰器写在任何你的py或者ipynb文件的头部,这样也可以直接调用使用。我是建议大家创建一个自己的库,这样使用起来也方便,能够提高效率。感兴趣的朋友可以阅读我这片关于自己设计一个库的Blog。
效果
看起来还是挺靠谱的哈?欢迎大家常来看我的Blog!有什么需求和疑问请留言联系我!