Python之进度条及π的计算

文本进度条

1.  简单的开始

这是利用print()函数来实现简单的非刷新文本进度条。它的基本思想是按照任务执行百分比将整个任务划分为100个单位,每执行N%输出一次进度条。

为了模拟任务处理的时间效果,需要调用Python标准时间库time。

完整代码如下:

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("-----执行结束-----")

执行效果如下:

2.  单行动态刷新

此进度条相比第一类,区别在于原地输出和动态刷新。它的基本思想是将每一次进度输出都固定在同一行,并不断地用生成的字符串覆盖之前的输出,形成进度条不断刷新的动态效果。

完整代码如下:

import time
for i in range(101):
    print("\r{:3}%".format(i),end="")
    time.sleep(0.05)

执行效果如下:

3.  带刷新的文本进度条

为了更好地实现带刷新的文本进度条,我们可以将前两个程序进行合并,在为其添加开始和结束提示语。这里需要调用time.clock()函数,主要用来统计程序运行时间,以达到更好的体验效果。

完整代码如下:

import time
scale=50
print("执行开始".center(scale//2,'-'))
t=time.clock()
for i in range(scale+1):
    a='*'*1
    b='.'*(scale-i)
    c=(i/scale)*100
    t=time.clock()
    print("\r{:^3.0f}%[{}->{}]{:.2f}s".format(c,a,b,-t),end='')
    time.sleep(0.05)
    print("\n")
print("\n"+"执行结束".center(scale//2,'-'))

执行效果如下:

以上便是文本进度条的操作。

π的计算

π的精确求解曾经是数学历史上一直难以解决的问题之一,直到1948年,人类以人工计算方式得到π的808位精确小数。

计算π的方法有许多种,现在我介绍其中一种求π的方法——蒙特卡罗法。

蒙特卡罗方法求解π的基本步骤:随机向的单位正方形和圆结构,抛洒大量“飞镖”点,计算每个点到圆心的距离从而判断该店在圆内或圆外,用圆内的点书除以总点数就是π/4值。

实际上其思想是利用离散点值表示面积,通过面积比例来求解π值。(随机点数量越大,越充分覆盖整个图形,计算得到的π值越精确)

 

因为计算圆周率的程序需要时间运行,我们可以用进度条来提示程序的完成度。

完整代码如下:

from random import random
from math import sqrt
from time import *
DARTS=10000000
hits=0.0
for i in range(1,DARTS+1):
    x,y=random(),random()
    dist=sqrt(x**2+y**2)
    if dist <=1.0:
        hits=hits+1
pi=4*(hits/DARTS)
for i in range(101):
    print("\r{:3}%".format(i),end="")
    sleep(0.01) 
print("pi的值{}.".format(pi))
print("运行时间:{:.5f}s".format(clock()))

运行结果如下:

这就是蒙特卡罗法求解圆周率。