第七章 time库简要使用,文本进度条乱码问题,重要性

python中包含若干个处理时间的库,time库是其中最基本的一个。能提供获取系统时间并格式化输出功能,能提供系统级精确计时功能,用于程序性能分析。
time库包含三类函数:
①时间获取 time() ctime() gmtime()
②时间格式化 srtftime() strptime()
③程序计时 sleep() perf_counter()


time() 获取当前时间戳,即计算机内部时间值,浮点数,从控制台来看精确值是微秒
这里写图片描述
从1970点0点0分开始,到现在以秒为单位的数值

ctime() 因为time()给的浮点数不容易直观理解,所以ctime() 以易读的方式表示,结果是字符串
这里写图片描述

gmtime() 对time()时间的另一种表示方式,c语言当中的结构体变量,9种成员
这里写图片描述

将时间以合理的方式展示出来,类似于字符串格式化,输出更直观美观
strftime(tpl,ts) tpl是格式化模版字符串,用来定义输出效果,ts是计算机内部时间类型变量
说白了就是消除掉c语言的struct_time结构体变量的表示方法,以符合python的格式使用
这里写图片描述
这里写图片描述
这里写图片描述
strptime(ts,tpl) 和strftime不同,这个函数是把一个用户给定时间的字符串,以模版方式,给转换为struct_time结构。
这里写图片描述
能把结构体以年月日的方式修改为1700年5月20日。
程序计时:
per_counter 有了time()之后,理论上已经可以计时了,不需要额外增添一个函数吧?
这里写图片描述
看来time()的精确值还不止微秒,应该是总输出位数限制了,小数点后15位,纳秒之后?
这里写图片描述
感觉perf_counter()函数完全没用啊,效果一样,纯属多余。
sleep(s) 让程序休眠s秒,s可以是浮点数


文本进度条,输入代码发生错误:

import time
scale =10
print("------执行开始------")
for i in range(scale+1):
    a='*'*i
    b='.'*(scale-i)
    c=(i/scale)*100
    print("{:^3.0f}%[{}->{}]".format(c,a,b)
    time.sleep(0.2)
print("------结束执行------")

这里写图片描述
运行后,连源文件的编码都出现乱码,并报告”non-utf-8 code”,于是查询官方文档

这行代码的意思是让源文件支持中文注释。
有一点我们要知道,python的源文件编码格式支持是可更改的。
需要注意的是,以上讨论中。关于中文编码相关的问题只在python2系列版本中存在。 在python3中默认的编码是Unicode,所以不需要在每个python文件中再加上
-- coding:utf-8 -- 注释。
加入了注释也依然乱码,看来官方文档没有解决这个问题。
我本来就是使用的python3,默认就是utf-8,为什么会出这种奇怪的错误呢?
回想了一下,前几天都是正常的,能使用input,print中文,昨天新建了一个c++的项目,练习了几个小程序。
今天切换(打开原有python解决方案)后,才发生的这个问题。
是不是我的vs2015出问题了?要不换用一下idle。
这里写图片描述
time.sleep没写错啊,两个IDE同时出错,那肯定不是编译器的问题了。
再仔细检查,发现print语句最后少了一个括号!!
把源码乱码部分删掉,用中文重新输入了一下,现在运行正常了(包括vs2015),归根结底还是自己代码没写对。
结果就出现这类莫名其妙的错误。
这里写图片描述
单行文本进度条刷新:
刷新的本质是用后打印的字符覆盖之前的字符,\r光标回到一行开头

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

老师说idle环境运行的话,不会在单行刷新,这是因为idle屏蔽掉了\r功能,不过我用vs2015实验,它会直接调用cmd。
自然没有屏蔽\r功能,能够单行显示。
这里写图片描述
综合起来形成完整版本:

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

进度条是人机交互的纽带之一,在任何运行时间较长的程序中增加进度条。
在任何希望提高用户体验的应用中增加进度条。
根据科学家实验,发现先慢速增加,然后随着时间的推移,进度条速度加快,体验更符合人的心里需求。
另外,我发现vs2015在python错误提示上,不如idle精确,同样的代码我在c=(i/scale)*100这里写错成i.scale
vs2015不停提示我print行错误,又报告’non-utf8-code’,而反复检查发现print行并没有问题。
我换用idle去执行源代码,idle直接报告i.scale行错误,明显精确得多。
如果不是visual studio的调试功能和用习惯了,写python看来并非第一选择。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值