Баннер мобильный (3) Пройти тест

Функция map() в Python для преобразования данных

Как использовать map() для обработки итерируемых объектов

Разбор

18 июля 2025

Поделиться

Скопировано
Функция map() в Python для преобразования данных

Содержание

    Рассказываем, зачем нужна функция map() в Python, как она работает на уровне синтаксиса, и разбираем примеры применения.

    Что такое функция map()

    Функция map() — это инструмент Python, который позволяет применить определенную функцию к каждому элементу итерируемого объекта (например, списка или кортежа). Эта функция называется функцией преобразования, так как она преобразует каждый исходный элемент в новый.

    Map() появилась в Python 1.0 (в 1994 году) как инструмент функционального программирования и до сих пор является неотъемлемой частью языка.

    • Она не требует импорта из какой-либо библиотеки, так как является частью стандартного набора функций Python.
    • Упрощает обработку данных тем, что заменяет циклы for. Например, вместо того чтобы писать цикл для удвоения чисел в списке, вы можете использовать map() и сделать это одной строкой.

    В результате применения map() создается новый набор данных — объект map, который является итератором.

    Важно: понятия итератор и итерируемый объект — не одно и то же.

    Итерируемый объект — объект, который можно перебирать (например, в цикле for). От него можно получить итератор через метод __iter__().

    Итератор — объект, который управляет процессом итерации. Он выдает элементы по одному через метод __next__(). Когда элементы закончились, этот метод должен выбросить исключение StopIteration. Также итератор возвращает сам себя через метод __iter__().

    Синтаксис и принцип работы map()

    В качестве аргументов map() принимает функцию и один или несколько итерируемых объектов (списков, кортежей). Возвращает — итератор типа map (в Python 2.x map() возвращал список).

    Синтаксис

    map(function, iterable[, iterable1, iterable2, ...])

    Функция (function) применяется к каждому элементу итерируемого объекта (iterable) по очереди, а результат сохраняется в объекте map. 

    Чтобы увидеть результат, его нужно преобразовать, например, в список с помощью list().

    Пример 1

    Применим метод str.upper (преобразование в заглавные буквы) к каждому элементу списка [«a», «b»], используя map(). Затем с помощью list() преобразуем получившийся итератор снова в список.

    result = list(map(str.upper, ["a", "b"]))
    print(result)

    Вывод: [«A», «B»]

    Пример 2

    Если передать несколько итерируемых объектов (например, списки [1, 2] и [3, 4]), функция map() должна принимать столько же параметров.

    result = list(map(lambda x, y: x + y, [1, 2], [3, 4]))

    Здесь лямбда-функция складывает элементы двух списков попарно: 

    — Сначала map() применяет лямбду к первым элементам списков 1 + 3 = 4, потом ко вторым 2 + 4 = 6.

    — Затем эти элементы «упаковываются» в список с помощью list().

    print(result)

    Вывод: [4, 6]

    Почему объект map не выводится через print()?

    Если напечатать объект map напрямую, Python выведет его описание, вроде <map object at 0x…>, а не элементы, потому что это итератор, а не список. Чтобы увидеть элементы, нужно преобразовать итератор в список с помощью list() или получить элементы по одному через __next__(). Например:

    my_map = map(str.upper, ["a", "b"])
    print(my_map.__next__())

    Вывод: A

    print(my_map.__next__())

    Вывод: B

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

    Map() используют, когда нужно применить одну и ту же функцию к каждому элементу итерируемого объекта (например, списка). Но давайте разберемся, в чем ее отличие от for и list comprehension, которые решают похожие задачи.

    Сравним конструкции for, map и list comprehension по синтаксису и применению.

    • Цикл for

    Перебирает элементы итерируемого объекта, выполняет указанные действия, добавляет преобразованные результаты в новый список.

    numbers = [1, 2, 3]
    squared = []
    for num in numbers:
        squared.append(num ** 2)
    print(squared)
    
    Вывод: [1, 4, 9]

    Когда использовать: если нужно несколько строк кода (например, условия или вложенные вычисления). Подходит, если для преобразования нужно более чем одна функция.

    • Функция map()

    Применяет заданную функцию к каждому элементу итерируемого объекта и возвращает итератор, который нужно преобразовать в список с помощью list().

    numbers = [1, 2, 3]
    squared = list(map(lambda x: x ** 2, numbers))
    print(squared)

    Когда использовать: когда есть готовая функция и нужно применить ее ко всем элементам. Экономит память для больших данных, так как возвращает итератор.

    • List comprehension

    Создает новый список, применяя выражение к каждому элементу итерируемого объекта в одной строке.

    numbers = [1, 2, 3]
    squared = [num ** 2 for num in numbers]
    print(squared)

    Когда использовать: для простых операций, которые можно записать в виде выражения (например, x ** 2 или x + 10). Удобно, когда код должен быть компактным.

    Примеры использования map()

    Кастомные (пользовательские) функции

    1. Функция преобразования числа в строку

    Например, у нас есть список из чисел numbers, которые являются идентификаторами. Мы хотим добавить к ним префикс ID_, чтобы точно понимать, что это идентификаторы. Для этого создадим функцию add_id_prefix.

    def add_id_prefix(number):  return f"ID_{number}"

    Эта функция возвращает строку, формата ID_1. Создадим список чисел:

    numbers = [1, 2, 3]

    Затем используем на нем функцию map(). С помощью list() преобразуем полученный итератор в список.

    result = list(map(add_id_prefix, numbers))

    Выведем список в консоль:

    print(result)

    Вывод: [‘ID_1’, ‘ID_2’, ‘ID_3’]

    Если мы реализуем ту же самую логику, например, с использованием цикла for, код будет выглядеть так:

    result = []
    for num in numbers:
        result.append(f"ID_{num}")

    Преимущества map()

    Так как map() работает с итератором, это экономит память при обработке больших списков (например, тысяч чисел). Итератор выдает результаты по одному, не создавая промежуточный список в памяти до вызова list().

    1. Функция преобразования стоимости

    Напишем функцию, которая будет применять скидку 10% к каждому элементу списка prices, округляя результат до двух знаков после запятой.

    def apply_discount(price):
        return round(price * 0.9, 2)

    Функция apply_discount умножает цену на 0,9 (скидка 10%) и округляет результат. Цены берем из списка prices.

    prices = [100, 249.99, 50.5]

    В discounted сохраняем список из цен после применения скидки, а затем выводим список в консоль:

    discounted = list(map(apply_discount, prices))
    print(discounted)

    Вывод: [90.0, 224.99, 45.45]

    1. Функция для работы с двумя списками

    Допустим, у нас есть два списка: количества товаров (quantities) и их цен за единицу (prices). Нужно посчитать стоимость для каждого товара.

    Напишем функцию для умножения количества товаров на цену.

    def calculate_total(quantity, price):
        return quantity * price

    Создадим списки quantities и prices.

    quantities = [2, 5, 3]
    prices = [100, 50, 75]

    Затем в totals рассчитываем произведение каждого элемента первого списка и каждого элемента второго списка.

    totals = list(map(calculate_total, quantities, prices))
    print(totals)

    Вывод: [200, 250, 225]

    Преимущества map()

    Map() умеет работать с несколькими итерируемыми объектами параллельно, что упрощает обработку парного соответствия (двух списков, как в примере выше). Это вдвойне удобно для данных, где элементы связаны по индексам.

    Лямбда-функции

    Лямбда-функции — это короткие анонимные функции, которые создаются на месте без использования ключевого слова def. Они удобны для одноразовых операций, которые не требуют отдельной функции, но злоупотреблять ими не стоит, так как их зачастую трудно читать.

    Допустим, у нас есть список чисел, представляющих доли (например, 0.1, 0.25), и вы хотите умножить их на 100, чтобы получить проценты, и отформатировать как строки с символом %.

    Создадим список fractions.

    fractions = [0.1, 0.25, 0.5]

    С помощью лямбда-функции lambda x: f»{x * 100}%» умножим число на 100 и добавим символ %. Map() применит ее к каждому элементу списка fractions.

    result = list(map(lambda x: f"{x * 100}%", fractions))
    print(result)

    Вывод: [‘10.0%’, ‘25.0%’, ‘50.0%’]

    Коротко о функции map() в Python

    • Map() применяет функцию к каждому элементу итерируемого объекта (список, кортеж) и возвращает итератор map.
    • Синтаксис функции map() 
    map(function, iterable[, iterable1, ...])
    • Может заменить цикл for
    • К итератору объекта map можно применить методы __next__() для выдачи элементов и __iter__() для возврата самого итератора. 
    • Для вывода результата через print() объект map нужно преобразовать в список с помощью list().
    • Когда использовать map(): 
      • Для готовых функций или больших данных (итератор экономит память).
      • Когда функция для преобразования одна. Для большего количества преобразований и сложной логики лучше подойдет цикл for.

    Разбор

    Поделиться

    Скопировано
    0 комментариев
    Комментарии