Comprehensions в Python: распаковка * и ** внутри (PEP 798)
Генераторы списков, словарей, множеств и генераторные выражения. Для опытных: новая распаковка внутри comprehension в 3.15 вместо двойного for и цепочек слияния словарей.
- Заменять циклы comprehension там, где это читаемо
- Экономить память генераторами
- Склеивать вложенные списки и словари новой распаковкой
Inizio della lezione
Двойной for, который все пишут задом наперёд
- Склейка вложенных списков: [x for g in groups for x in g]
- Порядок for — как во вложенных циклах, сверху вниз
- В 3.15: [*g for g in groups]
Спросите опытного разработчика, как одной строкой склеить список списков. Он напишет квадратные скобки с двумя for внутри — и почти наверняка сначала перепутает их порядок. Эта запись настолько неочевидна, что её годами копируют со Stack Overflow, не пытаясь понять. В Python 3.15 появился способ проще: звёздочка прямо внутри генератора списка. Сегодня разберём, как устроены такие выражения с нуля, а в конце — эту новинку.
weeks = [[250, 120], [300], [99, 450]]
# было: двойной for, порядок легко перепутать
flat = [a for week in weeks for a in week]
# стало в Python 3.15 (PEP 798)
flat = [*week for week in weeks]
print(flat)
Из пяти строк в одну: list comprehension
- Схема: [выражение for x in коллекция]
- Результат — новый список, исходный не меняется
- Читается слева направо: «что» → «откуда»
Начнём с самого частого случая. Есть список сумм, нужно получить список тех же сумм с наценкой двадцать процентов. Классический путь: завести пустой список, пройти циклом, добавить каждый результат. Четыре строки ради простой мысли. Comprehension записывает ту же мысль одной строкой: в квадратных скобках сначала говорим, что хотим получить, а потом — откуда берём. Читается почти как фраза: «сумма на один и два для каждой суммы из списка».
amounts = [250, 1200, 99, 450]
# классический цикл
with_vat = []
for a in amounts:
with_vat.append(a * 1.2)
# то же самое — comprehension
with_vat = [a * 1.2 for a in amounts]
print(with_vat)
Фильтр в конце, выбор в начале
- Фильтр: [a for a in xs if a > 200] — if в конце
- Выбор значения: [x if усл else y for a in xs] — в начале
- Можно и то и другое сразу
Comprehension умеет отбирать элементы. Дописали в конце if с условием — и в результат попадут только подходящие суммы, например больше двухсот. А если нужно не выбросить элемент, а превратить его в одно из двух значений, условие ставится в начало, в виде «это, если так, иначе то». Новички путают эти два места постоянно. Запомните просто: условие в конце — фильтр, условие в начале — выбор, что положить.
amounts = [250, 1200, 99, 450]
big = [a for a in amounts if a > 200] # фильтр
labels = ["крупная" if a > 1000 else "обычная" # выбор
for a in amounts]
print(big)
print(labels)
La lezione completa è disponibile con l'abbonamento
10 altre slide nella versione completa.
Video, tutte le slide, appunti, test, tutor AI e intervista si sbloccano dopo l'accesso e l'abbonamento.
Accedi o registrati Attiva l'abbonamentoContenuti della lezione
- Двойной for, который все пишут задом наперёд
- Из пяти строк в одну: list comprehension
- Фильтр в конце, выбор в начале
- Словари и множества тем же способом
- Генераторное выражение: не хранить, а выдавать
- Генератор внутри sum, any, max
- Грабли: comprehension на три этажа
- ❓ Стоп-проверка: чему равен x после comprehension?
- 💡 Разбор: у comprehension своя область видимости
- Что нового: * и ** внутри comprehension (3.15, PEP 798)
- Слияние словарей: {**layer for layer in layers}
- Грабли новой распаковки: тернарник без скобок
- Итог: подсчёт трат в три строки
Tutte le lezioni del corso
- Python 3.15 с нуля и для опытных: что нового и как учить
- Python 3.15: установка, REPL и первый скрипт за десять минут
- Переменные, числа и строки в Python: f-строки и t-строки
- Условия, циклы и match/case в Python: управляем ходом программы
- Списки, кортежи, словари и множества: frozendict в Python 3.15
- Comprehensions в Python: распаковка * и ** внутри (PEP 798)
- Функции и аннотации типов в Python: от def до sentinel
- Ошибки и исключения в Python 3.15: читаем трейсбек и подсказки «Did you mean»
- Модули, пакеты и ленивые импорты в Python 3.15 (PEP 810)
- Файлы, JSON и CSV в Python: pathlib и UTF-8 по умолчанию
- Классы и dataclasses в Python: ООП без лишнего кода
- Асинхронность и потоки в Python: asyncio, TaskGroup и free-threading
- Профилирование Python 3.15: Tachyon вместо cProfile и итоговый проект