Генераторы коллекций в Python — обобщенное название для генераторов списков, множеств и словарей. В сообществе программистов их также называют списковыми, множественными и словарными включениями. Рассмотрим их на примере генераторов списков.
Генераторы списков
Генератор списков — компактный способ создания списка из существующего объекта. Синтаксис использует квадратные скобки [], внутри которых указывается:
- Финальное выражение: Элемент, которым заполняется новый список.
- Цикл for: Перебирает элементы исходной коллекции (любого итерируемого объекта: диапазон чисел, файл, строка, другой список и т.д.).
- Условие if (необязательно): Фильтрует элементы, добавляемые в новый список.
Пример создания списка четных чисел от 0 до 9:
[x for x in range(10) if x % 2 == 0]
Задача: список чисел, кратных 5
Создадим список чисел от 1 до 20, кратных 5. Без генератора списка:
numbers = []
for i in range(1, 21):
if i % 5 == 0:
numbers.append(i)
print(numbers)
С генератором списка:
numbers = [a for a in range(1, 21) if a % 5 == 0]
print(numbers)
Обратите внимание на компактность. Однако, не стоит злоупотреблять генераторами в ущерб читаемости.
Преимущества
- Компактность: Создание списков в одной строке.
- Производительность: Как правило, на 10% быстрее, чем создание списков с помощью цикла for.
Сумма кубов чисел, кратных 5
Найдем сумму кубов чисел от 1 до 20, кратных 5:
sum([a**3 for a in range(1, 21) if a % 5 == 0])
Код вычисляет сумму в одной строке, без создания промежуточного списка.
Вложенные циклы
Генераторы списков поддерживают вложенные циклы. Пример создания списка кортежей:
list_of_tuples = [(i, j) for i in range(1, 21) for j in range(1, 51)]
print(list_of_tuples)
Условные выражения if-else
В генераторах списков можно использовать условные выражения if-else:
numbers = [i**2 if i > 0 else i**3 for i in range(-10, 11) if i % 2 == 0]
print(numbers)
Здесь перебираются четные числа из диапазона от -10 до 10. Для каждого вычисляется квадрат (если число положительное) или куб (если отрицательное).
Порядок выполнения:
- Проход по коллекции.
- Проверка условия if i % 2 == 0 (фильтрация).
- Выполнение условного выражения if-else.
Можно комбинировать if-else и дополнительный фильтр. Для сложных генераторов используйте переносы строк для повышения читаемости.
Генераторы множеств и словарей
Генераторы множеств и словарей работают аналогично генераторам списков, но используют фигурные скобки {}. Множества не хранят дубликаты элементов. Словари содержат пары ключ-значение, где ключи должны быть уникальными.
Пример генератора множества:
my_set = {i for i in [10, -20, 10, -20]}
print(my_set)
Пример генератора словаря:
my_dict = {i: i**10 for i in [10, -20, 10, -20]}
print(my_dict)
Генераторы списков, множеств и словарей — мощный инструмент Python, позволяющий создавать коллекции данных компактно и эффективно. При выборе между генераторами и циклами for приоритет отдавайте читаемости кода. Производительность генераторов, как правило, выше, но незначительно.