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개의 슬라이드가 더 있습니다.
로그인하고 구독하면 영상, 모든 슬라이드, 노트, 테스트, AI 튜터, 면접을 이용할 수 있습니다.
로그인 또는 회원가입 구독하기강의 목차
- Двойной for, который все пишут задом наперёд
- Из пяти строк в одну: list comprehension
- Фильтр в конце, выбор в начале
- Словари и множества тем же способом
- Генераторное выражение: не хранить, а выдавать
- Генератор внутри sum, any, max
- Грабли: comprehension на три этажа
- ❓ Стоп-проверка: чему равен x после comprehension?
- 💡 Разбор: у comprehension своя область видимости
- Что нового: * и ** внутри comprehension (3.15, PEP 798)
- Слияние словарей: {**layer for layer in layers}
- Грабли новой распаковки: тернарник без скобок
- Итог: подсчёт трат в три строки
이 강의 관련 글
- 파이썬 제너레이터: yield, 이터레이터, 리스트와 딕셔너리 컴프리헨션
- 파이썬 설치 방법: Windows, macOS, Linux에서 단계별로 설치하기
- 파이썬 문자열: split, replace, strip, join, 슬라이싱과 f-문자열
- 파이썬 모듈과 패키지: import, pip, venv, 라이브러리를 쉽게 설명합니다
- 파이썬 독학 방법: 초보자를 위한 단계별 학습 계획
이 강좌의 모든 강의
- 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 и итоговый проект