Создайте функцию с yield, которая перебирает вход и выдаёт только элементы с истинным результатом предиката. Для соответствия filter поддержите predicate=None как проверку истинности самого элемента.
Генератор, имитирующий поведение функции filter
Создайте функцию с 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]. До продвижения генератора вход не перебирается. Значения и порядок сохраняются, ошибки предиката не подавляются. Промежуточный список не создаётся; если потребитель остановится рано, оставшиеся элементы не будут проверены.