Эта строка проста:
print(g(res[-1] + [0], [0] + res[-1]))
Она вызывает функцию только один раз с аргументами [1, 0]
и [0, 1]
.Эти два списка сцепленных продуктов производят [1,0,0,1]
ОБНОВЛЕНО И ИСПРАВЛЕНО:
Мой первый ответ описывал случай с одной итерацией, но это карта с двумя итерациями.
Строка с map вызывает функцию (лямбда или обычную, не имеет значения) один раз для каждого набора аргументов.Как именно формируются эти аргументы, описано в документах:
Возвращает итератор, который применяет функцию к каждому элементу итерируемого, давая результаты.Если передаются дополнительные итерируемые аргументы, функция должна принимать столько аргументов и применяется к элементам из всех итерируемых параллельно.С несколькими итерациями итератор останавливается, когда самая короткая итерация исчерпана.
Я переформатировал эту строку:
print(list(map(
lambda x, y: x + y, # call this function repeatedly
res[-1] + [0], # X's are takes from this list,
[0] + res[-1] # Y's are taken from this list,
)))
Будет столько же вызовов, сколько и значений всписки (в самом коротком, если быть точным).Первый вызов имеет аргументы 1, 0;аргументы второго вызова - 0, 1. Каждый набор аргументов имеет два значения, потому что передано два списка (списки, конечно, итерируемые), поэтому он соответствует функции, которая ожидает два аргумента (x
и y
).Если бы было три или более итераций, TypeError
.
Первый вызов добавляет 1 + 0, второй вызов добавляет 0 + 1.В результате получается список [1,1]
.
Другой пример (100 + 1, 200 + 2, 300 + 3) -> [101,202,303]:
print(list(map(
lambda x, y: x + y, # call this function repeatedly
[100,200,300], # X's are takes from this list,
[1,2,3] # Y's are taken from this list,
)))
Вы можете добавитьотладка вывода до определения g
, чтобы увидеть, что вычисляется.
def g(x, y):
print(f"debug: {x} + {y} -> {x+y}")
return x+y
Не имеет значения, определена ли функция как лямбда или нет.Вы можете написать map
следующим образом:
print(list(map(g, res[-1] + [0], [0] + res[-1])))
и протестировать программу с другими данными.