Функция 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, ...) ``
- function — вызываемый объект (обычная функция, лямбда, метод, встроенная функция);
- iterable — итерируемый объект (список, кортеж, строка, множество, словарь, генератор);
- дополнительные итерируемые объекты необязательны.
Если передано несколько итерируемых объектов, функция вызывается с элементами из каждого по очереди до тех пор, пока не закончится самый короткий из них (принцип «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
- «Грокаем алгоритмы», А. Бхаргава — глава о функциональном программировании
