自定义sum函数结合zip()求和触发TypeError,求错误原因解析
自定义sum函数触发TypeError的原因分析
先回顾下你最初的正确实现,用列表推导式结合zip()和Python内置的sum(),运行完全没问题:
a = [1,2,3] b = [4,5,6] three = [sum(i) for i in zip(a,b)] print(three)
输出结果:[5, 7, 9]
但你尝试自己写函数实现相同功能时,却碰到了参数错误,你的代码是这样的:
def sum(a,b): for i in zip(a,b): return sum(i) print(sum([1,2,3], [5,6,7]))
触发的错误提示:
return sum(i)
TypeError: sum() missing 1 required positional argument: 'b'
问题出在哪?
1. 函数名和内置sum()冲突了
你给自己的函数起了个名字叫sum,这直接把Python自带的sum()函数给覆盖了!当你在函数内部写sum(i)的时候,Python不会再调用那个可以接收单个可迭代对象的内置sum,而是会去找你定义的这个需要两个参数a和b的sum函数。你只传了一个参数i(也就是zip(a,b)返回的元组,比如第一个是(1,5)),自然就会报错说缺少第二个参数b。
2. 函数逻辑本身也有问题
就算你把函数名改成别的(比如sum_two_lists),现在的逻辑还是不对:你在for循环的第一次迭代就直接return了,这样函数只会返回第一对元素的和,根本不会遍历完所有配对的元素。
修正后的正确写法
咱们把函数名改得不冲突,同时修正逻辑:
def sum_two_lists(a, b): # 用列表推导式直接生成结果列表 return [sum(pair) for pair in zip(a, b)] # 或者用循环的方式写,更直观: # def sum_two_lists(a, b): # result = [] # for num1, num2 in zip(a, b): # result.append(num1 + num2) # return result print(sum_two_lists([1,2,3], [5,6,7]))
运行后就能得到正确的输出[6, 8, 10]啦。
内容的提问来源于stack exchange,提问作者saks
相关产品推荐
相关产品推荐

