Comprehensions в Python: распаковка * и ** внутри (PEP 798)
Генераторы списков, словарей, множеств и генераторные выражения. Для опытных: новая распаковка внутри comprehension в 3.15 вместо двойного for и цепочек слияния словарей.
- Заменять циклы comprehension там, где это читаемо
- Экономить память генераторами
- Склеивать вложенные списки и словари новой распаковкой
بداية الدرس
Двойной 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)
الدرس الكامل متاح بالاشتراك
و10 شريحة أخرى في النسخة الكاملة.
تُفتح الفيديو وجميع الشرائح والملاحظات والاختبارات والمرشد الذكي والمقابلة بعد تسجيل الدخول والاشتراك.
تسجيل الدخول أو إنشاء حساب الاشتراك الآنمحتوى الدرس
- Двойной for, который все пишут задом наперёд
- Из пяти строк в одну: list comprehension
- Фильтр в конце, выбор в начале
- Словари и множества тем же способом
- Генераторное выражение: не хранить, а выдавать
- Генератор внутри sum, any, max
- Грабли: comprehension на три этажа
- ❓ Стоп-проверка: чему равен x после comprehension?
- 💡 Разбор: у comprehension своя область видимости
- Что нового: * и ** внутри comprehension (3.15, PEP 798)
- Слияние словарей: {**layer for layer in layers}
- Грабли новой распаковки: тернарник без скобок
- Итог: подсчёт трат в три строки
مقالات حول هذا الدرس
- المولّدات في Python: yield والمكرّرات ومولّدات القوائم والقواميس
- كيفية تحميل Python وتثبيته على Windows وmacOS وLinux: خطوات بالتفصيل
- النصوص في Python: split وreplace وstrip وjoin والشرائح وf-strings
- الوحدات والحزم في Python: import وpip وvenv والمكتبات بكلمات بسيطة
- كيف تتعلم Python من الصفر: خطة تعلم للمبتدئين خطوة بخطوة
جميع دروس هذه الدورة
- 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 и итоговый проект