类型错误:<lambda>() 缺少 1 个必需的位置参数:'w'
Posted
技术标签:
【中文标题】类型错误:<lambda>() 缺少 1 个必需的位置参数:\'w\'【英文标题】: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
。对吗?
【参考方案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))
使用map
和lambda
没什么兴趣,生成器理解等效:
(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,更短更清晰
【讨论】:
以上是关于类型错误:<lambda>() 缺少 1 个必需的位置参数:'w'的主要内容,如果未能解决你的问题,请参考以下文章
从 web3py 发送原始交易:TypeError: <lambda>() 缺少 4 个必需的位置参数:'hash'、'r'、's' 和 'v'