假设我有一部分代码运行了一段特定的时间,每1秒输出如下内容:iteration X, score Y
。我将用我的黑匣子功能代替这个功能:
from random import uniform
import time
def black_box():
i = 1
while True:
print 'Iteration', i, 'Score:', uniform(0, 1)
time.sleep(1)
i += 1
现在,当我在Jupyter notebook中运行它时,它会在每秒后输出一个新行:
Iteration 1 Score: 0.664167449844
Iteration 2 Score: 0.514757592404
...
是的,在输出变得太大之后,html变得可滚动,但问题是除了当前最后一行之外我不需要任何这些行。因此,我希望n
秒之后不再使用n
行,而是只显示1
行(最后一行)。
我没有在文档中找到这样的东西或者通过魔术找到它。 A question标题几乎相同但不相关。
答案 0 :(得分:27)
@cel是对的:ipython notebook clear cell output in code
使用clear_output()会使您的笔记本电脑感到紧张。我建议使用display()函数,如下所示(Python 2.7):
from random import uniform
import time
from IPython.display import display, clear_output
def black_box():
i = 1
while True:
clear_output(wait=True)
display('Iteration '+str(i)+' Score: '+str(uniform(0, 1)))
time.sleep(1)
i += 1
答案 1 :(得分:13)
通常(记录)的方式来执行您所描述的(仅适用于Python 3):
print('Iteration', i, 'Score:', uniform(0, 1), end='\r')
在Python 2中,我们必须在打印后sys.stdout.flush()
,如answer所示:
print('Iteration', i, 'Score:', uniform(0, 1), end='\r')
sys.stdout.flush()
使用IPython笔记本我必须连接字符串才能使它工作:
print('Iteration ' + str(i) + ', Score: ' + str(uniform(0, 1)), end='\r')
最后,为了让它与Jupyter一起使用,我使用了这个:
print('\r', 'Iteration', i, 'Score:', uniform(0, 1), end='')
或者你可以在print
之前和之后拆分time.sleep
,如果它更有意义,或者你需要更明确:
print('Iteration', i, 'Score:', uniform(0, 1), end='')
time.sleep(1)
print('', end='\r') # or even print('\r', end='')