Есть ли разница между использованием лямбда-функции в качестве функции и лямбда-выражения с картой? - PullRequest
0 голосов
/ 12 мая 2019

когда я использую лямбду в качестве функции, результатом является список соединений.но когда я использую лямбду с картой, результатом является сумма двух списков.

res = [[1]]
g = lambda x, y: x + y
print(g(res[-1] + [0], [0] + res[-1]))
print(list(map(lambda x, y: x + y, res[-1] + [0], [0] + res[-1])))

[1, 0, 0, 1] [1, 1]

1 Ответ

1 голос
/ 12 мая 2019

Эта строка проста:

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])))

и протестировать программу с другими данными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...