Попытка понять следующий генератор в Python - PullRequest
0 голосов
/ 03 сентября 2018

Я пытаюсь понять разницу между следующими двумя фрагментами кода. Второй просто печатает генератор, но первый фрагмент расширяет его и разделяет генератор. Почему это происходит? Это потому, что две квадратные скобки расширяют любой повторяемый объект?


#Code snippet 1


li=[[1,2,3],[4,5,6],[7,8,9]] 
for col in range(0,3):
    print( [row[col] for row in li] )`
Output: 
[1, 4, 7]
[2, 5, 8]
[3, 6, 9]

#Code snippet 2


li=[[1,2,3],[4,5,6],[7,8,9]]
for col in range(0,3):
    print( row[col] for row in li )

выход

<generator object <genexpr> at 0x7f1e0aef55c8>
<generator object <genexpr> at 0x7f1e0aef55c8>
<generator object <genexpr> at 0x7f1e0aef55c8>

Почему вывод двух вышеприведенных кавычек отличается?

1 Ответ

0 голосов
/ 03 сентября 2018

Функция print выводит возвращаемые значения метода __str__ объектов в своих аргументах. Для списков метод __str__ возвращает красиво отформатированную строку значений элементов, разделенных запятыми, заключенных в квадратные скобки, но для объектов генератора метод __str__ просто возвращает информацию об общем объекте, чтобы избежать изменения состояния генератора.

Помещая выражение генератора в квадратные скобки, вы используете понимание списка, чтобы явно составить список путем перебора вывода выражения генератора. Поскольку элементы уже созданы, метод списка __str__ не будет иметь проблем с возвратом их значений.

...