Лямбда-функция Python

Что здесь происходит?

reduce(lambda x,y: x+y, [x for x in range(1,1000) if x % 3 == 0 or x % 5 == 0])

Я понимаю, как x итерирует все числа от 1 до 999 и вынимает те, которые делятся на 3 или 5, но часть лямбда x, y: x + y превзошла меня.

Ответы

Ответ 1

Это плохой Python для

sum(x for x in range(1,1000) if x % 3 == 0 or x % 5 == 0)

Он просто суммирует все числа в диапазоне 1.999, делящихся на 3 или 5.

reduce() применяет данную функцию к первым двум элементам итерабельного, а затем к результату и следующему элементу итерабельного, и так далее. В этом примере функция

lambda x, y: x + y

просто добавляет свои операнды.

Ответ 2

говоря,

f = lambda x, y : x + y

почти то же самое, что сказать

def f(x, y):
    return x + y

Другими словами, lambda возвращает функцию, заданную параметрами слева от знака :, возвращает значение выражения справа от него.

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

Использованное вами показание, однако, довольно плохое, потому что лямбда существует бессмысленно... Python позволил бы вычислить эту сумму непосредственно вместо использования reduce.

Кроме того, кстати, для результата этого вычисления существует простое решение замкнутой формы, которое вообще не требует никакой итерации... (подсказка: сумма всех чисел от 1 до n равна n*(n+1)/2 и сумма всех кратных 5 от 5 до n равна 5 * (сумма всех чисел от 1 до n/5)... поэтому...)

Ответ 3

A lambda обозначает анонимную функцию. Синтаксис lambda x,y: x+y можно указать на английском языке как "объявить безымянную функцию с двумя параметрами с именем x и y. Выполнить операцию x+y. Возвращаемое значение этой безымянной функции будет результатом этой операции"

reduce последовательно применяет некоторые функции к первым двум элементам поставляемого списка, затем к результату этой функции и третьего элемента и так далее. Таким образом, лямбда в прилагаемом коде используется сокращением, чтобы скомпоновать элементы прилагаемого списка, который будет содержать все кратные 3 и 5 меньше 1000.