List comprehensions, dict comprehensions, map, filter, zip, enumerate — идиоматический Python, который ожидают от аналитика. На собеседовании просят переписать цикл в comprehension, использовать sorted с ключом или объяснить разницу между map и генератором списка. Владение этими конструкциями показывает зрелость как Python-разработчика.
Запись `[str(x) for x in user_ids if x > 0]` сразу описывает: «возьми каждый `x` из списка, оставь положительные и приведи к строке». Вариант с `map()` и `filter()` делает то же самое, но добавляет вложенные функции и `lambda`. `list(map(lambda x: str(x), user_ids))` преобразует все элементы, не отфильтровав отрицательные. В последнем варианте `str(x) > 0` — это сравнение строки с числом: в Python 3 такой код вообще выбросит `TypeError` при первом же вызове.
Подробный разбор →В выражении `[x if x % 2 == 0 else -1 for x in vals]` для каждого `x` проверяется условие: если чётное — оставляем `x`, иначе подставляем `-1`. Для `vals = [0, 1, 2]` получится `[0, -1, 2]`. Это не фильтр: длина результата всегда равна длине исходного списка. Вариант `[-1, 1, -1]` соответствовал бы инвертированному условию (заменять чётные, оставлять нечётные), а `[-1, -1, -1]` — постоянной замене без проверки.
Подробный разбор →Целевой результат — это список значений `id`, поэтому подходит обычное списочное включение с фильтром по `is_active`. Связка `map()` + `filter()` даёт похожий результат, но возвращает ленивый итератор и читается тяжелее из-за двух `lambda`. Конструкция с двоеточием в фигурных скобках — это словарь по `id`, а не список. Вариант `[u for u in users if ...]` собирает целиком сами словари пользователей, а не их идентификаторы.
Подробный разбор →`all(p > 0 for p in prices)` обходит все цены и возвращает `True`, лишь когда условие истинно для каждой. `any` вернёт `True` уже при первом положительном элементе — это «хотя бы один», а не «все». Списочное включение `[p > 0 for p in prices]` отдаёт список булевых значений, а не один общий флаг. `sum(p > 0 for p in prices)` посчитает количество положительных элементов, что не отвечает на вопрос «строго все».
Подробный разбор →`[int(x) for x in raw if x]` сначала отсеивает пустые строки (для них `bool("") = False`), и только потом вызывает `int(x)` — поэтому исключения не будет. `[int(x) for x in raw]` без фильтра пытается преобразовать пустую строку и падает с `ValueError`. Вариант с `filter(None, map(int, raw))` тоже сначала вызывает `int()` для всех элементов и падает на пустой строке. `list(filter(int, raw))` использует `int` как предикат к строкам и не приводит их к числу, а также падает с ошибкой при пустой строке.
Подробный разбор →В приложении — таймер, прогресс, стрики и 1700+ вопросов по всем темам.
Тренировать Python в Telegram