自主學習python文本進度條及π的計算


 

經過自己一段時間的學習,已經略有收獲了!在整個過程的進行中,在我逐漸通過看書,看案例,做題積累了一些編程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命令行打開:

成功!

那,帶着做成的成就感以及學習的喜悅,我今天的分享就到這啦~

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM