Сообщить об ошибке.

Функция map() в Python, обработка последовательности без цикла

Применяет определенную функцию к каждому элементу в последовательности

Синтаксис:

map(function, iterable, /, *iterables, strict=False)

Параметры:

  • function - пользовательская функция, вызывается для каждого элемента,
  • iterable - последовательность или объект, поддерживающий итерирование,
  • *iterables - дополнительные последовательность или объекты, поддерживающие итерирование,
  • strict - если имеет значение True и одна из итераций исчерпывается раньше остальных, то выдается ValueError .

Добавлено в Python 3.14: добавлен аргумент strict.

Возвращаемое значение:

  • map object - объект итератора.

Описание:

Функция map() выполняет пользовательскую функцию function для каждого элемента последовательности, коллекции или итератора iterable. Каждый элемент iterable отправляется в функцию function в качестве аргумента.

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

# функция должна принимать столько
# аргументов, сколько последовательностей
# передается в функцию map()
def plus(a, b, c):
  return a + b +c

# функция 'plus' применяется к элементам 
# из всех последовательностей параллельно
>>> x = map(plus, [1, 2], [3, 4], [5, 6])
>>> list(x)
# [9, 12]

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

def create_tuple(a, b):
    return a, b

# функция `map()` останавливается, когда 
# заканчивается самая короткая последовательность
>>> x = map(create_tuple, ['a', 'b'], [3, 4, 5])
>>> print(dict(x))
# {'a': 3, 'b': 4}

В случае, если аргумент strict имеет значение True (добавлено в Python 3.14) и одна из итераций исчерпывается раньше остальных, то будет подниматься исключение ValueError.

Можно также использовать любую встроенную функцию с функцией map() при условии, что функция принимает аргумент и возвращает значение.

>>> x = [1, 2, 3]
>>> y = [4, 5, 6, 7]
# вычисление при помощи встроенной функции 'pow()' 
# 'x' в степени 'y' для каждого элемента 2-х списков
>>> list(map(pow, x, y))
# [1, 32, 729]

Для случаев, когда входные данные функции уже организованы в кортежи аргументов, смотрите функцию itertools.starmap().

from itertools import starmap

data = [(1, 2), (3, 4)]
result = starmap(lambda x, y: x * y, data)
print(list(result))  
# [2, 12]

Преимуществ использования функции map():

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

Распространённые ошибки при использовании функции map()

  1. Забывают преобразовать результат в список/кортеж

    result = map(lambda x: x*2, [1,2,3])
    print(result)  
    # <map object at 0x...>
    
  2. Передают неправильное количество аргументов

    # Ошибка: lambda принимает 1 аргумент, а получает 2
    list(map(lambda x: x + 1, [1, 2], [3, 4]))
    

Когда не использовать функцию map():

  • Для побочных эффектов (например, печати).
  • При сложных условиях (лучше цикл for или генераторы с if).
  • Если нужны индексы (используйте enumerate).

Примеры обработки последовательностей без циклов.

Подсчет количества символов в каждом элементе кортежа:

>>> x = map(len, ('apple', 'banana', 'cherry'))
>>> list(x)
# [5, 6, 6]

Создание словаря из двух списков.

>>> x = map(lambda *args: args, [1, 2], [3, 4])
>>> dict(x)
# {1: 3, 2: 4}

Удаление пунктуации в тексте при помощи map().

>>> import re
>>> def clean(word):
...        return re.sub(r"[`!?.:;,'\"()-]", "", word.strip())

>>> text = """С помощью цикла `for .. in:` программе 
необходимо хранить в памяти системы весь (список)! """
>>> word = text.split()
>>> word = map(clean, word)
>>> text = ' '.join(word)
>>> text
# 'С помощью цикла for  in программе необходимо 
# хранить в памяти системы весь список'

Отладка и обработка ошибок в map()

  • Проблема: Ошибки в map() трудно отслеживать.
  • Решение: Оберните функцию в try/except:
def safe_convert(x):
    try:
        return int(x)
    except ValueError:
        return None
values = list(map(safe_convert, ['1', 'a', '2']))

Избегайте map() там, где уместны генераторы списков

Через map (менее читаемо)

# преобразование в список
squares = list(map(lambda x: x**2, range(10)))

Через генераторы списков (предпочтительно). Генераторы списков часто понятнее для простых преобразований.

squares = [x**2 for x in range(10)]

Используйте map() с встроенными функциями

Почему: Эффективно и минимизирует код.

Преобразование строк в числа:

>>> str_numbers = ['1', '2', '3']
>>> numbers = list(map(int, str_numbers))  
>>> numbers
# [1, 2, 3]

Обработка структур данных

Извлечение значений из словарей:

>>> users = [{'name': 'Alice'}, {'name': 'Bob'}]
>>> names = list(map(lambda x: x['name'], users))  
>>> names
# ['Alice', 'Bob']

Обработка файла без загрузки в память.

Экономит память с ленивыми вычислениями

# Итератор для построчной обработки
lines = map(str.strip, open('data.txt'))  
# цикл обработки полученного итератора
for line in lines:
    print(line)

Вывод:

  • Сильные стороны: Производительность, лаконичность, функциональный стиль.
  • Слабые стороны: Читаемость при сложных операциях, ограниченная гибкость.
  • Альтернативы: Списковые включения, генераторы, pandas/numpy для табличных данных.