Главная Веб-разработка Функция map() в Python: зачем нужна и как ей пользоваться

Функция map() в Python: зачем нужна и как ей пользоваться

от admin

Учимся обходиться без циклов и обрабатывать данные в одну строку кода.

Представьте себе конвейерную ленту на фабрике. На неё поступают яблоки, а рядом стоит робот, который должен покрасить каждое яблоко в красный цвет. В Python для функции map() работает подобный принцип — она применяет одно и то же действие к каждому элементу на «конвейере».

Для этой задачи мы могли бы написать цикл, который обрабатывает каждый элемент списка по отдельности. Однако у этого подхода есть недостатки: он работает медленнее, занимает больше памяти и делает код менее читабельным. А с 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() в Python: зачем нужна и как ей пользоваться

Как работает функция 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]

Читать также:
Функция print() в Python: аргументы и применение

Функция map() в Python: зачем нужна и как ей пользоваться

Что делает map() в Python

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

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() в Python: зачем нужна и как ей пользоваться

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() в Python: зачем нужна и как ей пользоваться

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: зачем нужна и как ей пользоваться

map() с функциями из стандартной библиотеки

Например, благодаря модулю 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() в Python: зачем нужна и как ей пользоваться

Когда не стоит использовать map()

Хотя функция map() в Python считается универсальным инструментом, в некоторых случаях существуют более эффективные альтернативы:

Выбор подходящего метода зависит от конкретной ситуации, но мы рекомендуем придерживаться принципа из The Zen of Python: «Простое лучше, чем сложное». Поэтому, если ваш код с map() становится трудным для понимания, лучше выбрать более прямолинейный способ решения задачи.

Абсолютные значения (или модули) чисел — это числа без знака «плюс» или «минус». Например, абсолютное значение числа −5 равно 5, а абсолютное значение числа +3 равно 3.

Итерируемый объект в Python — это набор элементов, которые можно последовательно перебирать в цикле for. Это могут быть как простые структуры данных (списки, строки, кортежи), так и более сложные объекты — файлы, генераторы или классы с поддержкой итерации. Главное свойство итерируемых объектов — способность поочерёдно выдавать свои элементы.

Похожие статьи