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いるとすると、なぜ2番目のブランチに従わないのでしょうか。切り捨てられたバージョンではなく、完全な結果がまだ印刷されている理由を理解しようとして、私は途方に暮れています。

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

結果を出力するために、floatの整数部分と小数部分を取得しようとしています。floatをstrに変換し、numberに戻すことで大きなオーバーヘッドを追加するのではなく、数値データに対して演算子と関数を直接使用することをお勧めします。

そのために数学モジュール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値を渡すのではなく、巨大な値を持つ整数としてtを渡します。floatの数学関数を使い続ければ、このエラーは発生しません。

于 2012-05-14T19:56:04.457 に答える
1

%02d意味:整数を出力し、2桁より短い場合は、接頭辞としてゼロを付けます。フォーマットされた文字列は2桁に制限されません。

編集:数値の最初の2桁(四捨五入)を取得する1つの方法は次のnとおりです。

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

または、丸めを気にしない場合は、文字列をカットするだけです...

于 2012-05-14T19:48:07.367 に答える