Объяснение к уроку
После этого урока ты сможешь:
Код в стиле Python — это не код с наименьшим количеством символов. Это код, который четко выражает намерение с помощью инструментов Python.
Используй включение, чтобы создать новую коллекцию. Используй обычный цикл for, когда твоя цель — видимый побочный эффект, такой как вывод каждой строки, или когда на одной итерации изменяется несколько состояний. Используй zip() для действительно сопоставленных последовательностей, enumerate(), когда важен номер, и sorted(), чтобы вернуть новый упорядоченный список без изменения исходного.
Распространенная ошибка в данных возникает при раздельной фильтрации двух сопоставленных списков: их оставшиеся позиции могут перестать совпадать. Сначала объедини связанные значения в пары, а затем отфильтруй объединенные записи.
Надежный отчет обычно собирается по четким этапам: нормализация → выборка → преобразование → упорядочивание → отчет. Материализуй промежуточную коллекцию, если тебе нужно просмотреть ее дважды; в противном случае используй генераторное выражение для однопроходного агрегирования или проверки.
Для результата готовности одного all() недостаточно, если пустой набор проверок должен считаться заблокированным. Явно укажи бизнес-правило: требуй непустых проверок и прохождения каждой проверки.
raw_regions = [" US ", "eu", " APAC "]
regions = [region.strip().lower() for region in raw_regions]
print(regions)
print(raw_regions[0])Вывод:
['us', 'eu', 'apac']
US Входные данные остаются нетронутыми; новый список содержит нормализованные значения.
jobs = ["api", "queue", "mail"]
owners = ["Maya", "Omar", "Lina"]
active_pairs = [(job, owner) for job, owner in zip(jobs, owners) if job != "queue"]
print(active_pairs)Вывод:
[('api', 'Maya'), ('mail', 'Lina')]Фильтрация пар вместе сохраняет информацию о том, какой владелец относится к какой задаче.
services = ["api", "db"]
for position, service in enumerate(services, start=1):
print(f"{position}. {service}")Вывод:
1. api
2. dbОбычный цикл понятнее включения, используемого только ради вывода на печать.
checks = ["PASS", "pass"]
normalized = [item.strip().lower() for item in checks]
ready = bool(normalized) and all(item == "pass" for item in normalized)
print(f"Ready: {ready}")Вывод:
Ready: TrueЕсли бы список проверок был пуст, защита bool(normalized) предотвратила бы случайный результат готовности.
| Намерение | Понятный вариант |
|---|---|
| Построить новую коллекцию | Списковое / словарное / множественное включение |
| Вывести на печать или обновить несколько счетчиков | Обычный цикл for |
| Объединить сопоставленные входные данные | zip() до фильтрации |
| Получить номера для строк отчета | enumerate(..., start=1) |
| Отсортировать без изменения источника | sorted(..., key=...) |
| Однократная агрегация | Генераторное выражение с sum() / any() / all() |
| Подтвердить успешность непустой партии | bool(items) and all(...) |
zip().all([]) означает, что реальная партия была проверена.