Вопросы по теме «Генераторы списков и встроенные функции»

Проверь себя · 1/3разбор после ответа
Есть словарь code_to_name = {"RU": "Russia", "FR": "France"}. Нужно получить обратное отображение name_to_code (предполагаем, что значения уникальны). Какой вариант корректен?

List comprehensions, dict comprehensions, map, filter, zip, enumerate — идиоматический Python, который ожидают от аналитика. На собеседовании просят переписать цикл в comprehension, использовать sorted с ключом или объяснить разницу между map и генератором списка. Владение этими конструкциями показывает зрелость как Python-разработчика.

Всего в этом разделе 20 вопросов. Каждый — с правильным ответом и кратким разбором теории. Разбито на 4 части по 5 вопросов.

Коллекции и структуры данныхЦиклы и условияИсключения и отладкаРабота с файлами: JSON и CSVФункции и аргументыИтераторы и генераторыNumPy: основыPandas и DataFrameСинтаксис и типы данных

Вопросы 15 из 20

1Дан список `xs = [1, -2, 3, 0]`. Что вернёт выражение `[x * 2 for x in xs if x > 0]`?
A`[2, 6]`
B`[2, -4, 6, 0]`
C`[1, 3]`
D`[2, 6, 0]`
Ответ: В list comprehension условие после `if` фильтрует элементы, а выражение перед `for` вычисляется только для прошедших фильтр.

В выражении `[x * 2 for x in xs if x > 0]` сначала перебираются элементы `xs`, затем применяется фильтр `x > 0`, и только для оставшихся элементов вычисляется `x * 2`. Элементы, не прошедшие условие, просто не попадают в результат.

Подробный разбор →
2Есть список булевых результатов проверок качества данных `checks`. Какое выражение наиболее прямо отвечает на вопрос «все проверки прошли»?
A`all(checks)`
B`any(checks)`
C`sum(checks)`
D`len(checks)`
Ответ: `all(...)` напрямую отвечает «истинны ли все элементы»: возвращает `True`, когда каждый элемент истинный.

Когда нужно ответить «все ли проверки прошли», подходит `all(checks)`: достаточно одного `False`, чтобы результат стал `False`. `any(checks)` отвечает на другой вопрос — «есть ли хотя бы одна успешная проверка». `sum(checks)` посчитает количество истинных проверок, а не выдаст один общий флаг. `len(checks)` вообще не смотрит на значения, а возвращает длину списка.

Подробный разбор →
3Есть список сумм `amounts = [0, 0, 10]`. Что вернёт выражение `any(a > 0 for a in amounts)`?
AБулево значение `False`
BИсключение `TypeError`
CБулево значение `True`
DЦелое число `1`
Ответ: `any(...)` возвращает `True`, как только встречает первый истинный элемент в последовательности.

Функция `any()` принимает любой итерируемый объект, в том числе генераторное выражение, и возвращает булево значение. Для `[0, 0, 10]` условие `a > 0` истинно на третьем элементе, поэтому результат — `True`. Нули в списке не «перевешивают» истинное значение: `any` ищет хотя бы одно истинное. `any` возвращает именно `True`/`False`, а не количество подходящих элементов (для этого подошёл бы `sum`).

Подробный разбор →
4У вас уже есть функция `normalize_email`, которая принимает строку и возвращает строку. Нужно применить её к списку `emails` и получить новый список. Какой вариант наиболее уместен и читаем?
A`list(map(lambda e: normalize_email(e), emails))`
B`list(map(normalize_email, emails))`
C`tuple(map(normalize_email, emails))`
D`list(filter(normalize_email, emails))`
Ответ: Если функция уже определена, в `map()` её передают по имени, без обёртки `lambda`, и приводят результат к списку через `list()`.

`list(map(normalize_email, emails))` — самая компактная и читаемая запись: функция передана напрямую, итератор приведён к списку. `lambda e: normalize_email(e)` — лишняя обёртка, которая делает ровно то же самое. `tuple(map(...))` тоже применяет функцию к каждому элементу, но возвращает кортеж, а не список. `filter(normalize_email, ...)` использовал бы функцию как предикат и возвращал только те значения, которые `normalize_email` посчитала бы истинными, — это совсем другая операция.

Подробный разбор →
5Нужно получить список строк без пустых значений из `items`. Вы решили использовать `filter()`, и хотите избежать лишнего `lambda`. Какой вариант лучше?
A`list(filter(lambda x: x, items))`
B`list(filter(None, items))`
C`list(map(None, items))`
D`list(items.filter(None))`
Ответ: `filter(None, items)` оставляет только истинные значения, а `list(...)` сразу собирает их в список — без лишней `lambda`.

При первом аргументе `None` функция `filter` использует встроенный тест на «истинность» каждого элемента — это эквивалент `lambda x: x`, но без явной обёртки. `list(filter(None, items))` сразу возвращает список, как просили. Вариант с `lambda x: x` делает то же самое, но добавляет лишнюю функцию. У `map` `None` в качестве функции — устаревшая форма, в Python 3 это вызовет `TypeError`. У списка `items` нет метода `.filter()`, такой вызов поднимет `AttributeError`.

Подробный разбор →
1234

Хотите тренировать интерактивно?

В приложении — таймер, прогресс, стрики и 1700+ вопросов по всем темам.

Тренировать Python в Telegram

Другие темы: Python

Коллекции и структуры данныхЦиклы и условияИсключения и отладкаРабота с файлами: JSON и CSVФункции и аргументыИтераторы и генераторыNumPy: основыPandas и DataFrameСинтаксис и типы данных