從文本進度條開始:談談自己缺失的Python基礎知識
一、文本進度條
在對π進行求值時看到了文本進度條,之前一直用的是tqdm模塊。
來源:步平凡:《使用 PYTHON 實現Π的計算》,鏈接: https://www.cnblogs.com/bpf-1024/p/10549896.html.
源碼:
from math import fabs #導入數學模塊
from time import perf_counter #導入時間模塊
def Bar(i): #動態文本條
N = pow(10,level)
a = int((i/N)*50)
b = 50 - a
Y , N = '*' * a , '.' * b
print("\r計算中:{:3.0f}% [{}->{}] {:.2f}s".format(2 * a,Y,N,perf_counter()),end='')
level = eval(input('計算Pi精確到小數點後幾位數:'))
print('\n{:=^70}'.format('計算開始'))
a,b,pi,tmp = 1,1,0,1
i = 0
'''
a 分子 | b 分母 | pi 圓周率
tmp 存儲a/b的值 | i 執行進度
'''
perf_counter() #開始計時
while (fabs(tmp) >= pow(10,-level)): #計算Pi
pi += tmp
b += 2
a = -a
tmp = a/b
i += 2
Bar(i) #調用函數,實時顯示計算進度
print('\n{:=^70}'.format('計算完成'))
print('\nPi的計算值爲:{}'.format(round(pi*4,level))) #輸出計算結果
對於Bar(i)表示看不懂,就又去找了一個glitterye:《用python實現單行動態刷新文本進度條》,鏈接: link.
二、基礎知識
(一)Python center()方法
菜鳥教程:鏈接: link.
str = '2020'
print(str.center(20))#20爲寬度
print(str.center(20,'-'))#'-'爲填充內容
通過嘗試明白了,center()方法是居中輸出
str.center(width[, fillchar])
width – 字符串的總寬度。
fillchar – 填充字符。
(二)time.perf_counter()
經過嘗試發現這是一個計時器,但是初始的print(time.perf_counter())並不爲0
import time
print(time.perf_counter())
time.sleep(5)
print(time.perf_counter())
(三)print()
菜鳥教程:鏈接: link.
print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)
objects -- 複數,表示可以一次輸出多個對象。輸出多個對象時,需要用 , 分隔。
sep -- 用來間隔多個對象,默認值是一個空格。
end -- 用來設定以什麼結尾。默認值是換行符 \n,我們可以換成其他字符串。
file -- 要寫入的文件對象。
flush -- 輸出是否被緩存通常決定於 file,但如果 flush 關鍵字參數爲 True,流 會被強制刷新。
嘗試:
for i in range(10):
print('\r',i,end='')
#因爲默認的結尾爲'\n’,所以改變導致更新
雖然之前見過end=’’,但是一直不明其裏,只是知道可以不換行,而對於\r見過但是沒有用過,之前一直按照《Python編程:從入門到實踐》用過\t \n,到此處才明白,\r相當於回車。
但是對於flush不怎麼理解,True或者False效果一樣
print(".",end = '',flush=True)
print(".",end = '',flush=False)
一樣是一個一個點刷新
並不像energy_百分百:《#深入理解# python 的 print() 函數 在當前行打印 不換行》說的一次性刷新六個點(ps:難道我的理解有誤),鏈接: link.
三、練習的代碼
import time
scale = 50
print("執行開始".center(scale // 2,"-"))#中心顯示
start = time.perf_counter()#計時器
for i in range(scale + 1):
a = "*" * i
#*隨着循環遞增
b = "." * (scale - i)
#隨着循環遞減
c = (i / scale) * 100
# c爲前面的百分比
dur = time.perf_counter() - start
print("\r{:^3.0f}%[{}->{}]{:.2f}s".format(c,a,b,dur),end = "")
time.sleep(0.1)
print("\n"+"執行結束".center(scale // 2,"-"))
for i in range(10):
print('a \r a',i,end='')
#因爲默認的結尾爲'\n’,所以改變導致更新