完全可以!原代碼的核心是用 字符串格式化 生成固定長度的進度條框架,再用 # 填充已完成部分,但嵌套的 %% 和 % 確實容易繞暈。我們可以把它拆成 3步直觀操作,代碼更易讀,邏輯完全一致:
改寫思路
原代碼邏輯:生成固定長度的框架 → 用#填充已完成部分
改寫後邏輯:生成已完成的#字符串 → 生成未完成的空格字符串 → 拼接成完整進度條
更容易理解的代碼(兩種方式)
方式1:字符串拼接(最直觀,推薦)
def progress(percent, width=50):
if percent > 1:
percent = 1 # 進度最多100%
# 1. 計算已完成的#數量(比如width=50,percent=0.3 → 15個#)
completed_count = int(width * percent)
# 2. 生成已完成的#字符串
completed_str = '#' * completed_count
# 3. 生成未完成的空格字符串(總長度 - 已完成長度)
remaining_str = ' ' * (width - completed_count)
# 4. 拼接成完整進度條(用[]包裹)
show_str = f'[{completed_str}{remaining_str}]'
# 打印進度條+百分比(\r覆蓋當前行,end=''不換行)
print(f'\r{show_str} {int(100*percent)}%', end='')
方式2:f-string格式化(簡潔,仍直觀)
如果想保留“格式化”的思路,用f-string替代舊的%格式化,可讀性也會大幅提升:
def progress(percent, width=50):
if percent > 1:
percent = 1
completed_count = int(width * percent)
# f-string直接填充#和空格,{:<%d}表示左對齊,總長度width
show_str = f'[{"#"*completed_count:<{width}}]' # 關鍵:<{width} 左對齊,剩餘補空格
print(f'\r{show_str} {int(100*percent)}%', end='')
改寫後代碼的優勢
- 邏輯拆分清晰:把“計算數量→生成字符串→拼接”拆成獨立步驟,不用再糾結
%%和%的嵌套; - 變量命名易懂:
completed_count(已完成#數量)、remaining_str(未完成空格),見名知義; - 兼容性不變:和原代碼功能完全一致,運行效果毫無差異;
- 可擴展性強:比如想把
#改成>,直接改completed_str = '>' * completed_count即可,比原代碼更容易修改。
關鍵細節説明(和原代碼保持一致)
int(width * percent):因為進度條的“格子數”必須是整數(比如50格進度條,30%就是15格),所以用int()取整;' ' * (width - completed_count):未完成部分用空格填充,確保進度條總長度固定為width(比如50格),視覺上整齊;f'[{"#"*completed_count:<{width}}]'::<{width}是f-string的左對齊格式,意思是“生成的字符串左對齊,總長度為width,不足部分補空格”,和原代碼的[%%-%ds]效果完全一致。
運行效果
和原代碼完全相同,比如percent=0.5、width=50時,會生成:
[########################------------------------] 50%
這樣改寫後,即使是新手也能一眼看明白進度條的生成邏輯,不用再被複雜的字符串格式化嵌套困擾~