Функция map() в Python: зачем нужна и как ей пользоваться
Учимся обходиться без циклов и обрабатывать данные в одну строку кода.


Иллюстрация: Оля Ежак для Skillbox Media
Представьте себе конвейерную ленту на фабрике. На неё поступают яблоки, а рядом стоит робот, который должен покрасить каждое яблоко в красный цвет. В Python для функции map() работает подобный принцип — она применяет одно и то же действие к каждому элементу на «конвейере».
Для этой задачи мы могли бы написать цикл, который обрабатывает каждый элемент списка по отдельности. Однако у этого подхода есть недостатки: он работает медленнее, занимает больше памяти и делает код менее читабельным. А с map() мы просто говорим: «Вот функция, вот список — применяй эту функцию ко всем элементам». Давайте разбираться, как это всё устроено.
Содержание
- Что такое map() в Python
- Как работает функция map()
- Что делает map() в Python
- Когда не стоит использовать map()
Что такое map() в Python
Функция map() в Python — это встроенный инструмент для преобразования последовательностей данных: списков, кортежей, строк, множеств, словарей и других итерируемых объектов. Предположим, у вас есть список чисел [1, 2, 3] и нужно умножить каждое число на 2. Функция map() обработает каждый элемент, и вы получите новый объект с преобразованными значениями — [2, 4, 6]. При этом исходная коллекция не изменится.
Базовый синтаксис функции map() в Python:
map(function, iterable[, iterable2, ...])
Рассмотрим каждый элемент синтаксиса:
- function — функция преобразования, которая применяется к каждому элементу итерируемого объекта.
- iterable — основной итерируемый объект, к элементам которого применяется функция преобразования.
- [, iterable2, …] — необязательный параметр, который позволяет передать дополнительные последовательности данных. Например, если передать два списка, функция возьмёт первый элемент из первого списка и первый элемент из второго списка, затем вторые элементы и так далее.
⚠️ Учтите: количество аргументов в функции преобразования должно в точности соответствовать количеству итерируемых объектов в map(). Например, если функция принимает два параметра, вы должны передать ровно два итерируемых объекта. Без этого Python выдаст ошибку TypeError:
# Создадим два списка с числами
numbers1 = [1, 2, 3]
numbers2 = [10, 20, 30]
# Напишем функцию для сложения двух чисел
def add_numbers(x, y):
return x + y
# Правильное использование map() с двумя списками ✅
result = list(map(add_numbers, numbers1, numbers2))
print(result) # [11, 22, 33]
# Ошибка: функция ожидает два аргумента, а мы передаём один список ❌
result = list(map(add_numbers, numbers1))
print(result) # TypeError: add_numbers() missing 1 required positional argument: 'y'
Как работает функция map()
Функция map() использует особый механизм обработки данных: вместо немедленного создания нового списка с результатами она возвращает специальный объект-итератор. Этот итератор работает по принципу «ленивых вычислений»: функция преобразования применяется к элементам только тогда, когда они действительно необходимы. Когда элементы не нужны, итератор просто не тратит ресурсы на их обработку.
Возвращение итератора вместо готового списка позволяет экономить оперативную память и эффективно работать с большими объёмами данных. Например, если вы обрабатываете CSV-файл размером 5 ГБ с миллионом строк или получаете записи о транзакциях из базы данных за год, функция map() будет обрабатывать данные построчно, не загружая весь массив в память. Это поможет избежать задержек и прерываний в работе программы.
Чтобы увидеть результаты работы map(), необходимо преобразовать возвращаемый итератор в одну из конкретных структур данных Python. Без этого преобразования вы увидите только объект-итератор, а не сами данные.
Давайте преобразуем список строк в список их длин:
# Создаём список слов
words = ["яблоко", "ананас", "черника"]
# Применяем функцию len к каждому слову через map()
lengths = map(len, words)
# Преобразуем итератор в список и выводим результат
print(list(lengths)) # [6, 6, 7]
В нашем примере первый аргумент map() — ссылка на встроенную функцию len(). Данная функция последовательно вычисляет длину каждого элемента списка words, который является вторым аргументом map(). Мы передаём len без скобок, потому что передаём саму функцию по ссылке, а не вызываем её. На выходе map() создаёт итератор lengths. Мы преобразуем его в список с длинами строк и затем выводим результат.
⚠️ Функция map() создаёт итератор, который можно использовать только один раз для перебора элементов. После первого прохода по всем элементам итератор становится пустым и повторное обращение к нему не даст результатов:
Создаём список строковых чисел
numbers = ['1', '2', '3']
# Применяем функцию int() к каждому элементу для преобразования строк в числа
result = map(int, numbers)
# Первый вывод покажет преобразованные числа
print(list(result)) # [1, 2, 3]
# Второй вывод будет пустым, так как итерация завершена
print(list(result)) # []
Поэтому, если вы планируете обращаться к результатам map() несколько раз, сразу сохраните их в список или другую постоянную коллекцию данных:
# Создаём список строковых чисел
numbers = ['1', '2', '3']
# Применяем функцию int() к каждому элементу
result = map(int, numbers)
# Сохраняем результат в список для многократного использования
numbers_list = list(result)
# Теперь мы можем использовать переменную numbers_list сколько угодно раз
print(numbers_list) # [1, 2, 3]
print(numbers_list) # [1, 2, 3]
print(numbers_list) # [1, 2, 3]
Что делает map() в Python
Функцию map() можно использовать для преобразования элементов списка, выполнения математических операций, извлечения данных из объектов, форматирования строк и других задач. Кроме того, она работает с разными типами функций: встроенными, лямбда-функциями, пользовательскими и функциями из стандартной библиотеки. Давайте разберём это на примерах.
map() со встроенными функциями
Встроенные функции в Python — готовые инструменты, которые доступны сразу после установки языка. В Python их более 70, и многие из них можно использовать с map() для выполнения базовых преобразований данных.
Например, функции int(), round(), len(), str() и abs() позволяют конвертировать строки в числа, округлять значения, определять длину строк, преобразовывать числа в строки и получать абсолютное значение чисел:
# Конвертируем строки в числа
numbers_str = ['1', '2', '3', '4']
numbers_int = map(int, numbers_str)
print(list(numbers_int)) # [1, 2, 3, 4]
# Округляем значения
floats = [1.23, 4.56, 7.89]
rounded = map(round, floats)
print(list(rounded)) # [1, 5, 8]
# Определяем длину строк
words = ['I', 'know', 'python']
lengths = map(len, words)
print(list(lengths)) # [1, 4, 6]
# Преобразовываем числа в строки
numbers = [1, 2, 3, 4]
strings = map(str, numbers)
print(list(strings)) # ['1', '2', '3', '4']
# Получаем абсолютные значения
numbers = [-1, -2, 3, -4]
absolute = map(abs, numbers)
print(list(absolute)) # [1, 2, 3, 4]
map() c лямбда-функциями
Лямбда-функции в Python — это короткие анонимные функции, которые создаются с помощью ключевого слова lambda. В отличие от обычных функций, они позволяют записывать простые операции в одну строку прямо в вызове map(), что делает код более компактным и удобным для чтения.
Для примера возведём элементы списка в куб с помощью лямбда-функции:
numbers = [1, 2, 3, 4]
cubic = map(lambda x: x ** 3, numbers)
print(list(cubic)) # [1, 8, 27, 64]
А теперь перепишем код, но без использования лямбда-функции:
def cube(x):
return x ** 3
numbers = [1, 2, 3, 4]
cubic = map(cube, numbers)
print(list(cubic)) # [1, 8, 27, 64] — результат тот же, но кода больше

Читайте также:
map() с пользовательскими функциями
Функция map() может работать с обычными функциями, которые объявлены с помощью ключевого слова def. Это удобно в нескольких случаях: когда нужно выполнить сложные вычисления или если одну и ту же функцию вы планируете использовать несколько раз в разных частях программы.
Предположим, у нас есть список товаров с их ценами и количеством. Давайте создадим функцию для вычисления общей стоимости всех единиц каждого товара:
# Определяем функцию для вычисления стоимости товаров одного вида
def calculate_total(product):
return product['price'] * product['quantity']
# Список товаров
product = [
{"name": "Ноутбук", "price": 45000, "quantity": 2}, # 45000 * 2 = 90000
{"name": "Смартфон", "price": 22000, "quantity": 5}, # 22000 * 5 = 110000
{"name": "Наушники", "price": 8000, "quantity": 3}, # 8000 * 3 = 24000
]
# Применяем map() с функцией calculate_total ко всем товарам
totals = map(calculate_total, product)
print(list(totals)) # [90000, 110000, 24000] — общая стоимость всех товаров одного типа

Читайте также:
map() с функциями из стандартной библиотеки
Стандартная библиотека Python — это множество готовых инструментов для разработки, которые вы можете использовать в своём коде. Для этого нужно сначала их импортировать: либо весь модуль через команду import, либо конкретные функции или классы через конструкцию from … import ….
Например, благодаря модулю math мы можем извлекать квадратный корень, округлять числа и использовать другие математические функции:
# Подключаем модуль math
import math
# Извлекаем квадратный корень из каждого числа
numbers = [1, 4, 9, 16]
sqrt_numbers = map(math.sqrt, numbers)
print(list(sqrt_numbers)) # [1.0, 2.0, 3.0, 4.0]
# Округляем каждое число вверх до ближайшего целого
floats = [3.14, 2.71, 1.41]
ceil_numbers = map(math.ceil, floats)
print(list(ceil_numbers)) # [4, 3, 2]
# Возводим каждое число в квадрат
numbers = [1, 2, 3, 4]
squared = map(math.pow, numbers, [2]*len(numbers))
print(list(squared)) # [1.0, 4.0, 9.0, 16.0]
Когда не стоит использовать map()
Хотя функция map() в Python считается универсальным инструментом, в некоторых случаях существуют более эффективные альтернативы:
- List Comprehensions — для преобразования списков.
- Генераторы — для обработки больших объёмов данных.
- Цикл for — для сложной логики с несколькими условиями.
- Функция filter() — когда нужно одновременно отбирать и преобразовывать данные.
- Функция itertools.starmap() — когда необходимо применить функцию к каждому кортежу значений в последовательности.
Выбор подходящего метода зависит от конкретной ситуации, но мы рекомендуем придерживаться принципа из The Zen of Python: «Простое лучше, чем сложное». Поэтому, если ваш код с map() становится трудным для понимания, лучше выбрать более прямолинейный способ решения задачи.
Больше интересного про код — в нашем телеграм-канале. Подписывайтесь!