Module (9%)
Section (56%)

Подробнее о списках: продолжение

Посмотрите на пример в редакторе.

Компактность и элегантность - эти два слова приходят на ум при взгляде на код.

Итак, что у них общего, генераторы и списки? Есть ли какая-то связь между ними? Да. Довольно слабая связь, но однозначная.

Одно изменение может превратить его в генератор.


Теперь посмотрите на приведенный ниже код и посмотрите, сможете ли Вы найти детали, которые превращают генерирование списка в генератор:

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()

Примечание: один и тот же внешний вид вывода не означает, что оба цикла работают одинаково. В первом цикле список создается (и повторяется) целиком - он действительно существует во время выполнения цикла.

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

Проведите свои собственные эксперименты.



Code

lst = [1 if x % 2 == 0 else 0 for x in range(10)]

print(lst)
{{ dockerServerErrorMsg }} ×
{{ errorMsg }} ×
{{ successMsg }} ×