尽管有2个参数,为什么lambda要求2个参数?

时间:2012-10-05 18:11:23

标签: python map filter lambda

这是我的代码:

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)

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

5 个答案:

答案 0 :(得分: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]

答案 1 :(得分:5)

If you run map or filter on a key-value set, then add parentheses around (k,v), like:

  .filter(lambda (k,v): k*2 + v)

答案 2 :(得分:4)

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

这是由于map函数实现的性质所致,map,reduce和filter的第二个参数是list,但它读取和传递值到这些方法的第一个参数的方式不同,如果您在下面看到reduce函数的默认选择2从list传递到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]  
>>>