为什么Lambda要求传入两个参数,尽管已经传入了两个参数?

9
这是我的代码:
filter(lambda n,r: not n%r, range(10,20))
出现了错误:
TypeError: () takes exactly 2 arguments (1 given)
所以我尝试了:
foo = lambda n,r:not n%r 这样可以正常工作。所以我想这样也可以:
bar = filter(foo, range(10,20))
但是,又出现了错误:
TypeError: () takes exactly 2 arguments (1 given)
map也有类似的问题。但是reduce可以正常工作。我做错了什么?我是否忽略了一些使用filter或map所必需的关键步骤?

1
filter() 会向你的 lambda 函数传递一个参数,但它需要两个参数。使用变量无法解决这个问题。 - NullUserException
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]

好的,那么我该如何编写这个代码呢?它需要返回一个数字的因子。我想使用filter或map,以便更好地理解它...或者至少是lambda。 - ritratt
1
当然,你可以对此进行优化,只要搜索到sqrt(x)即可,并且每当x%n == 0时将x / n和n添加到结果中。当数字变大时,这将产生巨大的差异。 - NullUserException

5

如果你在一个键值对集合上运行map或filter函数,那么需要在(k,v)周围添加括号,例如:

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

4

因为在Python中,filter只接受一个参数。所以如果你想要在filter中使用它,你需要定义一个仅接受一个参数的lambda函数。


0

你的 Lambda 函数需要两个参数 nr。必须使用一个接受一个参数并返回 True 的函数来调用 filter,以保留项目。也许你想在 Lambda 函数外定义 rn,然后在闭包中捕获它。


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]  
>>>  

您的原始问题可以使用以下列表推导式来解决:
[n for n in range(10,20) for r in range(10,20) if not n%r]
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
- abhay dalvi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接