Многие знают о list, set и dict comprehensions. Но что, если вам нужен tuple comprehension или frozenset comprehension? В синтаксисе Python их не существует, но мы можем их имитировать.
Главный секрет: Генераторные выражения
Генераторные выражения (generator expressions) — это «строительные блоки», которые позволяют создавать итерируемые объекты на лету без выделения памяти под весь список.
Как это работает:
Если передать генераторное выражение в функцию как единственный аргумент, лишние скобки можно опустить:
# Вместо этого:
all((n > 1 for n in numbers))
# Пишем так:
all(n > 1 for n in numbers)
🛠 Примеры «кастомных» включений
1. Tuple Comprehension
Формально его нет, но передача генератора в конструктор tuple() дает тот же результат:
>>> numbers = [2, 1, 3, 4, 7]
>>> tuple(n**2 for n in numbers)
(4, 1, 9, 16, 49)
2. Frozenset Comprehension
Если вам нужен неизменяемый (immutable) сет:
>>> word_fset = frozenset(w.lower() for w in ["Apple", "Orange", "Apple"])
frozenset({'apple', 'orange'})
3. Counter Comprehension
Класс Counter из модуля collections идеально сочетается с генераторами для быстрого подсчета объектов:
from collections import Counter
words = Counter(w.strip() for w in text.split())
📉 Агрегация через Reducer-функции
Генераторные выражения отлично работают с функциями, которые «сворачивают» (reduce) итерируемый объект в одно значение:
— sum(n**2 for n in numbers) — сумма квадратов.
— "".join(str(n) for n in numbers) — конкатенация строк.
— math.prod(n for n in numbers) — произведение элементов.
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека питониста
#буст
