Искать
Вы превысили запрос на
0 знаков

45. List/dict/set comprehensions (включения) в Python

Не пройден
0
0

Кратко

- Списковые включения позволяют создавать объекты более компактно и быстро.

- Включения часто встречаются в чужом коде и важно знать их структуру для понимания кода.

- Общая структура списковых включений содержит операцию и элемент списка.

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

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

В предыдущем уроке мы начали знакомиться с итераторами в Python. В этом уроке разберемся с list comprehensions (списковые включения). Иногда это понятие переводят как «генераторы списков», к сожалению, вводящий в путаницу, так как в Python есть понятие «генераторы».

List/dict/set comprehensions (списковые включения) предоставляют возможность создавать соответствующие объекты более компактно и быстро.

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

Списковые включения

В разделе «Структуры данных в Python» было подробно рассказано про создание списков и работу с ними. Давайте создадим список с помощью list comprehensions. Так же будем использовать f-строки из урока про форматирование строк:

Пример (python)
items = [f'Элемент {num}' for num in range(1, 10)]
items # => ['Элемент 1', 'Элемент 2', 'Элемент 3', 'Элемент 4', 'Элемент 5', 'Элемент 6', 'Элемент 7', 'Элемент 8', 'Элемент 9'] 

На первый взгляд синтаксис может показаться сложным. Сейчас разберемся. Проще всего это понять по аналогии с циклом for, который был изучен ранее и неоднократно применялся в последующих уроках. Выведем список квадратов чисел от 1 до 9 при помощи цикла for.

Пример (python)
squares = list()
for i in range(1, 10):
    squares.append(i*i)

squares # => [1, 4, 9, 16, 25, 36, 49, 64, 81] 

Теперь решим эту же задачу при помощи списковых включений:

Пример (python)
squares = [i*i for i in range(1, 10)]
squares # => [1, 4, 9, 16, 25, 36, 49, 64, 81] 

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

Пример (python)
НОВЫЙ_СПИСОК = [ОПЕРАЦИЯ for ЭЛЕМЕНТ_СПИСКА in СПИСОК] 

Под «ОПЕРАЦИЕЙ» понимается некое действие, которое будет применяться к «ЭЛЕМЕНТУ СПИСКА». Под «ЭЛЕМЕНТОМ СПИСКА» подразумевается отдельный элемент из «СПИСКА». Результатом является «НОВЫЙ СПИСОК».

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

Пример (python)
НОВЫЙ_СПИСОК = [ОПЕРАЦИЯ for ЭЛЕМЕНТ_СПИСКА in СПИСОК if УСЛОВИЕ] 

Например, найдем квадраты чисел, которые кратны трем:

Пример (python)
squares = [i*i for i in range(1, 10) if i % 3 == 0]
squares # => [9, 36, 81] 

Так же условие может быть добавлено перед циклом for. В этом случае мы будем управлять выполняемой операцией. Например, создадим все тот же список квадратов, но только будем возводить в квадрат четные числа, а остальные добавлять в исходном состоянии.

Пример (python)
squares = [i*i if (i % 2 == 0) else i for i in range(1, 10)]
squares # => [1, 4, 3, 16, 5, 36, 7, 64, 9] 

Перейдем к словарным включениям.

Словарные включения

Словарные включения задаются в фигурных скобках (если подзабыли словари, то вернитесь к урокам раздела «Структуры данных в Python», начиная с урока Словари в Python). Их создание аналогично списковым включениям:

Пример (python)
squares = {i: i*i for i in range(1, 10)}
squares # => {1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81} 

Обратите внимание на двоеточие, которое отделяет ключ от значения словаря.

Создание множество при помощи включений

В структуре ничего не меняется, кроме скобок, которые должны быть фигурными, так как мы создаем множество (про множества говорили начиная с урока Множества в Python):

Пример (python)
squares = {i*i for i in [1, 1, 1, 2, 2, 3, 3, 5]}
squares # => {1, 4, 9, 25} 

Вложенные включения

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

Пример (python)
matrix = [[1, 2, 3], [1, 2, 3], [1, 2, 3]]
squares = [[item ** 2 for item in row] for row in matrix]
squares # => [[1, 4, 9], [1, 4, 9], [1, 4, 9]] 

Или, например, сгенерировать список уникальных элементов матрицы:

Пример (python)
matrix = [[1, 2, 3], [1, 2, 3], [1, 2, 3]]
squares = {item for row in matrix for item in row}
squares # => {1, 2, 3} 

Только не стоит злоупотреблять такими вложениями. Они значительно затрудняют чтение кода. Используйте их только при необходимости.

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

Тест

Две секундочки...

Похожие уроки Codebra

@codebra_official
Подписывайся на наш Telegram-канал!
Новости, полезный материал,
программирование и ИБ
Генераторы и оператор yield в PythonЗнакомство с Python
Введение в раздел «Структуры данных в Python»Знакомство с Python
Погружение в PythonЗнакомство с Python
Обработка исключений (try/except) в PythonЗнакомство с Python
Итоги раздела «Структуры данных в Python»Знакомство с Python
Работа с файлами в PythonЗнакомство с Python
Пользовательские функции в PHPКурс по PHP
Методы и особенности множеств в PythonЗнакомство с Python
Функциональное программирование (map, filter и reduce)Знакомство с Python
Впервые на сайте Codebra?

Извините за это всплывающее окно, меня они тоже раздражают.

Образовательный ресурс codebra.ru полностью посвящен программированию и компьютерной безопасности. Все курсы и уроки находятся на главной странице. Ради интереса можете посмотреть на содержимое курсов по Пентесту Active Directory, Python, HTML и CSS, JavaScript, C++ и другие, размещенные на главной странице.

Если что-то не нашли, то воспользуйтесь поиском по сайту, который находится на главной странице в самом верху.

Удачи в обучении!

Закрыть окно