显示python睡眠函数的倒计时

显示python睡眠函数的倒计时,python,time,sleep,stopwatch,countdowntimer,Python,Time,Sleep,Stopwatch,Countdowntimer,我在程序中使用time.sleep(10)。当我运行程序时,可以在shell中显示倒计时吗 >>>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

我在程序中使用time.sleep(10)。当我运行程序时,可以在shell中显示倒计时吗

>>>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)

当然,只需编写一个循环,打印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)

您可以执行倒计时功能,如:

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
和逗号
将使打印保持在同一行(避免每个倒计时值有一行)

随着秒数的减少,pad_str将确保最后一行被空格覆盖,而不是在输出缩短时留下最后一个字符

最终打印会用一条完成消息覆盖最后一条状态消息,并增加输出行,因此有延迟的迹象。

我做了一个:

import time
a = input("How long is the countdown?")
while a != 0:
    print a
    time.sleep(1)
    a = a-1
最后,如果你和一个else,你可以发出警报或其他任何东西。

time.sleep()
如果睡眠被信号中断,可能会提前返回,或者稍后返回(取决于操作系统/解释器对其他进程/线程的调度)

为提高多次迭代的精度,避免大量迭代的漂移,可使用时钟锁定倒计时:

#!/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)

这是我在第一堂python课程中学到的东西,我们使用了[“/”、“-”、“|”、“\”、“|”]但原理是一样的:

import time

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

这是在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")

这将覆盖每个周期的前一行。

一个从控制台清除最后一个数字的简单解决方案

import time

for i in range(10,0,-1):
    print(f"{i}", end="\r", flush=True)
    time.sleep(1)
默认情况下,打印函数设置
end=“\n”
,这意味着后续打印调用将打印到新行上。您可以将其更改为
end=“\r”
,以在每次调用后替换输出()

另外,使用
flush
意味着您不必担心缓冲问题()

这就是它的样子:


这是一个亚秒精度:

    print()
    _k = 0.5  # ensure k != _k first time round (as k will be integer)
    print('Starting in ')
    while _k > 0:
        k = round(event_timestamp - time())
        if k != _k:
            print(f'\r{k} ', end='', flush=True)
            _k = k
        sleep(0.1)

    print('boom')
注意
f'\r{k}'
中的尾随空格。因此,如果我们从
100
99
10
9
则清除第二个数字

此外,它不需要导入系统


sleep(0.0003)
如果你想要毫秒精度。

谢谢你的精彩回答。相关:谢谢,这太好了。你只是犯了一个小错误,我已经改正了。时间。睡眠(i)应该是时间。睡眠(1)是的,事实上,答案是固定的。如果您得到
name错误:名称“xrange”未定义
请改用
range
。它在Python 3中被重命名。为了防止在倒计时中每秒插入新行,语句
print“%s”在接下来的%d秒%s\r%%(msg,i,pad_str),
应更改为
sys.stdout.write(“%s”在接下来的%d秒%s\r%%(msg,i,pad_str),)