Подробнее о списках: продолжение
Посмотрите на пример в редакторе.
Компактность и элегантность - эти два слова приходят на ум при взгляде на код.
Итак, что у них общего, генераторы и списки? Есть ли какая-то связь между ними? Да. Довольно слабая связь, но однозначная.
Одно изменение может превратить его в генератор.
Теперь посмотрите на приведенный ниже код и посмотрите, сможете ли Вы найти детали, которые превращают генерирование списка в генератор:
the_list = [1 if x % 2 == 0 else 0 for x in range(10)]
the_generator = (1 if x % 2 == 0 else 0 for x in range(10))
for v in the_list:
print(v, end=" ")
print()
for v in the_generator:
print(v, end=" ")
print()
Это круглые скобки. Квадратные скобки создают генерирование, круглые - генератор.
Код, однако, при запуске выдает две одинаковые строки:
1 0 1 0 1 0 1 0 1 0
1 0 1 0 1 0 1 0 1 0
output
Как узнать, что второй вывод создает генератор, а не список?
Есть некоторые доказательства, которые мы можем Вам показать. Вызовите функцию len()
для обоих этих объектов.
len(lst)
оценивается как 10
. Ясно и предсказуемо. len(genr)
вызовет исключение, и Вы увидите следующее сообщение:
TypeError: object of type 'generator' has no len()
output
Конечно, сохранять список или генератор не обязательно - Вы можете создать их именно там, где они Вам нужны - как в примере ниже:
for v in [1 if x % 2 == 0 else 0 for x in range(10)]:
print(v, end=" ")
print()
for v in (1 if x % 2 == 0 else 0 for x in range(10)):
print(v, end=" ")
print()
Примечание: один и тот же внешний вид вывода не означает, что оба цикла работают одинаково. В первом цикле список создается (и повторяется) целиком - он действительно существует во время выполнения цикла.
Во втором цикле список вообще отсутствует - есть только последующие значения, создаваемые генератором, одно за другим.
Проведите свои собственные эксперименты.