& lt; генераторный объект & lt; ген xpr & gt; при 0x11ad5dbf8 & gt; вместо словных стеблей? [Дубликат]

Вам нужно взять копию списка и сначала перебрать его, либо итерация завершится неудачно, что может быть неожиданным.

Например (зависит от типа списка):

for tup in somelist[:]:
    etc....

Пример:

>>> somelist = range(10)
>>> for x in somelist:
...     somelist.remove(x)
>>> somelist
[1, 3, 5, 7, 9]

>>> somelist = range(10)
>>> for x in somelist[:]:
...     somelist.remove(x)
>>> somelist
[]
-2
задан Martijn Pieters 9 May 2014 в 14:57
поделиться

2 ответа

В Python 3 print () - это функция, а не оператор.

Выражение генератора похоже на понимание списка, за исключением того, что создает объект, который дает результаты , когда вы перебираете его , а не когда вы его создаете. Например,

[i*i for i in range(5)]

создает список [0, 1, 4, 9, 16], а

(i*i for i in range(5))

создает объект-генератор, который будет генерировать эти числа, когда вы перебираете его.

Если вы даете функцию только одному аргументу и это выражение генератора, вы можете опустить скобки вокруг выражения генератора, поэтому вам не нужно делать myfunc ((i + 1 для i в чем-то)).

Итак, вы создаете объект-генератор и передаете его функции print (), которая печатает его представление. Это делает именно то, о чем вы просили, а не то, что вы хотели спросить.

Вы можете инициализировать список из выражения генератора:

print(list(i*i for i in range(5)))

, но его проще в использовании понимание списка:

print([i*i for i in range(5)])

Простым примером того, как вы можете использовать объект-генератор, является:

for value in (i * i for i in range(5)):
    print value

, хотя в этом простом примере, очевидно, было бы легче написать:

for i in range(5):
    print i * i
8
ответ дан musicinmybrain 25 August 2018 в 15:34
поделиться

Ошибка отсутствует. Я думаю, вы просто пытаетесь распечатать список. Используйте [], чтобы получить список вместо генератора:

if __name__ == '__main__':
    print([i*i for i in range(5)])

Выход:

[0, 1, 4, 9, 16]

Для печати на отдельных строках вы должны:

if __name__ == '__main__':
    print('\n'.join([str(i*i) for i in range(5)]))

Используется подход 'delimiter'.join(list) для объединения всех элементов списка с указанным разделителем (в этом случае строка новой строки: \n)

Выход:

0
1
4
9
16

Или, как предложили @MartijnPieters (только для python3), вы также можете:

print(*(i*i for i in range(5)), sep='\n')
0
ответ дан sshashank124 25 August 2018 в 15:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: