Python map(): все, что вы хотели знать, но боялись спросить не так
Разобрали на примерах, как работает Python map(), в чем ее преимущество перед классическими циклами и какие у нее бывают применения-фишки.
56К открытий353К показов
Когда только-только начинаешь писать код на Python, разобраться, какому объекту уделять больше внимания, непросто. Если вы приступили к программированию и тоже хотите узнать больше про map()
— своеобразную звезду языка, эта статья поможет.
Из документации
Мэппинг — это функция, которая применяет другую функцию к итерируемому объекту. Ее цель в том числе — приведение входных данных к нужной форме, чтобы потом их уменьшала reduce()
.
Описание функции в документации.
Знающие подметят, что эта пара образует название MapReduce, и да, действительно, эта модель распределенных вычислений для больших объемов данных вовсю использует мэппинг + редукцию.
Рефакторим код с циклом
Представьте, что у нас есть функция my_funс()
:
Она умножает аргумент на два. А вот наш список ls
:
Вместо классического, но затратного for loop
:
Можно применить мэппинг, чтобы удвоить все элементы ls
один за другим:
Посмотрим, как выглядит r:
Интерпретатор отдает ссылку на объект в памяти, но r
по сути является итератором (то есть вычислений еще не проводилось!). Лишь при преобразовании r в список удвоение запустится:
Скрытые возможности
Давайте посмотрим, что еще умеет эта замечательная функция. Она действительно способна облегчить нам жизнь в неожиданных ситуациях.
Строки тоже итерируются
map()
использует «дочернюю» функцию на любом объекте, где применим цикл for
. Мы можем применять ее к любому итерируемому объекту, даже к strings:
Импортируем модуль string
, чтобы использовать метод capwords()
— приведение к верхнему регистру:
Преобразуем все буквы в заглавные:
map() + лямбды
Мы можем комбинировать мэппинг с безымянными функциями, чтобы код стал еще короче:
Возведя все элементы списка ls в квадрат, мы получим такой результат:
self() для обращения объекта к себе
Посмотрите на функцию ниже:
В данном случае self
позволяет перемножить элементы списка на 2:
Загонка пользовательского ввода
Сотрудничество map()
, input()
и list()
позволит поместить весь пользовательский текст в список. Это может пригодиться при расчете эмоциональной окраски текста, ведь слова предстоит потом возвращать к исходной форме:
Недостатки map()
Помните ссылку на итератор из первого раздела?
К недостаткам map()
, так же как и в случае с filter()
, можно отнести «ленивую оценку» (Lazy Evaluation). Создатели языка сделали немало в 3-й версии, чтобы улучшить производительность языка, и потому вместо обработанного объекта по умолчанию нам возвращается ссылка на итератор. Пока мы не обернем ее в list()
или другой метод, обработка функцией-дочкой еще не произошла.
Это неплохо на малых оборотах, но на практике, где данные весьма разнообразны, без просмотра результата вероятность ошибок на проде увеличивается: мы просто не увидим потенциальных проблем.
Заключение
map()
по праву считается воплощением декларативной природы Python. Акцент делается на применении функций, а не на изменении состояния объекта. Функция не манипулирует данными за пределами своей области действия, а лишь создает их видоизмененные экземпляры.
Если вы хотите знать больше не только про map() и reduce(), но еще и про одну участницу трио — filter(), обратитесь к этой статье.
Как часто вы используете map()?
Каждый рабочий день
1-2 раза в месяц
Никогда раньше не использовал(-а)
56К открытий353К показов