python `print` 在循环中不工作

16 投票
3 回答
25568 浏览
提问于 2025-04-18 17:41

我有多个循环在一起,并且在最里面的循环里有一个睡眠(暂停)指令。比如说:

from time import sleep

for i in range(10):
    print i,
    for j in range(-5,5):
        if j > 0:
            print '.',
        else:
            print 'D',
        sleep(1)
    print ''

如果你运行这段代码,你可能会期待在每次打印 i 的时候,先暂停 1 秒,然后再打印一个 D,再暂停,直到结束。

但是结果却不一样,它等了 10 秒,然后一次性打印出整行 0 D D D D D D . . . .,接着又等着再打印下一行。

我发现打印时末尾的逗号导致了这个问题。我该怎么解决呢?

3 个回答

0

我建议在导入之后,使用下面的代码来覆盖打印功能。

import sys
def print_msg(*args,end='\n'):
    for item in args:
        sys.stdout.write(str(item)+' ')
    sys.stdout.write(end)
    sys.stdout.flush()

print = print_msg
3

使用 print <something>, 这个写法的问题在于,它会先把内容放到一个缓冲区里,只有等到准备好要打印的时候才会显示出来。

你可以通过使用 print_function 来解决这个问题,这个功能来自 __future__ 模块(它也会和 Python 3 兼容):

from __future__ import print_function
from time import sleep
import sys

for i in range(10):
    print(i, end='')
    for j in range(-5,5):
        if j > 0:
            print('.', end='')
        else:
            print('D', end='')
        sys.stdout.flush()
        sleep(1)            
    print('')
17

因为有逗号的存在,输出会一直缓冲,直到遇到一个 \n

你应该在每次打印后刷新 stdout,或者使用 sys.stdout.write 并刷新缓冲区。

定义你的打印方法:

import sys

def my_print(text):
    sys.stdout.write(str(text))
    sys.stdout.flush()

并在行末打印一个 \n

撰写回答