Урок 17 из 84 · Основы Python

List comprehension

В русской терминологии нет общепризнанного перевода list comprehension. Гугл его переводит как списковое включение или абстракция списков. Хотя наиболее часто можно встретить фразу генератор списков, но мне кажется это не совсем правильно, так как в Python есть отдельное понятие генератора. По моему, возможно наиболее подходящий перевод был бы представление списков.

Одной из самых отличительных особенностей языка является list comprehension (представление списков), которое можно использовать для создания мощных функций в одной строке кода. Однако многие разработчики постоянно пытаются полностью использовать более продвинутые функции list comprehension. Некоторые программисты даже используют их слишком часто, что может привести к тому, что код станет менее эффективным и сложным для чтения

Допустим на надо создать список цифр, то эти шаги будут в трех строках кода:

nums = []
for n in range(10):
        nums.append(n)

print(nums)

Output:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

эту же логику мы можем сделать в одну строчку:

nums = [n for n in range(10)]
print(nums)


Output:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Что важно знать:

print(type(i for i in range(10)))

Output:
<class 'generator'>

Получается, что под капотом это объект генератора (в питоне все является объектом)

nums = [n for n in range(10)]

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

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

Сейчас, пока принимайте генераторы как списки по которому можно пробежаться только один раз. Обычные генераторы создаются с помощью круглых скобок. Не путайте с кортежами

nums = (i for i in range(10))
print(nums)

Output:
<generator object <genexpr> at 0x7fbad6fe4c80>

если мы пробежимся по генератору то получим

for n in nums:
        print(n)

Output:
0
1
2
3
4
5
6
7
8
9

если же мы еще раз пробежимся по нему, то ничего не получим. Так как генераторы хранят значения только 1 раз.

for n in nums:
        print(n)

Output:

Генераторы расходуют намного меньше памяти

>>> import sys
>>> g = (i * 2 for i in range(1000) if i % 3 == 0 or i % 5 == 0)
>>> print(sys.getsizeof(g))
112
>>> l = [i * 2 for i in range(1000) if i % 3 == 0 or i % 5 == 0]
>>> print(sys.getsizeof(l))
4264

Теперь вернемся к list comprehensions

list comprehension может применяться и с условиями как вы уже выше прочитали

Например:

nums = [i for i in range(10) if i % 2 == 0]
print(nums)

Output:
[0, 2, 4, 6, 8]
Отзыв