一日一技:命令行进度条是什么原理?

简介: 一日一技:命令行进度条是什么原理?

今年4月份,我写了一篇文章:字符串离奇消失之谜,有同学在评论里面问我:


4.png


\r有什么用?我们今天就来看看,如何使用\r来实现一个简易的命令行进度条。运行效果如下面这个动图所示:


5.gif


这个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='\r')
    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='\r')。其它代码都是辅助这一行的。我们试一试直接手动执行一下:


import time
print("□" * 10, end='\r')
time.sleep(1)
print(f'{"■" * 3}{"□" * 7}', end='\r')
time.sleep(1)
print(f'{"■" * 6}{"□" * 4}', end='\r')
time.sleep(1)
print(f'{"■" * 9}{"□" * 1}', end='\r')
time.sleep(1)
print("■" * 10, end='\r')


运行效果如下所示:


6.gif


因此,假设我们要画100个方块,那么,根据不同的进度,计算黑色实心方块的数量和白色空心方块的数量,然后把进度条的长字符串拼接起来,就可以打印了。


在默认情况下。print()函数会默认给每个字符串末尾增加一个\n换行符,所以我们每次使用print()都会自动换行,如下图所示:


7.png


这个末尾添加的字符,是通过end参数传入的。我们试一试更换成其它符号:


8.png


而根据本文开始引用的这篇文章的解释,\r会让输出光标回到行首,所以又会重新打印进度条,于是就形成了进度条更新的效果。


请关注微信公众号【未闻Code】获取更多精彩文章。


目录
相关文章
|
计算机视觉 Python
图像增强、锐化,利用 Python-OpenCV 来实现 4 种方法!
图像增强目的使得模糊图片变得更加清晰、图片模糊的原因是因为像素灰度差值变化不大,图片各区域产生视觉效果似乎都是一样的, 没有较为突出的地方,看起来不清晰的感觉 解决这个问题的最直接简单办法,放大像素灰度值差值、使图像中的细节更加清晰。
图像增强、锐化,利用 Python-OpenCV 来实现 4 种方法!
|
11月前
|
Java 关系型数据库 MySQL
如何使用 maven 创建一个 Spring Boot项目
Maven 是一个强大的项目管理工具,通过配置 `pom.xml` 文件自动获取所需的 jar 包,提高开发效率。其核心功能包括项目构建和依赖管理。项目构建支持编译、测试、打包和发布等流程,而依赖管理则通过中央仓库、本地仓库和私有服务器获取和管理项目依赖。示例中展示了如何创建第一个 SpringBoot 项目并实现简单接口。
298 1
如何使用 maven 创建一个 Spring Boot项目
|
10月前
|
存储 分布式计算 Hadoop
【赵渝强老师】HDFS数据上传和下载的过程
本文介绍了Hadoop的HDFS中客户端如何通过NameNode上传和下载数据。上传时,数据按块保存至DataNode并实现冗余;下载时,客户端从DataNode获取数据块。文中配有详细流程图及B站视频讲解。
260 3
|
机器学习/深度学习 数据采集 算法
Python实现ISSA融合反向学习与Levy飞行策略的改进麻雀优化算法优化支持向量机回归模型(SVR算法)项目实战
Python实现ISSA融合反向学习与Levy飞行策略的改进麻雀优化算法优化支持向量机回归模型(SVR算法)项目实战
|
开发框架 Java API
使用Spring Boot构建RESTful API的最佳实践
使用Spring Boot构建RESTful API的最佳实践
|
监控 安全 Linux
Linux C++ 环境下的FTP远程升级实现及异常处理策略
Linux C++ 环境下的FTP远程升级实现及异常处理策略
381 0
|
IDE C# 开发工具
VS2019版本下载详细介绍~
VS2019版本下载详细介绍~
1512 0
|
存储 网络安全
tortoiseGit fatal: Could not read from remote repository.
git.exe pull --progress -v --no-rebase "origin" fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists. 无法从存储库中读取,可能是因为权限问题。 由于tortoisegit使用的是putty的.ppk格式的密钥,而gitlab必须使用rsa密钥,因此使用其自带的工具,在开始菜单里找到tortoisegit,选择他的puttygen工具来生成密钥 —
1240 0
tortoiseGit fatal: Could not read from remote repository.
|
前端开发 JavaScript API
前端封装库/工具库的动画之Anime.js
随着互联网时代的到来,Web应用程序中的动画效果变得越来越重要。为了更好地实现这项任务,前端封装库/工具库的出现成为一个非常好的解决方案。其中一款备受关注的动画库是Anime.js。
429 1
|
运维 监控 Cloud Native
干货|后互联网时代,运维工程师的必备性能优化指北
在竞争激烈的后互联网时代,深度挖掘每份流量背后的商业价值成为每个企业的必修课,而网站性能与体验的优化是这一过程中重要环节。 因此,《网站性能与体验优化指北》成为后互联网时代的网站运维的必备电子书。