一个进度条还能玩这么花?

大家好,欢迎来到 Crossin的编程教室 !

如果你写的代码里有一些很耗时的操作,你会怎么处理?

比如像这样一个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完成!')

26eb0c40702df63f71bb22bd651bb7ce.png

钻石选手甚至给你手搓一个进度条出来

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完成!')

babacb94294d627051144ee4c8dc0478.png

但真正的王者……则会直接用现成的库

fce3c32754365f8afb9a842f5b722303.gif

progress

progress就是一个简单的第三方进度条模块。你只需要在代码中创建一个Bar对象,设定好长度,并在循环中更新它,就可以轻松得到一个进度条。

from progress.bar import Bar
X = 10000
with Bar('进度', max=X) as bar:
    for i in range(X):
        for j in range(X):
            k = j * i
        bar.next()
print('\n完成!')

b7c011d8d07b0ba953d131cc53288248.png

progress模块提供了多种进度条样式供你选择。

7574080abcdc427f27908f93f0720746.jpeg

同时你也可以通过参数修改进度条的填充字符和描述文本。

2b904ecf0cc45064ee062eca303d7d69.png

tqdm

更加为人所熟知的进度条模块是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('完成!')

3b80915b197232db33f3a3a3c4d41141.png

tqdm没搞太多花哨的样式,但对各种开发环境的支持很好,比如改成 tqdm.rich,就可以在控制台下得到一个彩色的进度条

88e443d29c7f070dec7cb6127e4d712c.png

改成 tqdm.notebook,可以优化在 jupyter notebook 中的显示

311b1c742883bf6a9773ea067c4d76ef.png

加上tk,则是一个基于tkinter的进度条弹窗

66797c239b9a2dff02e19512442398ee.jpeg

那有人要说了,“我想要的进度条不一定都是用在循环代码上呀”。那也简单,直接定义一个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

如果你觉得这个进度条不够彰显你代码的独特气质,那么还可以看看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('完成!')

但它的动态效果一定会让你惊艳!

95b530be9d72e2b52474d9e39bd5259b.gif

好了,以上就是Python中几种常见的进度条写法,你喜欢哪一种呢?

作者:Crossin的编程教室


Crossin的新书《码上行动:用ChatGPT学会Python编程》已经上市了。本书以ChatGPT为辅助,系统全面地讲解了如何掌握Python编程,适合Python零基础入门的读者学习。

‍【点此查看详细介绍】

购买后可加入读者交流群,Crossin为你开启陪读模式,解答你在阅读本书时的一切疑问。


添加微信 crossin123 ,加入编程教室共同学习~

51efe35441112c8325a2675602bd1bff.jpeg

感谢转发点赞的各位~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Crossin的编程教室

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值