List comprehensions, dict comprehensions, map, filter, zip, enumerate — идиоматический Python, который ожидают от аналитика. На собеседовании просят переписать цикл в comprehension, использовать sorted с ключом или объяснить разницу между map и генератором списка. Владение этими конструкциями показывает зрелость как Python-разработчика.
Всего в этом разделе 20 вопросов. Каждый — с правильным ответом и кратким разбором теории. Разбито на 4 части по 5 вопросов.
В выражении `[x * 2 for x in xs if x > 0]` сначала перебираются элементы `xs`, затем применяется фильтр `x > 0`, и только для оставшихся элементов вычисляется `x * 2`. Элементы, не прошедшие условие, просто не попадают в результат.
`all(checks)` возвращает `True`, только если каждый элемент в `checks` истинный. `any(checks)` вернёт `True`, если истинно хотя бы одно условие. `sum(checks)` и `len(checks)` могут быть полезны в других задачах, но они не выражают смысл «все проверки прошли» так прямо.
Выражение `any(a > 0 for a in amounts)` проверяет, существует ли хотя бы один элемент, для которого `a > 0`. Оно не считает количество таких элементов и не создаёт список булевых значений — оно останавливается, как только находит подходящий элемент.
Вариант `list(map(normalize_email, emails))` короткий и понятный, потому что функция уже названа и сама по себе объясняет действие. `map(normalize_email, emails)` возвращает итератор, а не список. `filter()` здесь не подходит, потому что он предназначен для отбора элементов, а не для преобразования.
Если вы используете `filter()` для удаления пустых значений, вариант `list(filter(None, items))` обычно читается проще, чем `list(filter(lambda x: x, items))`, потому что не добавляет лишнюю `lambda`. Важно помнить: `filter()` возвращает итератор, поэтому для получения списка нужно обернуть в `list(...)`.
В приложении — таймер, прогресс, стрики и 1700+ вопросов по всем темам.
Тренировать в Telegram