Python map(): все, что вы хотели знать, но боялись спросить не так
Разобрали на примерах, как работает Python map(), в чем ее преимущество перед классическими циклами и какие у нее бывают применения-фишки.
77К открытий401К показов
Когда только-только начинаешь писать код на 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 раза в месяц
Никогда раньше не использовал(-а)
77К открытий401К показов




