Отображение обратного отсчета для функции сна python
Я использую время.сон(10) в моей программе. Может ли отображать обратный отсчет в оболочке при запуске программы?
>>>run_my_program()
tasks done, now sleeping for 10 seconds
и затем я хочу, чтобы он сделал 10,9,8,7....
это возможно?
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
и ,
будет держать печать в одной строке (избегая одной строки для каждого значения обратного отсчета)
по мере уменьшения количества секунд 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")
это записывает над предыдущей строкой на каждом цикле.
конечно, просто напишите цикл, который печатает 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 time
x = input("How long is the countdown?")
while a != 0:
print x
time.sleep(1)
в конце, если вы и еще вы можете поставить будильник или что-то еще.
Это то, что я узнал на одном из моих первых уроков python, с которым мы играли ["/","-","|","\","|"] но принцип тот же:
import time
for i in reversed(range(0, 10)):
time.sleep(1)
print "%s\r" %i,
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)