当前位置: 首页 > 面试题库 >

为什么在循环使用睡眠时Python中的打印不会暂停?

章城
2023-03-14
问题内容

这段代码:

import time
for i in range(10):
    print(i)
    time.sleep(.5)

使我的计算机挂起5秒钟,然后打印出0-9,而不是每半秒打印一次数字。难道我做错了什么?


问题答案:

print,默认情况下,在内部打印到sys.stdout并缓冲要打印的输出。

通常是否由文件确定输出是否被缓冲,但是如果flush关键字参数为true,则将强制刷新流。

在版本3.3中更改:添加了flush关键字参数。

报价sys.stdout文件,

交互式时,标准流是行缓冲的。否则,它们像常规文本文件一样被块缓冲。

因此,就您而言,您需要像这样显式刷新

import time
for i in range(10):
    print(i, flush=True)
    time.sleep(.5)

好的,这种缓冲存在很多困惑。让我尽可能多地解释。

首先,如果您在终端中尝试此程序,则默认情况下它们会进行 行缓冲
(这基本上意味着,每当遇到换行符时,都将缓冲的数据发送到stdout)。因此,您可以像这样在Python 2.7中重现此问题

>>> import time
>>> for i in range(10):
...     print i,
...     time.sleep(.5)
...

在Python 3.x中

>>> for i in range(10):
...     print(i, end='')
...     time.sleep(.5)

我们通过end=''是因为,默认end\n,按照该print的文档,

print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)

由于默认设置end中断了行缓冲,因此数据将立即发送到stdout

重现此问题的另一种方法是将OP给出的实际程序存储在文件中,并使用Python 3.x解释器执行,您将看到stdout内部在缓冲数据并等待程序完成打印。



 类似资料:
  • 我正在写一份简单的银行申请书。在我的程序中,我使用了while循环。如果用户输入错误,它将再次提示用户输入。 现在的问题是我无法编写任何语句。它总是显示错误(比如:unreachable语句),最终该行不会被打印出来。 我该怎么解决这个问题? [我之所以需要使用,是因为我想打印用户输入的所有信息。] 我正在从事的项目:

  • 在我的程序中,我发现当为时,循环无法正确退出。它看起来像整数溢出,远远大于10,循环不会停止。请告诉我发生了什么,以及如何在大型项目中避免这个错误。 代码链接

  • 很多次我看到在一些示例解决方案中,如果它说每秒停止线程,创建者在run方法中做了这样的事情: 所以在一个无限执行的while循环中。否则,我也看到了这一点: 为什么有时他们把睡眠方法放在一个循环中,而有时不放在一个循环中? 在一些解决方案中,代码的创建者将睡眠放在循环中,然后我删除了循环,代码停止工作。在其他不在循环中的情况下,我将其放入循环中,代码会导致错误。。。。为什么? 我怎么知道什么时候必

  • 问题内容: 我一直在使用“ if”来测试自己的版本,并且一切似乎都正常。当然,如果使用signalAll()而不是signal(),这将导致严重崩溃,但是如果一次仅通知一个线程,这怎么会出错? 他们的代码在这里 -检查put()和take()方法;在Condition的JavaDoc顶部可以看到一个更简单,更重点的实现。 下面是我实施的相关部分。 PS我知道,通常,尤其是在这样的lib类中,应该让

  • 问题内容: 我可以使用分号在Python中加入行,例如 但是为什么我不能这样做 问题答案: 简短的(至今有效的)答案只是“因为未定义语言语法以允许它”。至于为什么 这是 的话,就很难,如果除非你问任何人与语法的部分来了,但我想这是由于可读性,这是Python的目标之一并非不可能,以确保1。 你为什么要写像这样晦涩难懂的东西?只需将其分成多行: 我认为这种变体要清晰得多。 1自: 可读性计数。

  • 所以我有这个代码,叫我白痴哈哈,但是我不能让它打印7。 代码: 我需要知道如何改变与函数中的参数同名的变量。 任何帮助都将不胜感激,如果你不明白这个问题,我很乐意解释更多。