Лямбда-функция 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.