当您运行这段代码时,会看到以下内容逐步打印出来: ``` ------执行开始------ 0%[->........] 10%[*->.......] 20%[**->......] 30%[***->.....] 40%[****->....] 50%[*****->...] 60%[******->..] 70%[*******->.] 80%[********->] 90%[*********->] 100%[**********->] ------执行结束------ ``` 现在让我们逐行解析代码的执行过程: 1. 打印"------执行开始------"作为任务开始的提示信息。 2. 进入循环,范围从0到scale(10)。 3. 在每次循环中,根据当前的进度i生成两个字符串变量:a和b。 - 变量a是通过将星号(*)重复i次而得到的,表示已完成的进度部分。 - 变量b是通过将点号(.)重复(scale-i)次而得到的,表示尚未完成的进度部分。 4. 计算当前进度的百分比,并存储在变量c中。计算方式为(i/scale)*100。 5. 使用字符串格式化将当前进度条的情况打印出来。格式化字符串"{:^3.0f}%[{}->{}]"包含三个占位符,依次替换为百分比c、已完成的进度a和尚未完成的进度b。 6. 使用time.sleep(0.1)函数暂停0.1秒,以产生进度条的动画效果。 7. 循环重复执行步骤3至步骤6,直到循环结束。 8. 打印"------执行结束------"作为任务结束的提示信息。 这段代码使用简单的文本方式展示了一个进度条,以可视化地表示任务的执行进度。每次循环迭代,都会更新进度条并打印出来,通过暂停时间可以控制进度条的刷新速度。 | |||||
-采用字符串方式打印可以动态变化的文本进度条 -进度条需要能在一行中逐渐变化 问题分析 如何获得文本进度条的变化时间? -采用sleep()模拟一个持续的进度 -似乎不那么难 #TextProBarV1.py import time scale = 10 ---->文本进度条大概的宽度 print("------执行开始------") for i in range(scale+1): a = '*' * i b = '.' * (scale - i) c = (i/scale)*100 print("{:^3.0f}%[{}->{}]".format(c,a,b)) time.sleep(0.1) print("------执行结束------") | |||||
当使用字符串的`format()`方法来格式化字符串时,花括号 `{}` 用作占位符,指示在字符串中要插入变量的位置。让我们逐个解析这个字符串格式化表达式:`"{:^3.0f}%[{}->{}]"`。 1. `:` 冒号后面的 `^` 表示居中对齐字符串。 2. `3.0` 指定了总的输出宽度为3个字符,其中整数部分占据所有可用空间,小数部分没有指定所以为0位。 3. `f` 表示格式化一个浮点数。 4. `%` 用于给百分比留出位置。 5. `[{}->{}]` 是一个嵌套的占位符格式。内部的两个花括号 `{}` 将会替换成进度条已完成和未完成部分的字符串。 通过将变量 `c` 替换为 `{:^3.0f}`,我们可以确保百分比以居中对齐的形式显示,并且占据三个字符的宽度。 进度条的实际效果是通过将进度条已完成部分的字符串 `a` 和尚未完成部分的字符串 `b` 替换到格式化字符串中的花括号 `{}` 中实现的。 例如,在循环进行到40%时,`c` 的值为40,星号 `*` 重复了4次赋值给 `a`,点号 `.` 重复了6次赋值给 `b`。所以 `"{:^3.0f}%[{}->{}]"` 最终会被格式化为 `40%[****->......]`。 这样的字符串格式化使得打印的进度条具有一致的宽度,并且进度部分和未完成部分的长度根据当前进度而动态变化,从而呈现出一个不断更新的进度条效果。 | |||||
单行动态刷新:指先像文本进度条一样,在每一行中根据程序的进度,不断的显示文本进度,进度条的信息,但是它并不换行
-刷新的本质是:用后打印的字符覆盖之前的字符
-不能换行:print()需要被控制
-要能退回:打印后光标退回到之前的位置\r
#TextProBarV1.py
import time
for i in range(101):
print("\r{:3}%".format(i),end="")
time.sleep(0.1)
如果我们希望增加的字符串后面增加什么信息,就在end参数中增加,如果你不希望增加换行,那么就将end参数赋值为空字符串
#TextProBarV1.py
import time
scale = 10
print("------执行开始------")
start = time.perf_counter()
for i in range(scale+1):
a = '*' * i
b = '.' * (scale - i)
c = (i/scale)*100
dur = time.perf_counter() - start --->当前时间减去最开始记录的开始时间,就是当前文本进度条展示所消耗的时间
print("\r{:^3.0f}%[{}->{}]{:.2f}s".format(c,a,b,dur),end='') ---->\r实现光标向行首移动
time.sleep(0.1)
print("\n"+"执行结束".center(scale//2,'-'))
举一反三
计算问题扩展
-文本进度条程序使用了perf_counter()计时
-计时方法适合各类需要统计时间的计算问题
-例如:比较不同算法时间、统计部分程序运行时间
进度条扩展
-在任何运行时间需要较长的程序中增加进度条
-在任何希望提高用户体验的应用中增加进度条
-进度条是人机交互纽带之一
文本进度条的不同设计函数