【问题标题】:Why is lambda asking for 2 arguments despite being given 2 arguments?尽管给出了 2 个参数,为什么 lambda 仍要求 2 个参数?
【发布时间】:2012-09-26 22:28:42
【问题描述】:

这是我的代码:

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)

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

【问题讨论】:

  • filter() 将单个参数传递给您的 lambda,而它需要两个参数。使用变量不会让你绕过它。

标签: python map filter lambda


【解决方案1】:

为什么要使用 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]

【讨论】:

  • 好吧,这是有道理的。那么我该如何编写这段代码,它必须返回一个数字的因子。我想使用过滤器或映射,以便我更好地理解它......或者至少是 lambda
  • 当然你可以优化它只搜索到 sqrt(x),并在 x % n == 0 时将 x/n 和 n 添加到结果中。当数字变大时,情况会有所不同。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        这是由于 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]  
        >>>  
        

        【讨论】:

        • 您的原始问题可以使用下面的列表理解来解决 >>> [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] >>>
        猜你喜欢
        • 2021-01-18
        • 1970-01-01
        • 2017-12-29
        • 2020-12-29
        • 2021-11-03
        • 1970-01-01
        • 1970-01-01
        • 2016-02-27
        • 1970-01-01
        相关资源
        最近更新 更多