【问题标题】:TypeError: <lambda>() missing 1 required positional argument: 'w'类型错误:<lambda>() 缺少 1 个必需的位置参数:'w'
【发布时间】:2018-09-12 14:03:16
【问题描述】:

代码在这里

return self.activator(reduce(lambda a, b: a+b, map(lambda x, w: x*w, zip(input_vec, self.weights)), 0.0) + self.bias)

python2.7版本的代码如lambda (x, w)

但是现在 Tuple 参数解包被移除了 所以我不知道如何计算:(

【问题讨论】:

  • 如果我没听错的话,你会看到 map 需要一个只有一个元素的函数。如果您映射元组列表,则可以使用索引获取值。 x = (13, 37) 打印(x[0], x[1])
  • emmmmm 看不懂你的意思。w的参数还是不够
  • @yizhui liu 你不应该使用 x 和 y 作为参数,而只能在函数体中使用一个参数和索引。我用代码回答了这个问题。希望有帮助。 Look here
  • 请澄清:我认为您的意思是您使用的是 Python 3,并且由于删除了元组解包,您不能再将输入为元组的 lambda fn 声明为 lambda (x, w) 并自动获取其输入 arg 解压缩为 x,w。对吗?

标签: python python-3.x lambda tuples iterable-unpacking


【解决方案1】:

制作一个小的运行示例来显示问题是一件好事。在您的情况下,事实并非如此,因为我们缺少一些变量。就像我在另一条评论中所说的那样,您映射的列表是由元组组成的。就像您已经知道的那样,您不能再解包元组,但是您可以像在数组上使用索引一样使用索引。一个简单的工作示例:

val = reduce(lambda a, b: a+b, map(lambda t: t[0]*t[1], zip([10, 20, 30], [0.1, 0.3, 0.7])), 0.0)
print(val)

如您所见,传递给 map 函数的 lambda 函数现在只有一个参数。我称它为 t 是为了表明这是一个元组,如果你愿意,你可以称它为 x。在函数体中,我使用索引来获取元组的第一个和第二个元素。如果您运行此代码,您会发现它有效。所以下一步就是让你的代码适应它:

return self.activator(reduce(lambda a, b: a+b, map(lambda t: t[0]*t[1], zip(input_vec, self.weights)), 0.0) + self.bias)

这应该可以解决问题。

【讨论】:

    【解决方案2】:

    你不能再拆包了。但是,您可以直接采用元组,并在公式中使用索引:

    map(lambda t: t[0]*t[1], zip(input_vec, self.weights))
    

    使用maplambda 没什么兴趣,生成器理解等效:

    (x*w for x,w in zip(input_vec, self.weights))    
    

    (和解包工作)

    需要对外部lambda 甚至reduce 重复相同的构造,这可以通过执行元素求和的sum 完全消除:

    return self.activator(sum(x*w for x,w in zip(input_vec, self.weights)) + self.bias)
    

    没有更多的 lambda,更短更清晰

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-11
      • 1970-01-01
      • 2021-08-05
      • 2021-07-06
      • 2021-08-05
      • 2017-07-23
      相关资源
      最近更新 更多