Обяснение на разбирането на списъци на Python: Кога да ги използвате и кога не (2026)
Разбирането на списъци е една от най-неразбраните функции на Python. Начинаещите ги избягват, защото "изглеждат сложни". Междинните продукти ги използват прекалено много, докато всеки трети ред е вложен един ред, който никой не може да прочете. Този урок поправя и двете грешки.
Ще разгледаме: точната форма от три части, която следва всяко разбиране на списъка, показатели срещу за / карта / филтър, четирите модела, които трябва да разпознавате веднага, и строго правило за това кога да спрете използването на разбирания и вместо това да посегнете към обикновен цикъл.
Формата: [ какво | източник | филтър ]
Всяко разбиране на списък се състои от три части в този ред:
Четейки го на глас: "дайте ми `израз` за всеки `елемент` в `iterable`, но само когато `условието` е вярно."
Започнете с еквивалентния цикъл for, след което го свийте:
Същият резултат — „[0, 4, 16, 36, 64]“. Разбирането е един ред, разпределя списъка отпред (без извиквания на append), а компилаторът на байткод на Python излъчва LIST_APPEND — бърз път, който пропуска търсенето на атрибут в .append.
Бенчмарк: разбиране срещу for-цикъл срещу карта+филтър
Изграждане на списък от четни числа на квадрат от 0 до 100 000:
| Метод | Време (µs) | Относително |
|---|---|---|
| за + .прибавяне | 4800 | 1,9× базова линия |
| списък(карта(..., филтър(...))) | 3200 | 1,3× базова линия |
| Списък разбиране | 2500 | 1.0× (най-бързо) |
Измерено на Python 3.13, еднократно изпълнение от 1000 итерации. Разбиранията печелят, защото няма извикване на функция за всеки елемент — изразът е вграден.
Това каза: не микро-оптимизиране. За списък от 100 елемента и трите завършват за под 100µs. Първо изберете четливост.
Четирите модела, които трябва да разпознаете
1. Трансформирайте всеки елемент
Вмъкваща се замяна за map(str.title, names), но не се нуждае от обвиване на list(...).
2. Филтриране без трансформиране
По-чист от „списък(филтър(ламбда n: n > 0, числа))“. Няма нужда от „ламбда“.
3. Филтрирайте И трансформирайте
Това е мястото, където разбиранията очевидно надминават алтернативите - опитайте да го напишете с map + filter и пребройте скобите.
4. Изравняване на вложен списък
Редът има значение: „за ред в матрицата“ се чете отляво надясно като еквивалентните вложени цикли „за“. Това е единственият модел, при който вложените разбирания остават четими - всичко по-дълбоко се нуждае от цикъл.
Кога да СПРЕТЕ използването на разбирания
Три твърди правила, подредени по важност:
1. Три или повече клаузи „за“ → използвайте цикъл. Тройно вложеното разбиране е нечетливо дори за човека, който го е написал преди 20 минути.
2. Странични ефекти → използвайте цикъл. Разбиранията са за изграждане на списък. Ако извиквате функция за нейните странични ефекти (писане във файл, изпращане на заявка), използвайте цикъл. „[print(x) for x in items]“ е миризма на код — вие създавате списък за изхвърляне на „Няма“.
3. Изразът е по-дълъг от 60 знака → разбийте го. Ако трябва да мислите повече от 3 секунди, за да го анализирате, разделете на именувана функция или цикъл.
Разбиране на Dict и набор — същата форма
Същият синтаксис, различни скоби:
Разбиранията на Dict са особено полезни за обръщане на съпоставяне ({v: k за k, v в d.items()}) или изграждане на справочна таблица от списък.
Генераторни изрази — удобният за памет братовчед
Пуснете скобите, запазете скобите:
За sum, min, max, any, all, ", ".join(...) и други функции, които итерират веднъж, предпочитайте генераторния израз — той запазва разпределението на междинния списък. За всичко, което трябва да индексирате или итерирате два пъти, използвайте разбиране.
Практика: три упражнения
Пренапишете всеки, като използвате списък за разбиране. Решенията са накрая.
1. Дадени са words = ["котка", "слон", "куче", "хипопотам"], вземете списък с думи, по-дълги от 4 знака, всички с главни букви.
2. Като се има предвид data = [{"name": "Alice", "age": 30}, {"name": "Bob", "age": 25}], извлечете списък само с имената.
3. При дадени двойки = [(1, 2), (3, 4), (5, 6)], вземете списък със сумите на всяка двойка.
Решения:
Разбирането на списъци е отличителна черта на Python - знанието кога да посегнете към един (и кога да го оставите като цикъл „for“) е надежден маркер за средно ниво на владеене. Практикувайте, като пренаписвате съществуващите цикли for + .append, които намирате във вашия собствен код; не всеки трябва да стане разбиране, но тези, които трябва, ще се почувстват очевидни след седмица.
Следваща стъпка: опитайте 5 интерактивни урока за разбиране на списъци с истински Python, работещ във вашия браузър, и AI ментор на всяка стъпка.