Функция map()
- это функция Python, позволяющая вам обрабатывать и преобразовывать все элементы в итерируемом объекте без использования цикла for.
Работа с map()
Наверное вы сталкивались с ситуацией, когда вам необходимо было выполнить одну и ту же функцию с массивом элементов. Вы можете сделать это как с помощью цикла for в Python, но также вы можете это сделать с помощью функции map()
без использования явных циклов.
Что такое map()
Функция map()
перебирает элементы итерируемого массива (или коллекции) и возвращает новый массив (или итерируемый объект), который является результатом применения функции преобразования к каждому элементу исходного итерабельного массива.
Согласно документации, map()
принимает функцию и итерацию (или несколько итераций) в качестве аргументов и возвращает итератор, который выдает преобразованные элементы по запросу. Сигнатура функции map определяется следующим образом:
map(function, iterable[, iterable1, iterable2,..., iterableN])
map()
применяет функцию к каждому элементу в итерируемом цикле и возвращает новый итератор, который по запросу возвращает преобразованные элементы. Функция может быть любой функцией Python, которая принимает аргументы, равные количеству итераций, переданных в функцию map()
.
Первый аргументом является — передавая функция, без скобочек.
Давайте рассмотрим пример с циклом for, а после сделаем такой же пример с map()
numbers = [1, 2, 3, 4, 5]
squared = []
for num in numbers:
squared.append(num ** 2)
print(squared)
Результат: [1, 4, 9, 16, 25]
Пояснение: в этом примере мы возвели циклом for значения из списка и добавили каждый итерируемый объект в новый список squared.
Теперь рассмотрим пример с map()
numbers = [1, 2, 3, 4, 5]
def square(number):
return number ** 2
squared = list(map(square, numbers))
print(squared)
Результат: [1, 4, 9, 16, 25]
Пояснение: square()
— это функция, которая возводит число в квадрат. Вызов map()
применяет square()
ко всем значениям и возвращает итератор, с квадратными значениями, далее мы делаем из этого список и получаем тот же результат, что получили с циклом for
Преимущества использования map()
Функция map()
написана на C и хорошо оптимизирована, ее неявный внутренний цикл может быть более эффективным, чем обычный цикл for в Python. Это одно из преимуществ использования map()
.
Второе преимущество использования map()
связано с потреблением памяти. В цикле for вам нужно сохранить весь список в памяти вашей системы. С помощью map()
вы получаете элементы по запросу, и в каждый момент времени в вашей системной памяти находится только один элемент.
def square(number):
return number ** 2
squared = (map(square, numbers))
print(squared)
Результат: <map object at 0x000001595F177F40>
Примечание: в Python 2.x - функция map()
возвращает список. Но в Python 3.x, map()
возвращает объект map, который является итератором, выдающим элементы по запросу, и поэтому нам необходимо вызвать list()
, чтобы получить необходимый результат в виде списка.
Использование map() с различными видами функций
Вы можете использовать любую функцию Python, вызываемую с помощью map()
.
Есть несколько встроенных функций, которые вы можете использовать с map()
. Рассмотрим следующие примеры:
numbers = [-2, -1, 0, 1, 2]
abs_values = list(map(abs, numbers))
print(abs_values)
print(list(map(float, numbers)))
words = ['Hi', 'Notehunter', 'Developers']
print(list(map(len, words)))
Результат:
[2, 1, 0, 1, 2]
[-2.0, -1.0, 0.0, 1.0, 2.0]
[2, 10, 10]
Вы можете использовать любую встроенную функцию с map()
при условии, что функция принимает аргумент и возвращает значение.
Использование встроенной функции с несколькими итерируемыми объектами
Для применения функции с несколькими итерируемыми объектами мы передаем имя другого итерируемого объекта после первого. Рассмотрим в качестве примера функцию pow()
, которая принимает два числа и возводит базовое число в указанную степень.
base_numbers = [2, 4, 6, 8, 10]
powers = [1, 2, 3, 4, 5]
numbers_powers = list(map(pow, base_numbers, powers))
print(numbers_powers)
Результат: [2, 16, 216, 4096, 100000]
Пояснение: map()
применит функцию pow()
к тому же элементу в каждом списке для возведения в степень.
Когда дело доходит до использования map()
, вы обычно видите использование лямбда-функции в качестве первого аргумента. Лямбда-функции пригодятся, когда вам нужно передать функцию на основе выражения в map()
. Например, вы можете повторно реализовать пример квадратных значений с помощью лямбда-функции следующим образом:
numbers = [1, 2, 3, 4, 5]
squared = map(lambda num: num ** 2, numbers)
print(list(squared))
Результат: [1, 4, 9, 16, 25]
Лямбда-функции могут выступать в качестве первого аргумента для map()
. Вы можете использовать лямбда-функции вместе с map()
для быстрой обработки и преобразования итераций.