學Python這麼多天,除了之前的海龜畫圖之外,最近學的一個實例算是讓我再一次感受到成就感:一個每次安裝程序都能見到的實例——進度條。
進度條在計算機使用中可以說是隨處可見,是每一個接觸過電腦的人都知道的東西,但是這個玩意兒看似簡單,學過之後才發現,進度條竟然也有些許隱藏的套路
一、進度條簡單介紹
- 進度條從呈現形式有多種多樣,有的設計非常漂亮、色彩豐富;
- 深入研究進度條的進度展示函數是才發現也是套路滿滿
(界面顯示的進度大部分都不是採用線性方法計算出來,直白點講就是實際進度和顯示進度多數都是不一致的。下圖是主流的幾種顯示進度的計算函數)。
二、文本進度條實例
話不多說,上手實踐,走起。因為初學,所以粗糙。只能先來個最糙的文本進度條(不忽悠,線性時間展示)。
- 實例目標:
採用字符串方式打印可以動態變化的文本進度條,進度條在一行中逐漸變化
- 問題分析:
借鑑大象進冰箱的步驟,這個問題我們也來分三步。第一步,實現計時;第二步,展示每一次進度;第三步,把每一次的進度展示整到一行裡面。下面我們開始:
- 第一步,實現計時
<code>import time #導入time庫
start = time.perf_counter() #計時開始
end = time.perf_counter() #計時結束
dur = end -start #計算時間差
print(dur) #輸出/<code>
- 第二步,展示每一次進度;
要展示每一次進度,我們需要引入一個過程(取一個最簡單的函數,我們採用for循環,每次循環我們讓時間延遲0.1秒)
<code>import time #導入time庫
start = time.perf_counter() #計時開始
for i in range(50): #循環50次
time.sleep(0.1) #延遲0.1秒
end = time.perf_counter() #計時結束
dur = end -start #計算時間差
print("{:.2f}".format(dur)) #輸出/<code>
運行後,分50次輸出程序運營時間。但沒有展示我們需要的進度。改進一下
<code>#文本進度條
import time #導入time庫
start = time.perf_counter() #計時開始
for i in range(51): #循環51次
time.sleep(0.1) #延遲1秒
end = time.perf_counter() #計時結束
dur = end -start #計算時間差
a="*"*i
b="-"*(50-i)
c=(i/50)*100
print("{:.0f}%[{}>{}]用時{:.2f}秒".format(c,a,b,dur)) #輸出/<code>
顯示50行和數據,效果如下,感覺還可以,基本實現,我們預期。
- 第三步:把每一次的進度展示整到一行裡面。50行並一行,單行刷新。
這裡我們採用Python字符串處理中的轉義符“\\r”來使單行打印結束後,光標移回行首,已實現單行數據刷新效果。
<code>#文本進度條
import time #導入time庫
start = time.perf_counter() #計時開始
for i in range(51): #循環51次
time.sleep(0.1) #延遲0.1秒
end = time.perf_counter() #計時結束
dur = end -start #計算時間差
a="*"*i
b="-"*(50-i)
c=(i/50)*100
print("\\r{:.0f}%[{}>{}]用時{:.2f}秒".format(c,a,b,dur),end="") #輸出/<code>
完美展示我們想要的結果:
- 最後我們稍加改進,提示開始,進度條更新,提示結束。
<code>#文本進度條
print("執行開始".center(64,"-"))
import time #導入time庫
start = time.perf_counter() #計時開始
for i in range(51): #循環51次
time.sleep(0.1) #延遲0.1秒
end = time.perf_counter() #計時結束
dur = end -start #計算時間差
a="*"*i
b="-"*(50-i)
c=(i/50)*100
print("\\r{:.0f}%[{}>{}]用時{:.2f}秒".format(c,a,b,dur),end="") #輸出
print("\\n"+"執行結束".center(64,"-"))/<code>
更加完美展示我們想要的結果:
最後的成就感
換一個黑白條的展示方式,結果超出我的預期
<code>#文本進度條
print("執行開始".center(63,"-"))
import time #導入time庫
start = time.perf_counter() #計時開始
for i in range(51): #循環51次
time.sleep(0.1) #延遲0.1秒
end = time.perf_counter() #計時結束
dur = end -start #計算時間差
a="■"*i
b="□"*(50-i)
c=(i/50)*100
print("\\r{:.0f}%[{}{}]用時{:.2f}秒".format(c,a,b,dur),end="") #輸出
print("\\n"+"執行結束".center(63,"-"))/<code>
- 這個結果就是我想要的,我喜歡。成就感滿滿!!
【end】
閱讀更多 騎豬的小猴子 的文章