如果你写的代码里有一些很耗时的操作,你会怎么处理?
比如像这样一个 1 万乘 1 万的两层循环:
X = 10000
for i in range(X):
for j in range(X):
k = j * i
print('\n完成!')
如果就这么直接运行,那么很可能让你陷入未知的等待。你不知道程序执行到哪儿了,还要执行多久,以及是不是还在正常运行……
这时候:
白银选手知道在循环里加上 print,但直接输出会让你的控制台瞬间爆炸。
X = 10000
for i in range(X):
for j in range(X):
k = j * i
print(i)
print('\n完成!')
黄金选手会用 '\r' 字符让输出保持在同一行。
X = 10000
for i in range(X):
for j in range(X):
k = j * i
print(f'{i+1} / {X}', end='\r')
print('\n完成!')
钻石选手甚至给你手搓一个进度条出来。
X = 10000
for i in range(X):
for j in range(X):
k = j * i
print('进度',
f'|{"█"*((i+1)*50//X):50}|',
f'{(i+1)*100//X}%',
end='\r')
print('\n完成!')
但真正的王者……则会直接用现成的库。
progress 模块提供了多种进度条样式供你选择。
同时你也可以通过参数修改进度条的填充字符和描述文本。
更加为人所熟知的进度条模块是 tqdm(天桥大妈?)。这个词据说是阿拉伯语“进度”的意思,也是西班牙语“我好爱你”的缩写(作者挺浪漫啊)。
tqdm 的使用更简单,只要给循环的迭代对象加上tqdm就行了。
或者直接用模块中的 trange 替代原本的 range 方法。都不用你在循环中增加代码。
from tqdm import tqdm, trange
X = 10000
for i in tqdm(range(X)):
# for i in trange(X):
for j in range(X):
k = j * i
print('完成!')
tqdm 没搞太多花哨的样式,但对各种开发环境的支持很好,比如改成 tqdm.rich,就可以在控制台下得到一个彩色的进度条。
改成 tqdm.notebook,可以优化在 jupyter notebook 中的显示。
加上 tk,则是一个基于 tkinter 的进度条弹窗。
那有人要说了,“我想要的进度条不一定都是用在循环代码上呀”。那也简单,直接定义一个 tqdm 对象,然后在代码中手动更新进度。
from tqdm import tqdm
from time import sleep
bar = tqdm(total=100)
bar.set_description('采集数据')
sleep(0.5)
bar.update(10)
bar.set_description('分析数据')
sleep(0.5)
bar.update(89)
bar.set_description('展示数据')
sleep(5)
bar.update(1)
bar.close()
print('完成!')
你现在知道,为什么很多软件都会卡在 99% 的地方了吧?
如果你觉得这个进度条不够彰显你代码的独特气质,那么还可以看看 Alive Progress 这个模块。
它的写法和前面的 progress 很像,看上去平平无奇:
from alive_progress import alive_bar
X = 10000
with alive_bar(X) as bar:
for i in range(X):
for j in range(X):
k = j * i
bar()
print('完成!')
但它的动态效果一定会让你惊艳!
好了,以上就是 Python 中几种常见的进度条写法,你喜欢哪一种呢?
·················END·················