プログラムでtime.sleep(10)を使用しています。プログラムを実行すると、シェルにカウントダウンを表示できますか?
>>>run_my_program()
tasks done, now sleeping for 10 seconds
そして、私はそれを10、9、8、7 ....にしたい.
これは可能ですか?
あなたはいつでもできる
#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)
次のようなカウントダウン機能を実行できます。
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は、出力が短くなるにつれて最後の文字を残すのではなく、最後の行がスペースで上書きされるようにします。
最後の印刷では、最後のステータスメッセージが完了メッセージで上書きされ、出力行がインクリメントされるため、遅延の形跡があります。
これは、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")
これにより、各サイクルで前の行が上書きされます。
これは、最初のpythonレッスンの1つで学んだことです。["/"、 "-"、 "|"、 "\"、 "|"]でプレイしましたが、原則は同じです:
import time
for i in reversed(range(0, 10)):
time.sleep(1)
print "%s\r" %i,
ここに私がやったものがあります:
import time
a = input("How long is the countdown?")
while a != 0:
print a
time.sleep(1)
a = a-1
最後に、あなたと他の人なら、アラームか何かを置くことができます。
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)
確かに、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)