map
создает новый список, применяя функцию к каждому элементу источника:
xs = [1, 2, 3]
# all of those are equivalent — the output is [2, 4, 6]
# 1. map
ys = map(lambda x: x * 2, xs)
# 2. list comprehension
ys = [x * 2 for x in xs]
# 3. explicit loop
ys = []
for x in xs:
ys.append(x * 2)
n-ary map
эквивалентно объединению повторяющихся итераций ввода, а затем применение функции преобразования на каждый элемент этого промежуточного списка. Это не декартово произведение:
xs = [1, 2, 3]
ys = [2, 4, 6]
def f(x, y):
return (x * 2, y // 2)
# output: [(2, 1), (4, 2), (6, 3)]
# 1. map
zs = map(f, xs, ys)
# 2. list comp
zs = [f(x, y) for x, y in zip(xs, ys)]
# 3. explicit loop
zs = []
for x, y in zip(xs, ys):
zs.append(f(x, y))
Здесь я использовал zip
, но поведение map
на самом деле немного отличается, когда итераторы не имеют одинаковый размер - как отмечено в его документации, оно расширяет итерации, чтобы содержать None
.