为什么IPython笔记本只从这段代码中输出一个DIV?

时间:2014-02-20 20:00:28

标签: python ipython-notebook

在IPython笔记本中,我在单元格中输入了这段代码:

from IPython.display import HTML
HTML("""<div>One</div>""")
HTML("""<div>Two</div>""")

为什么输出单元格只包含第二个div?

EDIT。 @Dunno已经展示了如何将所有html放入一个HTML()并且两个元素都被渲染,但我仍然不明白发生了什么。这是一个更一般的案例:

当我在输入单元格中输入它时:

1
2
3

输出

3

但如果我输入以下内容:

print 1
print 2
print 3

然后我得到了这个输出:

1
2
3

有什么区别?当我不使用print语句时,IPython笔记本仅评估最后一个语句吗?或者每个后续评估都会覆盖前一个评估?

2 个答案:

答案 0 :(得分:6)

是的,我发现了一些documentationHTML实际上是一个类,而不是一个函数。

所以正确的代码是

from IPython.display import HTML
myhtml = HTML("""<div>One</div><div>Two</div>""") #make the html object
myhtml #display it

现在你的代码只显示一个div是有道理的。

要显示多个部分,请创建多个变量,包含html,然后在一次HTML调用中将它们连接起来。

div1 = """<div>One</div>"""
div2 = """<div>Two</div>"""
myhtml = HTML(div1 + div2)
myhtml

修改

I opened a ticket在ipython的github配置文件中查看它是否是一个只显示最后一行语句的错误或功能。事实证明,这是计划行为:

引用Thomas Kluyver:

  

这是故意的,因为如果你在for循环中调用返回值的东西:

for line in lines:
    f.write(line)  # Returns number of bytes written
     

您可能不希望在输出中看到所有这些数字。

     

IPython中的规则是:如果代码中的最后一个语句是表达式,我们将显示其&gt;值。 1; 2是一对语句,而1,2是一个语句,因此两个值都将>显示。

     

我希望稍微解释一下。我们很高兴重新审视这样的决定,但多年来一直都是这样,我认为没有人对它有任何疑问。

答案 1 :(得分:2)

只是@Denno答案的一小部分补充:如果你想从一个单元格中显示多个IPython.display.DisplayObject个对象(包括HTML个对象,还有图像等),你可以使用{{ 1}}功能。

例如,你可以这样做:

IPython.display.display

Output of the above code