map + filter в одном выражении

map + filter в одном выражении

@python_quiz

Разберем этот квиз

Условие — короткий фрагмент Python-кода:

python

Разберём, что здесь происходит.

Пошаговый разбор

  1. filter(lambda x: x > 1, nums)

- Пробегает по списку nums и оставляет элементы, для которых условие истинно.
- Для nums = [1, 2, 3] останутся [2, 3].
- В Python 3 filter возвращает ленивый итератор (объект filter), а не список.

  1. map(lambda x: x * 2, ...)

- Берёт каждый элемент из результирующего итератора filter и применяет функцию, удваивая значение.
- Для [2, 3] получится [4, 6].
- map тоже возвращает итератор в Python 3.

  1. list(...)

- Преобразует итоговый итератор map в список и печатает его.

Замечание: импорт reduce здесь не используется — он никак не влияет на вывод.

Что напечатает код

Результат вывода:

text

Анализ вариантов (почему одни неверны, другие логичны)

  • Вариант с [2, 4, 6]

- Неверно: это выглядело бы как будто все элементы были сначала умножены на 2, а затем применён filter, или filter вовсе не сработал. На самом деле 1 отфильтровывается, поэтому первого элемента *2 нет в результате.

  • Вариант с [4, 6]

- Соответствует тому, что делает код: сначала удаляем элементы ≤ 1, затем удваиваем оставшиеся.

  • Вариант с [1, 2, 3]

- Неверно: ничего из кода не оставляет список без изменений — тут и filter, и map изменяют последовательность.

  • Вариант «Будет исключение, т.к. filter вернёт итератор»

- Неверно: хотя filter действительно возвращает итератор в Python 3, это нормально — map умеет принимать итераторы, а list корректно их итерирует. Исключения не будет.

Полезные примеры и альтернативы

Эквивалент через list comprehension (чаще читается и используется в Python):

python

Посмотреть типы промежуточных объектов:

python

Пример проблемы с исчерпанием итератора:

python

Если вы собираетесь многократно проходить по результату filter, имеет смысл сначала материализовать его в список.

Вывод

Комбинация filter + map в Python 3 работает через ленивые итераторы. Это экономит память, но требует внимания: итераторы одноразовые. В конкретном фрагменте код сначала отбрасывает 1, затем удваивает оставшиеся элементы, поэтому итогом является список [4, 6].

Report Page