web-dev-qa-db-ja.com

pythonスリープ関数のカウントダウンを表示します

プログラムでtime.sleep(10)を使用しています。プログラムを実行すると、シェルにカウントダウンを表示できますか?

>>>run_my_program()
tasks done, now sleeping for 10 seconds

そして、私はそれを10、9、8、7 ....にしたい.

これは可能ですか?

16
user1681664

あなたはいつでもできる

#do some stuff
print 'tasks done, now sleeping for 10 seconds'
for i in xrange(10,0,-1):
    time.sleep(1)
    print i

このスニペットには、各番号が改行で印刷される、やや面倒な機能があります。これを回避するには、

import sys
import time
for i in xrange(10,0,-1):
    sys.stdout.write(str(i)+' ')
    sys.stdout.flush()
    time.sleep(1)
21
aestrivex

次のようなカウントダウン機能を実行できます。

import sys
import time

def countdown(t, step=1, msg='sleeping'):  # in seconds
    pad_str = ' ' * len('%d' % step)
    for i in range(t, 0, -step):
        print '%s for the next %d seconds %s\r' % (msg, i, pad_str),
        sys.stdout.flush()
        time.sleep(step)
    print 'Done %s for %d seconds!  %s' % (msg, t, pad_str)

キャリッジリターン\rおよびコンマ,は、同じ行に印刷を保持します(カウントダウン値ごとに1行を避けます)

秒数が減少すると、pad_strは、出力が短くなるにつれて最後の文字を残すのではなく、最後の行がスペースで上書きされるようにします。

最後の印刷では、最後のステータスメッセージが完了メッセージで上書きされ、出力行がインクリメントされるため、遅延の形跡があります。

7

これは、Python 3.xのコンソールにタイマーを表示する最良の方法です。

import time
import sys

for remaining in range(10, 0, -1):
    sys.stdout.write("\r")
    sys.stdout.write("{:2d} seconds remaining.".format(remaining))
    sys.stdout.flush()
    time.sleep(1)

sys.stdout.write("\rComplete!            \n")

これにより、各サイクルで前の行が上書きされます。

6
Barkles

これは、最初のpythonレッスンの1つで学んだことです。["/"、 "-"、 "|"、 "\"、 "|"]でプレイしましたが、原則は同じです:

import time

for i in reversed(range(0, 10)):
    time.sleep(1)
    print "%s\r" %i,
2
Azur

ここに私がやったものがあります:

import time
a = input("How long is the countdown?")
while a != 0:
    print a
    time.sleep(1)
    a = a-1

最後に、あなたと他の人なら、アラームか何かを置くことができます。

1
Silas Poulson

time.sleep()は、スリープがシグナルによって中断された場合、より早く戻る場合があります(OS /インタープリターによる他のプロセス/スレッドのスケジューリングによって異なります)。

複数の反復での精度を向上させ、多数の反復によるドリフトを回避するために、カウントダウンをクロックでロックすることができます。

#!/usr/bin/env python
import sys
import time

for i in reversed(range(1, 1001)):
    time.sleep(1 - time.time() % 1) # sleep until a whole second boundary
    sys.stderr.write('\r%4d' % i)
1
jfs

確かに、10から反復カウンターを差し引いたループを作成して、反復ごとに1秒間スリープさせ、10反復実行します。または、さらに柔軟にするために:

def printer(v):
    print v
def countdown_timer(duration, step=1, output_function=printer,
                    Prompt='Waiting {duration} seconds.'):
    output_function(Prompt.format(duration=duration))
    for i in xrange(duration/step):
        output_function(duration - step * i)
1
Silas Ray