在Jupyter Notebook中,运行以下Python代码时,将打印2到9的数字,一个接一个。 导入时间
for i in range(1,10):
time.sleep(1)
sys.stderr.write('\r %d' % i)
sys.stderr.flush()
问题1:为什么不打印1?
问题2:为什么数字一个接一个地打印,我的意思是,当打印较大的数字时,立即较小的数字消失了(真棒)? 为什么{{1} }以这种方式工作,但是 sys.stderr.write('\r %d' % i)
以“正常”的方式工作,显示所有数字?
在Linux终端中运行上述确切代码时。输出再次不同:
sys.stderr.write('%d \r' % i)
如果将行 13
23
33
43
53
63
73
83
93
更改为sys.stderr.write('\r %d' % i)
,输出将变为:
sys.stderr.write('%d \r' % i)
这太奇怪了。
问题3:为什么在Linux终端上运行上述代码会有不同的输出?
答案 0 :(得分:0)
问题1:为什么不打印1个?
它确实打印了。尝试更长的睡眠。
Q2:为什么数字一个接一个地打印,我的意思是,当打印一个较大的数字时,立即较小的数字消失了(真棒)?
这是因为您使用的是回车符\r
而不是换行符\n
,换行符会将光标返回到行的开头,而不是将其前进到下一行。您还可以使用退格\b
在终端中覆盖内容,将光标移回一个空格。
Q3:为什么在Linux终端上运行上述代码会有不同的输出?
我不确定您指的是哪个终端。某些终端不支持覆盖,因此刷新的顺序可能会影响输出。
另外,请查看write
方法上的文档字符串,
idlelib.run.PseudoOutputFile实例的write方法 将字符串写入流。 返回写入的字符数(始终等于 字符串的长度)。
它返回您传入的字符串的长度。在Python Shell(REPL)中,所有返回值在函数返回后得到打印。在空闲的地方尝试一下,其中stdin和stderr以不同的颜色打印:
>>> sys.stderr.write('x')
但是看看如果在终端中运行它会发生什么情况,
>>> sys.stdout.write('abc\r')
4bc
首先打印abc
,然后将光标返回到行首。然后返回4
,因为字符串的长度为len 4,所以Python的REPL在光标的当前位置打印该字符,从而覆盖a
。