Python map() и почти все, что вы хотели знать о ней

Posted by

Когда только-только начинаешь писать код на 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(), обратитесь к этой статье.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *