2011-06-05 91 views
14

这里发生了什么?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整除,但“拉姆达X,Y:X + Y”的一部分被绊倒了我。

回答

15

这是不好的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 

只是简单地添加它的操作数。

4

A lambda指定一个匿名函数。语法lambda x,y: x+y可以用英语“通过这种操作的结果将宣布一个匿名函数取名叫xy两个参数。进行操作x+y。这个匿名函数的返回值”可以表述为

reduce应用一些功能依次到提供的列表的前两个元素,然后到该函数的结果和第三个元素,依此类推。因此,在所提供的代码拉姆达用于通过降低以添加所提供的列表中的元素一起,其中将包含所有的3的倍数和5小于1000

6

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的所有数的总和)...因此...)

+0

闭合形式的解决方案实际上比建议。您需要添加3的所有倍数和5的所有倍数,然后再减去15的倍数,因为它们被添加了两次。 – 2011-06-05 16:06:19

+0

是的,这正是公式,但对我来说似乎并不复杂...... – 6502 2011-06-05 16:57:25