Python日记——将datetime变为可迭代对象的小技巧

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)
MyTimer

 

 
posted @ 2017-12-17 15:40  东方少侠  阅读(458)  评论(0)    收藏  举报