Итерируйтесь по входу и выдавайте function(item) через yield. Результат вычисляется лениво, как у map для одного iterable.
Генератор, имитирующий работу функции map
Итерируйтесь по входу и выдавайте function(item) через yield. Результат вычисляется лениво, как у map для одного iterable.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Реализуйте генератор, который воспроизводит поведение встроенной функции map, применяя переданную функцию к каждому элементу указанного итерируемого объекта.
Пример 1: Ввод: res = my_map(lambda x: x * 2, [1, 2, 3]) Вывод: [2, 4, 6]
Ответ
Итерируйтесь по входу и выдавайте function(item) через yield. Результат вычисляется лениво, как у map для одного iterable.
def my_map(function, iterable):
for item in iterable:
yield function(item)
result = my_map(lambda x: x * 2, [1, 2, 3])
assert list(result) == [2, 4, 6]
Функция вызывается только при продвижении генератора. Пустой вход не даёт элементов, а исключение преобразования распространяется потребителю. Генератор одноразовый и не поддерживает индексирование.
Встроенный map также умеет принимать несколько итерируемых объектов, но это не требуется приведённым условием. Для такого расширения можно обходить zip(*iterables) и вызывать function(*items), завершаясь на кратчайшем входе.