經過自己一段時間的學習,已經略有收獲了!在整個過程的進行中,在我逐漸通過看書,看案例,做題積累了一些編程python的經驗以后,我發現我漸漸愛上了python,愛上了編程!
接下來,當然是又一些有趣的實驗案例:文本進度條的制作和π的計算!
**文本進度條
相信大家都玩過游戲吧,面對加載的游戲數據,我們可能會遇到這樣一種情況:網絡卡頓的時候,進度條緩緩移動卻遲遲不能加載完全,實在是消磨人們的耐心(狗頭)
在我們的印象中,進度條應該是一個條狀方塊,隨着時間的推移慢慢向前移動,直至數據加載完成!
那么,要怎么用python來實現呢??
我們有一些不同的形式呢~
一·、最簡單的一種
基本思想:
這是一種簡單的,按照任務執行的百分比將整個任務划分為100個單位,每執行N%輸出一次進度條;每行輸出包括進度百分比,代表已完成的部分(**)和未完成的部分(..)的兩種字符,以及一個跟隨完成度前進的小箭頭:
類似於這樣:%10{******->..................................................}
代碼:
接下來,就來展示一下實現上面這個指令的python代碼要怎么寫吧~
import time
scale=10
print("------執行開始------")
for i in range(scale+1):
a,b='**'*i,'..'*(scale-i)
c=(i/scale)*100
print("%{:^3.0f}[{}->{}]".format(c,a,b))
time.sleep(0.1)
print("------執行結束------")
顯然我們從這幾行代碼中可以看出,代碼調用了python中的time庫,這是標准時間庫;
由於程序的執行速度遠超人類的視覺停留時間,直接進行字符輸出幾乎是瞬間完成,所以我們采用了time庫中的time.sleep(t)函數來將當前的程序暫時掛起 t 秒,以便人眼能夠捕捉到程序進行的細節;
我們可以再IDLE環境下看到它的運行效果:
(將代碼打入IDLE環境中)
(一行行根據0.1秒的間隔輸出出來)
是不是很酷呢?
二、單行動態刷新
基本思想:
我們一般見到的進度條都是在一行上刷新操作的,所以,我們運用動態刷新的思想,將每一次進度輸出都固定在同一行,並不斷地用生成的字符串覆蓋之前的輸出,形成進度條不斷刷新的動態效果!
代碼:
import time
for i in range(101):
print("\r{:3}%".format(i),end="")
time.sleep(0.03)
看上去十分簡潔,它最后呈現的效果是這樣的:
由於IDLE環境下本身屏蔽了單行刷新的功能,想要有刷新效果就得移步到控制台使用命令行執行程序
方法:
1.首先是按住鍵盤的“windows+R”調用出cmd窗口
緊接着,我們就可以將文件的地址輸入來調用了:
這是我存放的地址
選擇python打開
(最后效果啦~)
是不是很酷??
三、帶刷新的文本進度條
基本思想:
將前兩小節的程序合並,再添加開始和結束提示語,可以很好地實現帶刷新的文本進度條,我們調用time.clock()函數來對運行時間進行監控;
代碼:
import time
scale=50
print("執行開始".center(scale//2,'-'))
t=time.clock()
for i in range(scale+1):
a='*'*i
b='.'*(scale-i)
c=(i/scale)*100
t-=time.clock()
print("\t{:^3.0f}%[{}->{}]{:.2f}s".format(c,a,b,-t),end='')
time.sleep(0.05)
print("\n"+"執行結束".center(scale//2,'-'))
最終效果:
大概的形式就是這樣啦!
當然還可以有更高級的做法:
四、利用第三方庫tqdm實施
先運用pip在python中下載大三方庫tqdm;
接下來我們使用上面第三個代碼進行庫的使用,代碼當然要進行相應的修改:
import time
from tqdm import tqdm
scale=50
print("執行開始".center(scale//2,'-'))
t=time.clock()
for i in tqdm(range(scale+1)):
a='*'*i
b='.'*(scale-i)
c=(i/scale)*100
t-=time.clock()
print("\t{:^3.0f}%[{}->{}]{:.2f}s".format(c,a,b,-t),end='')
time.sleep(0.05)
print("\n"+"執行結束".center(scale//2,'-'))
為了讓它有刷新效果,我們在cmd的命令行中執行:
Python打開:
效果:
帥!
**π的計算
基本思想:
應用蒙特卡羅方法求解,隨機向單位正方形區域中拋灑大量“飛鏢”點,計算每個點到圓心 的距離從而判斷該點在圓內或圓外,用圓內的點數除以總點數就是π/4
課本里的代碼只是簡單地計算,我已經學會了如何實現文本進度條,以及刷新表示,並利用第三方庫tqdm來進行直觀表現,所以,我決定將這兩個知識點結合起來,也就是:
制作一個計算π的程序,同時得知計算的用時以及計算過程中的進度如何,通過進度條直觀反映;
於是,我寫出了下面的代碼:
from math import sqrt
from tqdm import tqdm
from random import random
import time
DARTS=10000
hits=0.0
t=time.clock()
for i in tqdm(range(1,DARTS+1)):
x,y=random(),random()
dist=sqrt(x**2+y**2)
if dist<=1.0:
hits+=1
a='*'*i
b='.'*(DARTS+1-i)
c=(i/DARTS+1)*100
t-=time.clock()
time.sleep(0.00001)
pi=4*(hits/DARTS)
print("Pi值是{}.".format(pi))
print("\t{:^3.0f}%[{}->{}]{:.2f}s".format(c,a,b,-t),end='')
print("運行時間是:{:.5f}s".format(time.clock()))
先用IDLE環境試試效果:
由於需要擊打的點很多,以及消耗資源的問題,運行很慢,不過效果還是我們所期望的(當然存在warnings)
再用單行刷新形式,即cmd命令行打開:
成功!
那,帶着做成的成就感以及學習的喜悅,我今天的分享就到這啦~