5.4模块2:time库的使用
5.4.1time库基本介绍
1)time库是Python中处理时间的标准库:import time time.<b>()
2)功能: 计算机时间的表达 ;提供获取系统时间并格式化输出功能 ;提供系统级精确计时功能,用于程序性能分析
3)time库包括三类函数
- 时间获取:time() ctime() gmtime()
- 时间格式化:strftime() strptime()
- 程序计时:sleep() perf_counter()
5.4.2详细函数介绍:
time() 获取当前时间戳,即计算机内部时间值,浮点数
>>>time.time() 1516939876.6022282
ctime() 获取当前时间并以易读方式表示,返回字符串
>>>time.ctime() 'Fri Jan 26 12:11:16 2018'
gmtime() 获取当前时间,表示为计算机可处理的时间格式
>>>time.gmtime()
time.struct_time(tm_year=2018, tm_mon=1, tm_mday=26, tm_hour=4, tm_min=11, tm_sec=16, tm_wday=4, tm_yday=26, tm_isdst=0)
时间格式化将时间以合理的形式展示出来,类似字符串格式化,需要有展示模板,展示模板由特定的格式化控制符组成。
strftime(tpl, ts) tpl是格式化模板字符串,用来定义输出效果 ts是计算机内部时间类型变量
>>>t = time.gmtime()
>>>time.strftime("%Y-%m-%d %H:%M:%S",t)
'2018-01-26 12:55:20'
格式化控制符:
格式化字符串 | 日期/时间说明 | 值范围和示例 |
%Y | 年份 | 0000~9999,例如:1900 |
%m | 月份 | 01~02,例如:10 |
%B | 月份名称 | January~December,例如:April |
%b | 月份名称缩写 | Jan~Dec,例如:Apr |
%d | 日期 | 01~31,例如:25 |
%A | 星期 | Monday~Sunday,例如:Wednesday |
%a | 星期缩写 | Mon~Sun,例如:Wed |
%H | 小时(24h制) | 00~23,例如:12 |
%I | 小时(12h制) | 01~12,例如:7 |
%P | 上/下午 | AM,PM,例如:PM |
%M | 分钟 | 00~59,例如:26 |
%S | 秒 | 00~59,例如:26 |
程序计时:测量起止动作历时的过程
测量时间函数:perf_counter()
产生时间函数:sleep()
perf_counter():返回一个CPU级别的精确时间计数值,单位为秒
由于这个计数值起点不确定,连续调用差值才有意义 :
>>>start = time.perf_counter()
318.66599499718114
>>>end = time.perf_counter()
341.3905185375658
>>>end - start
22.724523540384666
sleep(s):s拟休眠的时间,单位是秒,可以是浮点数
>>>def wait():
time.sleep(3.3)
>>>wait()
#程序将等待3.3秒后再退出
Python官方文档中文版:https://docs.python.org/zh-cn/3/
5.5示例4:文本进度条
1)实现:采用字符串方式打印可以动态变化的文本进度条 ;进度条需要能在一行中逐渐变化
2)如何获得文本进度条的变化时间? - 采用sleep()模拟一个持续的进度
3)单行动态刷新:
- 刷新的关键是 \r
- 刷新的本质是:用之后打印的字符覆盖之前的字符
- 不能换行:print()需要被控制
- 要能回退:打印后光标退回到之前的位置 \r
4)代码:
#TextProBarV3.py
import time
scale = 50
print("执行开始".center(scale//2,"-"))
start = time.perf_counter()
for i in range(scale+1):
a = '*' *i
b = '.'*(scale-i)
c = (i/scale)*100
dur = time.perf_counter() - start
print("\r{:^3.0f}%[{}->{}]{:.2f}s".format(c,a,b,dur),end='')
time.sleep(0.1)
print("\n"+"执行结束".center(scale//2,"-"))
代码解析:
print("执行开始".center(scale//2,"-")):
center() 方法返回一个指定的宽度 width 居中的字符串,fillchar 为填充的字符,默认为空格,语法str.center(width[, fillchar])。
.center() 控制输出的样式,宽度为 50//2,即 25,汉字居中,两侧填充 -
start = time.perf_counter():
调用一次perf_counter(),从计算机系统里随机选一个时间点A,计算其距离当前时间点B1有多少秒。当第二次调用该函数时,默认从第一次调用的时间点A算起,距离当前时间点B2有多少秒。两个函数取差,即实现从时间点B1到B2的计时功能。
print("\r{:^3.0f}%[{}->{}]{:.2f}s".format(c,a,b,dur),end=''):
\r用来在每次输出完成后,将光标移至行首,这样保证进度条始终在同一行输出,即在一行不断刷新的效果;{:^3.0f},输出格式为居中,占3位,小数点后0位,浮点型数,对应输出的数为c;{},对应输出的数为a;{},对应输出的数为b;{:.2f},输出有两位小数的浮点数,对应输出的数为dur;end='',用来保证不换行,不加这句默认换行。
结果:
得不到老师的结果:
原因:?
进度条的单行回退要在命令行(也叫控制台、Windows的cmd)下才能使用,IDLE屏蔽了'\r'的功能。
文本进度条程序使用了 perf_counter() 计时,计时方法适合各类需要统间的算问题,例如:比较不同算法时间 、统计程序运行时。
进度条可应用在:任何运行时间需要较长的程序中;任何希望提高用户体验的应中;进度条是人机交互的纽带之一
文本进度条的不同设计函数: