Python3移除元组参数解包后lambda报TypeError的解决咨询
解决Python3中
lambda参数缺失的TypeError问题 你遇到的这个TypeError: <lambda>() missing 1 required positional argument: 'w',核心原因是两个点:一是Python3移除了Python2里支持的元组参数解包写法;二是你的map用法存在参数传递不匹配的问题——zip(input_vec, self.weights)生成的是一个个二元组(比如(x, w)),但map会把每个元组作为单个参数传给后面的lambda,而你定义的lambda x, w: x*w期望接收两个独立参数,自然就会报缺少w的错误。
下面给你几种实用的解决方案,按推荐程度排序:
方案1:用sum替代reduce+map(最简洁高效)
原来的reduce(lambda a, b: a+b, ..., 0.0)本质就是求和操作,Python内置的sum()函数更直观且性能更优,我们可以直接用生成器表达式计算输入向量和权重的点积:
return self.activator(sum(x * w for x, w in zip(input_vec, self.weights)) + self.bias)
这种写法完全避开了lambda参数的坑,代码可读性也大幅提升。
方案2:用itertools.starmap替代map
如果你想保留函数式编程的风格,可以用itertools.starmap——它会自动把每个元组里的元素拆成独立参数传给lambda,完美匹配你原来的lambda x, w: x*w定义:
首先导入模块:
import itertools
然后修改代码:
return self.activator(reduce(lambda a, b: a+b, itertools.starmap(lambda x, w: x*w, zip(input_vec, self.weights)), 0.0) + self.bias)
方案3:调整lambda接收元组并手动解包
如果不想导入额外模块,也可以修改lambda的参数,让它接收单个元组参数后手动提取元素:
return self.activator(reduce(lambda a, b: a+b, map(lambda pair: pair[0] * pair[1], zip(input_vec, self.weights)), 0.0) + self.bias)
或者用Python3支持的元组解构写法(可读性稍弱):
return self.activator(reduce(lambda a, b: a+b, map(lambda (*pair): pair[0] * pair[1], zip(input_vec, self.weights)), 0.0) + self.bias)
内容的提问来源于stack exchange,提问作者yizhuo liu
相关产品推荐
相关产品推荐

