Как написать функцию, которая возводит в квадрат каждое число в списке с использованием lambda и map в Python?
Что проверяют
Базовое владение функциональными инструментами Python и понимание, что map в Python 3 возвращает ленивый итератор, а не список. Следом почти всегда просят написать то же самое через генератор списка и объяснить, какой вариант вы выбрали бы в реальном коде.
Как отвечать
Решение в одну строку:
def square_all(numbers):
return list(map(lambda x: x ** 2, numbers))Что стоит проговорить:
map: применяет функцию к каждому элементу и возвращает объектmap, то есть итератор. Пока его не обойти (list(), цикл,sum()), ничего не вычисляется, и обойти его можно только один раз;lambda: анонимная функция из одного выражения. Удобна как аргумент, но присваивать её переменной PEP 8 не советует, для этого естьdef;- генератор списка:
[x ** 2 for x in numbers]делает то же самое, читается проще и обычно работает не медленнее.mapвыигрывает, когда функция уже готова, напримерmap(int, line.split()); - ленивый вариант: если результат нужен один раз и данных много,
(x ** 2 for x in numbers)илиmapбезlistне держат весь список в памяти.
Про типы: функция без изменений работает с int, float, Decimal и Fraction, потому что опирается только на оператор **. На строке упадёт с TypeError. Если нужен контроль, добавьте аннотацию вроде Iterable[float] и проверку mypy, а не isinstance на каждом элементе.
Если в разговоре появится NumPy: для массивов квадрат считают векторно, arr ** 2, и это на порядки быстрее цикла по объектам Python.
Где спотыкаются
Возвращают map(...) без list() и удивляются, что print показывает <map object at 0x...>, а второй проход по результату пустой.
Пишут lambda x: x ^ 2. В Python ^ это побитовое исключающее ИЛИ, и 3 ^ 2 даёт 1, а не 9.
Не могут объяснить, почему выбрали map. Честный ответ «так просили в задании, в коде я бы написал генератор списка» звучит сильнее, чем попытка доказать, что lambda быстрее: вызов лямбды на каждом элементе как раз делает map чуть медленнее.