Вам нужно взять копию списка и сначала перебрать его, либо итерация завершится неудачно, что может быть неожиданным.
Например (зависит от типа списка):
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
[]
В 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
Ошибка отсутствует. Я думаю, вы просто пытаетесь распечатать список. Используйте []
, чтобы получить список вместо генератора:
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')