2014-02-20 3 views
2

В вход IPython ноутбук I этот код в ячейке:Почему ноутбук IPython выводит только один DIV из этого кода?

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 

В чем разница? Является ли IPython-ноутбук только оценкой последнего оператора, когда я не использую операторы print? Или каждая последующая оценка перезаписывает предыдущую?

+0

Я думаю, вы должны использовать один вызов к 'функции HTML' (т.е.' HTML ("" "

One
Two
""") ', но я могу ошибаться – Dunno

+0

Я отредактировал свой ответ ниже, чтобы ответить на ваш следующий вопрос. – Dunno

ответ

6

Да, я нашел здесь documentation, а HTML на самом деле класс, а не функция.

Так правильный код будет

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 

Edit:

I opened a ticket на профиле GitHub IPython, чтобы увидеть, если это ошибка или функция, которая отображается только последняя строка отчетности. Оказывается, это планируется поведение:

процитировать Томаса Клюйвер:

Это намеренное, потому что, если вы звоните что-то в цикле, который возвращает значение:

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

Вы, наверное, не хотят видеть все эти числа на выходе.

Правило в IPython: если последний оператор в вашем коде является выражением, мы отображаем его значение>. 1; 2 - пара операторов, тогда как 1,2 - это один оператор, поэтому оба значения будут отображаться.

Я надеюсь, что это немного объяснит.Мы рады вернуться к таким решениям, но это было так много лет, и я не думаю, что кто-то с этим справился.

+0

Отличная работа @Dunno - спасибо за то, что вы искали ответ. И Томас дал очень хороший пример, чтобы объяснить поведение, которое сейчас имеет смысл для меня. – TrevorJ

2

Просто небольшое дополнение к @ ответ Незнайка: если вы хотите, чтобы отобразить несколько IPython.display.DisplayObject объектов (это включает в себя HTML объектов, но и изображения и т.д.) из одной ячейки, вы можете использовать функцию IPython.display.display.

Например, вы можете сделать:

from IPython.display import HTML, Image, display 
display(HTML("""<div>One</div>""")) 
display(HTML("""<div>Two</div>""")) 
display(Image("http://cdn.sstatic.net/stackoverflow/company/img/logos/so/so-logo.png?v=9c558ec15d8a", format="png")) 

Output of the above code

Смежные вопросы