Python中的`print`语句在循环中不起作用。

16

我有多个循环嵌套在一起,并且在最内层循环中使用了 sleep 函数。例如:

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

如果您运行代码,可能会期望在经过 D 秒后获得变量 i 的值,然后再经过另一个 D 秒,最后等到程序结束。

但实际结果与期望不同,它会等待 10 秒并打印整个行:0 D D D D D D . . . . ,然后再次等待以打印下一行。

我发现打印结尾处的逗号导致了这个问题。该如何解决这个问题?


你期望什么输出?对我来说,它在每次迭代时都会打印一个新行。 - Padraic Cunningham
每次j迭代?它在每次i迭代时打印,但我需要在每次j迭代时打印。 - Farhadix
3个回答

17

由于存在逗号,输出会一直缓存直到遇到\n

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

定义您的打印方法:

import sys

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

并在行末打印一个\n


2
它对我不起作用,我尝试刷新输出但没有任何反应。 - Amado Saladino

3
使用`print ,`的问题是它会进行缓冲,并且仅在准备好打印结果时才进行打印。
您可以使用`__future__`中的`print_function`来解决此问题(这也符合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('')

12
如果希望输出具有递增效果,仍需要添加 sys.stdout.flush()。如果使用 Python 3.3 及以上版本,则可以在 print 中提供 flush=True 参数来实现相同的效果。 - Jon Clements
@JonClements 谢谢,我之前不知道这一点,因为在 Python 2.7.5 中,没有 flush 也能正常工作。 - Nir Alfasi
1
sys.stdout 进行缓冲。使用 print() 作为函数不会改变缓冲行为,但您可以在较新的 Python 版本中使用 flush=True 强制刷新。在没有 flush 参数的版本上(如 Python 2),请使用 sys.stdout.flush() - Martijn Pieters

0
我建议你在导入后立即重写 print,代码如下:
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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接