Python lambda函数

sta*_*rob 16 python lambda

这里发生了什么?

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

我理解x是如何迭代从1到999的所有数字并取出那些可以被3或5整除的数字,但是'lambda x,y:x + y'部分让我感到难过.

Sve*_*ach 18

这是糟糕的Python

sum(x for x in range(1,1000) if x % 3 == 0 or x % 5 == 0)
Run Code Online (Sandbox Code Playgroud)

它只是将1..999范围内的所有数字相加,可以被3或5整除.

reduce()将给定函数应用于iterable的前两项,然后应用于结果和iterable的下一项,依此类推.在这个例子中,函数

lambda x, y: x + y
Run Code Online (Sandbox Code Playgroud)

只需添加其操作数.


650*_*502 9

f = lambda x, y : x + y
Run Code Online (Sandbox Code Playgroud)

几乎和说的一样

def f(x, y):
    return x + y
Run Code Online (Sandbox Code Playgroud)

换句话说,lambda返回一个函数,给出:符号左边的参数将返回右边表达式的值.

然而,关于函数是非常有限的,例如仅允许一个表达式而不允许语句.这不是一个严重的问题,因为在Python中你甚至可以在另一个函数的中间定义一个完整的函数并传递它.

你显示的用法非常糟糕,因为lambda没有意义...... Python允许直接计算这个总和而不是使用reduce.

顺便说一句,对于计算的结果,有一个简单的封闭形式的解决方案,根本不需要任何迭代...(提示:从1到n的所有数字n*(n+1)/2的总和是和所有数字的总和从5到n的5的倍数是5*(从1到n/5的所有数字的总和)...因此...)


Nat*_*ate 5

A lambda指定一个匿名函数。该语法lambda x,y: x+y可以用英语表示为“声明一个无名函数,它使用两个名为x和的参数y。执行该操作x+y。该无名函数的返回值将取决于该操作的结果”

reduce依次将某些函数应用于所提供列表的前两个元素,然后应用于该函数的结果和第三个元素,依此类推。因此,所提供的代码中的lambda可通过reduce来使用,以将所提供列表的元素加在一起,该列表将包含小于1000的3和5的所有倍数。