從文本進度條開始:談談自己缺失的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’,所以改變導致更新
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章