鉴于下面的Python代码,请帮助我理解那里发生了什么。
start_time = time.time()
time.sleep(42)
end_time = time.time()
uptime = end_time - start_time
human_uptime = str(datetime.timedelta(seconds=int(uptime)))
所以我得到了
start time
和 end time
之间的区别,在第 5 行我通过强制转换对持续时间进行了舍入,现在,进一步的解释是什么?
我知道 delta 的含义(平均值或差异),但为什么我必须将
seconds = uptime
传递给 timedelta
以及为什么字符串转换效果如此好以至于我得到 HH:MM:SS
?
因为 timedelta 的定义如下:
class datetime.timedelta([days,] [seconds,] [microseconds,] [milliseconds,] [minutes,] [hours,] [weeks])
所有参数都是可选的,默认为 0。
您可以轻松地说“三天零四毫秒”,并带有可选参数。
>>> datetime.timedelta(days=3, milliseconds=4)
datetime.timedelta(3, 0, 4000)
>>> datetime.timedelta(3, 0, 0, 4) #no need for that.
datetime.timedelta(3, 0, 4000)
对于 str 转换,它返回一个很好的格式化值而不是
__repr__
以提高可读性。来自文档:
str(t) 返回格式为 [D day[s], ][H]H:MM:SS[.UUUUUU] 的字符串, 其中,对于负 t,D 为负。 (5)
>>> datetime.timedelta(seconds = 42).__repr__()
'datetime.timedelta(0, 42)'
>>> datetime.timedelta(seconds = 42).__str__()
'0:00:42'
查看文档:
http://docs.python.org/library/datetime.html#timedelta-objects
为什么我必须将秒=正常运行时间传递给timedelta
因为 timedelta 对象可以传递秒、毫秒、天等......所以你需要指定你传递的内容(这就是你使用显式键的原因)。类型转换为
int
是多余的,因为它们也可以接受浮点数。
为什么字符串转换效果如此好以至于我得到 HH:MM:SS ?
格式化的不是类型转换,而是对象内部的
__str__
方法。事实上,如果你这样写,你会得到同样的结果:
print(datetime.timedelta(seconds=int(uptime)))