Генератор, имитирующий поведение функции filter

Создайте функцию с yield, которая перебирает вход и выдаёт только элементы с истинным результатом предиката. Для соответствия filter поддержите predicate=None как проверку истинности самого элемента.

Короткий ответ

Что ответить на собеседовании

Создайте функцию с yield, которая перебирает вход и выдаёт только элементы с истинным результатом предиката. Для соответствия filter поддержите predicate=None как проверку истинности самого элемента.

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

Ответ с пояснениями

Условие

Создайте генератор, который воспроизводит работу встроенной функции filter, последовательно возвращая элементы из переданного итерируемого объекта, для которых пользовательская функция‑предикат возвращает истинное значение.

Пример 1: Ввод: gen = my_filter(lambda x: x % 2 == 0, [1, 2, 3, 4]) Вывод: [2, 4]

Ответ

Создайте функцию с yield, которая перебирает вход и выдаёт только элементы с истинным результатом предиката. Для соответствия filter поддержите predicate=None как проверку истинности самого элемента.

Ленивая реализация:

def my_filter(predicate, iterable):
    for item in iterable:
        if (item if predicate is None else predicate(item)):
            yield item

list(my_filter(lambda x: x % 2 == 0, [1, 2, 3, 4])) возвращает [2, 4]. До продвижения генератора вход не перебирается. Значения и порядок сохраняются, ошибки предиката не подавляются. Промежуточный список не создаётся; если потребитель остановится рано, оставшиеся элементы не будут проверены.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее