Python lambda 函数
这里发生了什么呢?
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整除的数字,但'lambda x,y: x+y'这一部分让我感到困惑。
3 个回答
一个 lambda
是用来表示一个没有名字的函数。它的写法 lambda x,y: x+y
可以用简单的话说就是:“声明一个没有名字的函数,这个函数有两个参数,叫做 x
和 y
。这个函数会执行 x+y
的操作。这个没有名字的函数的返回值就是这个操作的结果。”
reduce
是一个函数,它会把某个函数依次应用到提供的列表的前两个元素上,然后再把这个函数的结果和第三个元素一起处理,依此类推。因此,在提供的代码中,reduce
使用了这个 lambda 函数来把列表中的元素加起来,这个列表里会包含所有小于1000的3和5的倍数。
说
f = lambda x, y : x + y
几乎和说
def f(x, y):
return x + y
是一样的。换句话说,lambda
返回一个函数,这个函数根据冒号左边的参数,会返回冒号右边表达式的值。
不过,关于函数的使用是比较有限的,比如它只允许一个表达式,不允许有其他语句。不过这并不是大问题,因为在 Python 中,你可以在一个函数里定义一个完整的函数,并且可以把它传递进去。
不过,你展示的用法其实挺糟糕的,因为在那种情况下用 lambda 是没有意义的…… Python 允许直接计算那个和,而不是用 reduce
。
另外,顺便提一下,那个计算的结果其实有一个简单的公式解,不需要任何迭代……(提示:从 1 到 n 的所有数字的和是 n*(n+1)/2
,而从 5 到 n 的所有 5 的倍数的和是 5*(从 1 到 n/5 的所有数字的和)……所以……)
这段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
这个函数就是简单地把它的两个输入相加。