logo
Ещё

Python map()

Map() – это встроенная функция языка, которая позволяет произвести какое-либо действие над одним или несколькими итерируемыми объектами в одну строку. Как и многие строенные функции в Python, map() – функция, которая упрощает жизнь: можно было бы обойтись и без нее, но с ней код выглядит проще и понятнее. Ниже – о том, как эта функция работает и где применяется.

Как работает map()?

Синтаксис map():

iterable = map(function, data1[, data2, …])

Функция map() принимает 2 обязательных аргумента: функцию-обработчик (function) и итерируемый набор данных (data1), после чего применяет функцию к каждому элементу из итерируемого набора данных. Дополнительно можно передать в функцию и другие итерируемые наборы данных, но есть правило: количество итерируемых наборов данных должно быть равно количеству параметров в сигнатуре функции-обработчика. Map() возвращает итерируемый объект – iterable.

Посмотрим на практике:


У нас есть функция multi, которая принимает 2 значения, перемножает их и возвращает. У на есть 2 списка – в первом посимвольно находится слово «sravni», во втором находятся числа от 0 до 6. Мы передаем в map() функцию и 2 списка, после чего map() генерирует на их основе итерируемый объект – объект, который будет последовательно выдавать свой результат, если к нему обратятся. Получить конкретно следующий элемент можно через функцию next(), но мы получим сразу все – для этого мы засунем итерируемый объект в цикл for. Что дальше будет происходить:

  1. For запрашивает результат из result. Result выполняет map(): берет list1[0], берет list2[0], вызывает multi(list1[0], list2[0]). Выполняется операция «’s’*0», результат – пустая строка, которая возвращается в print и выводится.
  2. For запрашивает результат из result. Result выполняет map(): берет list1[1], берет list2[1], вызывает multi(list1[1], list2[1]). Выполняется операция «’r’*1», результат – строка ‘r’, которая возвращается в print и выводится.
  3. Когда в result заканчиваются значения – цикл завершается, программа останавливается.

Что важно – итерируемый объект способен отдать свои значения только один раз, поэтому если вы еще раз отдадите result в for – ничего не произойдет, итерируемый объект пуст.

Map() и разные виды функций

Map в качестве первого аргумента принимает функцию, и это может быть:

  1. Написанная разработчиком функция, вынесенная в отдельный блок def. Такие функции пишут тогда, когда нужно проделать с данными сложную и многоступенчатую работу.
  2. Функция, встроенная в язык. У Python – более 70 встроенных функций, и многие из них можно передавать в map(): len, sum, min, max и так далее.
  3. Написанная разработчиком лямбда. Лямбды – это анонимные функции, они умещаются в одну строку и делают какое-то простое действие. Лямбды полезны тогда, когда мы не планируем повторно использовать функцию – написали лямбду, отдали ее в map() и забыли о ее существовании. А заодно – сэкономили место под объявление функции и улучшили наглядность, потому что действия функции написаны прямо в map(), а не где-то там в другой части кода.

Синтаксис лямбд:

lambda arguments: expression

, где lambda – ключевое слово, arguments – аргументы (любое количество), expression – выражение (действие над аргументами, одна штука). Return в лямбдах не нужен, потому что выражение в них может быть только одно – его результат и возвращается. Перепишем пример выше с участием лямбды:


Где применяется map()?

Вообще – везде, где нам нужно поэлементно совершить некоторые действия над одним или несколькими итерируемыми объектами. Как пример:

  • Как-либо преобразовать элементы списка. Возвести числа в списке в квадрат, к примеру.
  • Изменить тип данных. Если у нас есть список чисел – мы можем в одну строку конвертировать его в список строк.
  • Произвести объединение данных из нескольких списков. Например – «склеить» ID и имена пользователей.
  • Обработать данные из файлов. Вы можете считать файл построчно и произвести с каждой строкой какие-либо действия – trim() и split(), к примеру.
  • Обработать JSON. Через map() можно быстро поменять данные в JSON, сохранив структуру формата.