2017.12.17
在完成《零基础入门学习Python》一书中计时器作业时,题目要求将计时器精度提高到微秒级,而演示中调用的是time模块中的localtime()方法获取时间,而localtime的精度只能达到秒一级,所以,自然会想到调用datetime中的datetime类。
值得注意的是,我们要调用的是datetime模块下的datetime类,所以在导入时应该是
“
>>> from datetime import datetime
”
datetime.now()返回当前日期和时间,其类型是datetime。
看到这里很自然的就会想,我只需要把原演示中的t.localtime()替换为t.now()不就解决了吗。事实上一开始我也是这么做的,但由于datetime并非可迭代对象,用Python的话来说就是“object is not iterable”(对象是不可迭代的)或者“object is not subscriptable”(对象不能拥有下标)
所以这里就要想办法把datetime.now()变成可迭代的。这里我是用的方法是先用strftime() 用来格式化datetime,也就是将其转化为字符串,然后再用split()字符串进行切片,这样datetime就变成了由年月日时分秒及微秒组成的List,再用内置的int()方法将字符串转换为整数,就可以代入进行迭代了
datetime可迭代化部分代码如下:
“
self.strend=self.end.strftime('%Y,%m,%d,%H,%M,%S,%f').split(",")
self.strbegin=self.begin.strftime('%Y,%m,%d,%H,%M,%S,%f').split(",")#这里用“,”将不同单位的时间分隔,便于之后将字符串分片
”
最终实现了将计时器精度精确到微秒的目的,附完整代码:


1 from datetime import datetime as t 2 class MyTimer: 3 def __init__(self): 4 self.prompt="未开始计时" 5 self.unit=['年',"月","日","时","分","秒","微秒"] 6 self.lasted=[] 7 self.begin=0 8 self.end=0 9 def __str__(self): 10 return self.prompt 11 __repr__=__str__ 12 def start(self): 13 self.begin=t.now() 14 print("计时开始!") 15 def stop(self): 16 self.end=t.now() 17 print("计时结束!") 18 self.calc() 19 def calc(self): 20 self.lasted=[] 21 self.prompt="总共运行了" 22 self.strend=self.end.strftime('%Y,%m,%d,%H,%M,%S,%f').split(",") 23 self.strbegin=self.begin.strftime('%Y,%m,%d,%H,%M,%S,%f').split(",") 24 for i in range(7): 25 intspan=int(self.strend[i])-int(self.strbegin[i]) 26 if i==6: 27 if intspan>=0: 28 self.lasted.append(intspan) 29 else: 30 self.lasted[5]-=1 31 self.lasted.append(intspan+1000000) 32 else: 33 if intspan>=0: 34 self.lasted.append(intspan) 35 else: 36 self.lasted[i-1]-=1 37 self.lasted.append(intspan+60) 38 if self.lasted[i]: 39 self.prompt+=(str(self.lasted[i])+self.unit[i]) 40 print(self.prompt)
本文介绍如何使用Python的datetime模块将计时器精度从秒级提升至微秒级。通过将datetime对象转化为可迭代的字符串列表,并利用内置的int()方法转换为整数,成功实现微秒级计时。
2466

被折叠的 条评论
为什么被折叠?



