一日一技:命令行进度条是什么原理?
2023-03-15 22:03:28 时间
摄影:产品经理
这个饭吃起来有点油
今年4月份,我写了一篇文章:字符串离奇消失之谜,有同学在评论里面问我:
有什么用?我们今天就来看看,如何使用
来实现一个简易的命令行进度条。运行效果如下面这个动图所示:
这个SimpleProcessBar
是怎么实现的呢?其实它的代码非常简单:
import time
class SimpleProcessBar:
def __init__(self, total, finished='■', unfinished='□'):
self.total = total
self.finished = 0
self.unfinished_char = unfinished
self.finished_char = finished
self.bar = [self.unfinished_char] * 100
def incr(self, value=1):
self.finished += value
if self.finished > 100:
self.finished = 100
bar = self.generate_bar()
print(bar, end='
')
def generate_bar(self):
finished = int(self.finished / self.total * 100)
self.bar[:finished] = self.finished_char * finished
return ''.join(self.bar) + f' {finished} %'
x = SimpleProcessBar(30)
for i in range(30):
x.incr()
time.sleep(1)
真正的核心代码就只有一行:print(bar, end='
')
。其它代码都是辅助这一行的。我们试一试直接手动执行一下:
import time
print("□" * 10, end='
')
time.sleep(1)
print(f'{"■" * 3}{"□" * 7}', end='
')
time.sleep(1)
print(f'{"■" * 6}{"□" * 4}', end='
')
time.sleep(1)
print(f'{"■" * 9}{"□" * 1}', end='
')
time.sleep(1)
print("■" * 10, end='
')
运行效果如下所示:
因此,假设我们要画100个方块,那么,根据不同的进度,计算黑色实心方块的数量和白色空心方块的数量,然后把进度条的长字符串拼接起来,就可以打印了。
在默认情况下。print()
函数会默认给每个字符串末尾增加一个
换行符,所以我们每次使用print()
都会自动换行,如下图所示:
这个末尾添加的字符,是通过end
参数传入的。我们试一试更换成其它符号:
而根据本文开始引用的这篇文章的解释,
会让输出光标回到行首,所以又会重新打印进度条,于是就形成了进度条更新的效果。
END
一二线大厂在职员工
十多年码龄的编程老鸟
国内外高校在读学生
中小学刚刚入门的新人
相关文章
- 金融服务领域的大数据:即时分析
- 影响大数据、机器学习和人工智能未来发展的8个因素
- 从0开始构建一个属于你自己的PHP框架
- 如何将Hadoop集成到工作流程中?这6个优秀实践必看
- SEO公司使用大数据优化其模型的5种方法
- 关于Web Workers你需要了解的七件事
- 深入理解HTTPS原理、过程与实践
- 增强分析:数据和分析的未来
- PHP协程实现过程详解
- AI专家:大数据知识图谱——实战经验总结
- 关于PHP的错误机制总结
- 利用数据分析量化协同过滤算法的两大常见难题
- 怎么做大数据工作流调度系统?大厂架构师一语点破!
- 2019大数据处理必备的十大工具,从Linux到架构师必修
- OpenCV中的KMeans算法介绍与应用
- 教大家如果搭建一套phpstorm+wamp+xdebug调试PHP的环境
- CentOS下三种PHP拓展安装方法
- Go语言HTTP Server源码分析
- Go语言HTTP Server源码分析
- 2017年4月编程语言排行榜:Hack首次进入前五十