Что возвращает функция map в Python?
Что проверяют
Понимаете ли вы ленивые итераторы. Правильный ответ здесь отличает человека, который писал код на третьем Python, от того, кто учил по старым материалам, где map возвращал список.
Как отвечать
map возвращает объект типа map, это итератор: ленивый, одноразовый, без длины и без индексации. Функция применяется не в момент вызова map, а по мере обхода результата.
r = map(str.upper, ["a", "b"])
print(r) # <map object at ...>
print(list(r)) # ['A', 'B']
print(list(r)) # [] итератор уже исчерпанМатериализовать можно чем угодно, что обходит итератор: list, tuple, set, цикл for, sum, распаковка в вызове функции. Ленивость это плюс на больших данных, потому что весь результат в памяти не лежит.
Стоит добавить пару деталей. При нескольких итерируемых map(f, a, b) вызывает функцию попарно и останавливается на самом коротком, длина не выравнивается. По стилю для готовой функции map(str.strip, lines) читается отлично, а вот map с лямбдой почти всегда проигрывает генераторному выражению, и в ревью его просят переписать.
Где спотыкаются
Печатают результат напрямую и показывают в ответе строку вида <map object>. На собеседовании это выглядит как код, который никогда не запускали.
Второе: обходят один и тот же объект дважды. Первый проход всё забирает, второй возвращает пустоту, причём молча, без ошибки. Если результат нужен повторно, его сохраняют в список.
Третье: используют map ради побочного эффекта, например с функцией, которая пишет в базу или печатает. Без потребления итератора не выполнится ничего. Для побочных эффектов нужен обычный цикл, он ещё и читается честнее.