Открыть сервисСервис

Функция map в Python

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

Общие сведения

В Python 3 map возвращает итератор объекта map, а не список, как было в Python 2. Это означает, что вычисления происходят только при обращении к элементам — например, при переборе в цикле for или при преобразовании в список через list(). Такой подход экономит память при работе с большими объёмами данных.

Простейший пример:

``python result = map(str.upper, ["привет", "мир"]) print(list(result)) # ['ПРИВЕТ', 'МИР'] ``

Здесь встроенная функция str.upper применяется к каждому строковому элементу списка.

Сигнатура и параметры

`` map(function, iterable, iterable2, ...) ``

Если передано несколько итерируемых объектов, функция вызывается с элементами из каждого по очереди до тех пор, пока не закончится самый короткий из них (принцип «zip»). Если функция не указана (первый аргумент — None), map выполняет роль итератора, аналогичного zip(*iterables).

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

Одна функция и один итерируемый объект

``python numbers = [1, 2, 3, 4, 5] squared = list(map(lambda x: x ** 2, numbers)) print(squared) # [1, 4, 9, 16, 25] ``

Несколько итерируемых объектов

``python a = [1, 2, 3] b = [10, 20, 30] total = list(map(lambda x, y: x + y, a, b)) print(total) # [11, 22, 33] ``

Работа со строками

``python digits = list(map(int, "12345")) print(digits) # [1, 4, 9, 16, 25] — нет, [1, 2, 3, 4, 5] ``

Преобразование типов

``python strings = ["1", "2", "3"] numbers = list(map(int, strings)) ``

Ленивые вычисления

Ключевая особенность map — ленивость. Итератор вычисляет очередной элемент только при вызове __next__. Это позволяет обрабатывать потоковые данные без загрузки всего набора в память:

``python with open("big_file.txt") as f: for line in map(str.strip, f): process(line) ``

Повторный проход по итератору map невозможен — после исчерпания он возвращает StopIteration. Для повторного использования результатов необходимо преобразовать их в список.

map и list comprehension

Альтернативой map являются генераторные и списковые включения (list comprehension). С точки зрения производительности map часто быстрее при вызове встроенных функций (str, int, float), так как избегает затрат на создание объектов функций-замыканий. Однако list comprehension обычно читабельнее для сложных выражений:

```python

Оба варианта эквивалентны

result1 = list(map(lambda x: x 2 + 1, numbers)) result2 = [x 2 + 1 for x in numbers] ```

Рекомендация сообщества Python (PEP 8) — предпочитать list comprehension, если выражение умещается в одну строку, и использовать map с именованной функцией, когда это естественнее.

map и filter, reduce

map часто используется в связке с filter (фильтрация элементов по условию) и functools.reduce (свёртка последовательности в одно значение). Все три относятся к функциональному программированию:

```python from functools import reduce numbers = [1, 2, 3, 4, 5] result = reduce(lambda a, b: a + b, filter(lambda x: x % 2 == 0, map(lambda x: x ** 2, numbers)))

map: [1, 4, 9, 16, 25] → filter: [4, 16] → reduce: 20

```

Итератор map как объект

Объект map поддерживает протокол итератора: методы __iter__ и __next__. Его можно передавать в функции, ожидающие итератор (next(), sum(), any(), all(), конструкторы tuple, set, dict). Для получения списка используется list(map(...)), для кортежа — tuple(...).

Применение

map применяется в обработке данных, преобразовании типов, работе с файлами и потоками, функциональном программировании. В сочетании с итераторами и генераторами позволяет строить конвейеры обработки данных без промежуточного хранения промежуточных результатов.

Источники:

  • Официальная документация Python: встроенная функция map (docs.python.org)
  • «Python Cookbook», Д. Бизли, Б. Джонс — раздел о функциональных итераторах
  • PEP 8 — Style Guide for Python Code
  • «Грокаем алгоритмы», А. Бхаргава — глава о функциональном программировании
Заметили ошибку или не согласны с информацией в статье? Напишите нам support@bfometr.ru