0

不知道为什么会这样。我一定遗漏了一些明显的东西。

我正在尝试让计数器打印出类似 SMPTE 代码(小时:分钟:秒:帧(假设为 24fps))之类的东西。

到目前为止的代码:

import time


s_time = time.time()
def format_time():
    t = time.time() - s_time 
    if t < 1:
        print '00:00:00:%02d' % int(t/0.041666666666666664)
    elif t < 60:
        t = str(t).split('.')

        print '00:00:%02d:%02d' % (int(t[0]), int(int(t[1][:4])/0.041666666666666664) )

while True:
    format_time()

最初一切似乎都很好,直到持续时间超过 1 秒并elif进入分支。秒打印得很好,但帧打印出完整的多位数计算结果。鉴于格式化运算符正在指定%02d,就像它在第一个if分支中所做的那样(其行为符合预期),为什么它在第二个分支中不服从?我不知道为什么它仍在打印完整的结果而不是截断的版本。

4

3 回答 3

2

我希望你想要这样的东西:

hours = int(t)/3600
minutes = (int(t)/60)%60
seconds = int(t)%60
frames = (t-int(t))*24
print '%02d:%02d:%02d:%02d' % (hours, minutes, seconds, frames)
于 2012-05-14T19:54:07.227 回答
2

您正在尝试获取浮点数的整数部分和小数部分来打印结果。直接在数值数据上使用运算符和函数是一种很好的做法,而不是通过将浮点数转换为 str 再转换回数字来增加大量开销。

为此使用数学模块 modf 函数。它还将简化您的算法。

import time
import math

s_time = time.time()
def format_time():
    t = time.time() - s_time
    if t < 60:
        f,i = math.modf(t)
        print '00:00:%02d:%02d' % (i, f/0.041666666666666664)

while True:
    format_time()

PS:对于您的代码错误,在您的 elif 块中,您将 t 作为具有巨大值的整数传递,而不是传递它的 0.xxxxx 值。如果您继续使用浮点数的数学函数,则不会发生此错误。

于 2012-05-14T19:56:04.457 回答
1

%02d意思是:打印整数,如果它短于 2 位,则在其前面加上零。它不会将格式化字符串限制为两位数。

编辑:获取数字的前 2 位(四舍五入)数字的一种n方法是:

n = 13900
print round(n/10**math.floor(math.log10(n)-1))

或者如果你不关心四舍五入,只需剪断绳子......

于 2012-05-14T19:48:07.367 回答