zoukankan      html  css  js  c++  java
  • 自主学习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(" {: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(" {:^3.0f}%[{}->{}]{:.2f}s".format(c,a,b,-t),end='')
      time.sleep(0.05)
    print(" "+"执行结束".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(" {:^3.0f}%[{}->{}]{:.2f}s".format(c,a,b,-t),end='')
      time.sleep(0.05)
    print(" "+"执行结束".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(" {:^3.0f}%[{}->{}]{:.2f}s".format(c,a,b,-t),end='')
    print("运行时间是:{:.5f}s".format(time.clock()))

    先用IDLE环境试试效果:

    由于需要击打的点很多,以及消耗资源的问题,运行很慢,不过效果还是我们所期望的(当然存在warnings)

    再用单行刷新形式,即cmd命令行打开:

    成功!

    那,带着做成的成就感以及学习的喜悦,我今天的分享就到这啦~

  • 相关阅读:
    核函数矩阵为什么要是positive semidefinite的
    Autoencoders
    Statistics与Machine Learning有什么区别
    [zz]Using SyncTeX with LaTeX
    Metric Learning的一个疑惑
    [zz]Latex中texworks编辑器正向反向跳转搜索
    [zz]Python3.x新特性
    LyX 2.0.5中文排版
    function
    多行文字结尾显示省略号
  • 原文地址:https://www.cnblogs.com/iconangle/p/10556176.html
Copyright © 2011-2022 走看看