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()
Забывают преобразовать результат в список/кортеж
result = map(lambda x: x*2, [1,2,3]) print(result) # <map object at 0x...>
Передают неправильное количество аргументов
# Ошибка: lambda принимает 1 аргумент, а получает 2 list(map(lambda x: x + 1, [1, 2], [3, 4]))
map()
:for
или генераторы с if
).enumerate
).map()
;map()
там, где уместны генераторы списков;map()
с встроенными функциями;>>> 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()
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
для табличных данных.