9

这是我的代码:

filter(lambda n,r: not n%r,range(10,20))

我得到错误:

TypeError: <lambda>() takes exactly 2 arguments (1 given)

所以我尝试了:

foo=lambda n,r:not n%r

效果很好。所以我认为这会起作用:

bar=filter(foo,range(10,20))

但同样:

TypeError: <lambda>() takes exactly 2 arguments (1 given)

类似的事情也发生在地图上。但减少工作正常。我究竟做错了什么?我是否遗漏了使用过滤器或地图所需的重要内容?

4

5 回答 5

6

为什么使用 2 个参数?filter()并且map()只需要一个带有单个参数的函数,例如:

filter(lambda x: x >= 2, [1, 2, 3])
>>> [2, 3]

要找到一个数字的因数(您也可以用 lambda 替换它):

def factors(x):
    return [n for n in range(1, x + 1) if x % n == 0]

factors(20)
>>> [1, 2, 4, 5, 10, 20]
于 2012-10-05T18:14:25.347 回答
5

如果您在键值集上运行 map 或 filter,则在 (k,v) 周围添加括号,例如:

  .filter(lambda (k,v): k*2 + v)
于 2015-06-15T14:31:18.793 回答
4

因为filter在 python 中只接受一个参数。因此,如果您想在过滤器中使用它,您需要定义一个只接受一个参数的 lambda/函数。

于 2012-10-05T18:13:52.407 回答
0

您的 lambda 函数有两个参数nr. filter必须使用一个函数调用,该函数接受一个参数并True在应保留该项目时返回。也许您打算定义rn在您的 lambda 函数之外,然后在闭包中捕获它。

于 2012-10-05T18:14:26.773 回答
0

这是因为 map 函数实现的性质,map、reduce 和 filter 的第二个参数是列表,但它如何读取并将值传递给这些方法的第一个参数不同,如果您在下面看到 reduce 函数默认从列表中选择 2 个元素并传递给 lambda 但是 filter 和 map 只需要一个元素。

>>>reduce(lambda x,y: x+ y,range(10))  
45  

>>>filter(lambda x,y: x+ y,range(10))  
Traceback (most recent call last):  
File "<stdin>", line 1, in <module>  
TypeError: <lambda>() takes exactly 2 arguments (1 given)  
>>>filter(lambda x: x+ 1,range(10))  
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]  
>>>  

>>>map(lambda x,y: x+ y,range(10))    
Traceback (most recent call last):  
File "<stdin>", line 1, in <module>  
TypeError: <lambda>() takes exactly 2 arguments (1 given)  
>>>  
>>>map(lambda x: x+1, range(10))  
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]  
>>>  
于 2019-02-03T04:27:23.187 回答