Проблема с print при использовании time.sleep
import time
i = 1
def anp(s):
lens = len(s)
g = 0
for i in range(lens):
print(s[g], end="")
time.sleep(0.1)
g += 1
anp('Привет')
Если запускаю в Python Shell, то программа работает корректно (выводит надпись по буквам с задержкой в 0.1 сек.). Но если запустить её же в онлайн-компиляторе или в любом другом (консоль, PyCharm и т.д.), то выводит сплошной текст без задержек между буквами. В чём ошибка, почему оно по разному работает в разных программах? Ссылка на онлайн-компилятор: https://repl.it/languages/python3
Ответы (4 шт):
Сейчас пробывал в sublime text, все работает правильно, в онлайн компиляторе сначало получается результат, а потом выводится, в pycharm и idle когда увеличил задержку на 0.5 все нормально. Возможно это из-за того что эти интерпритаторы работают быстрее обычной консоли и результат приходит моментально. Просто поставьте задержку побольше и все будет хорошо.
UPD: Сейчас погуглил разные онлайн компиляторы, и все они работают одинаково, сначало ждут результата потом выводят.
Вывод может буферизироваться (то есть сначала накапливается некоторый кусок данных, потом целиком выводится) - особенно если вывод идет в файл, но бывает что и вывод в консоль буферизируется.
Если нужно чтобы каждый символ сразу выводился, можно использовать параметр flush функции print:
print(s[g], end="", flush=True)
Или вызывать метод .flush() для файлового объекта, в который идет вывод. При выводе на консоль это sys.stdout:
import sys
...
for i in range(lens):
print(s[g], end="")
sys.stdout.flush()
time.sleep(0.1)
g += 1
Попробуйте в IPython и добавте параметр flush, чтобы сбрасывать буфер вывода в консоль, увидите, что работает. Буферизация вывода происходит на системном уровне, и если есть задержки вывода, то это не ошибка Python или вашей программы.
In [9]: import time
...: i = 1
...:
...: def anp(s):
...: lens = len(s)
...: g = 0
...: for i in range(lens):
...: print(s[g], end="", flush=True)
...: time.sleep(0.1)
...: g += 1
...:
In [10]: anp('123456789')
123456789
import time
def anp(s):
for i in range(len(s)):
print(s[i], end="", flush=True)
time.sleep(0.1)
anp('Привет')
Просто добавьте в строку кода с print "flush=True", это очистит буфер. И, да, тут вполне можно обойтись без переменных lens и g.