【问题标题】:python `print` does not work in looppython`print`在循环中不起作用
【发布时间】:2014-08-18 17:25:19
【问题描述】:

我有多个循环在一起,并在最内部的循环中睡眠。例如:

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 休眠 1 秒和另一个 D 之后获得 i 值,然后再次休眠直到结束。

但结果不同,它等待 10 秒并打印整行 0 D D D D D D . . . . 并再次等待打印下一行。

我发现打印末尾的逗号会导致此问题。我该如何解决?

【问题讨论】:

  • 你期望什么输出,它会在每次迭代中为我打印一个新行
  • 每个j 迭代?它在每个i 迭代上打印,但我需要在每个j 上打印

标签: python python-2.7


【解决方案1】:

由于逗号的存在,输出缓冲直到\n

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

定义你的打印方法:

import sys

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

并在行尾打印\n

【讨论】:

  • 它对我不起作用,我尝试刷新输出但没有任何反应
【解决方案2】:

使用print <something>, 的问题是只有在结果 id 准备好打印时才缓冲和打印。

您可以使用 __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('')

【讨论】:

  • 您仍然需要sys.stdout.flush() 才能使它看起来像是在增量打印。如果使用 Python 3.3+,也可以提供 flush=True 进行打印。
  • @JonClements 谢谢我不知道,因为它在 python 2.7.5 中没有刷新就可以正常工作
  • sys.stdout 进行缓冲。将print() 用作函数不会改变缓冲行为,但您可以在较新的Python 版本中使用flush=True 来强制刷新。在 flush 参数不可用的版本(如 Python 2)上使用 sys.stdout.flush()
【解决方案3】:

我建议在导入后使用下面的 coe 覆盖 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-09
    • 2015-05-24
    相关资源
    最近更新 更多