我在多参数函数中使用元组时遇到 TypeError。这是我的代码:
def add(*args):
result = 0
for x in args:
result = result + x
return result
items = 5, 7, 4, 12
total = add(items)
print(total)
这是错误:
Traceback (most recent call last):
File "e:functions.py", line 9, in <module>
total = add(items)
File "e:functions.py", line 4, in add
result = result + x
TypeError: unsupported operand type(s) for +: 'int' and 'tuple'
如果我直接输入参数而不是使用变量,我没有收到任何错误:
total = add(5, 7, 4, 12)
我用Java编码,我刚刚开始使用Python,我不知道为什么会这样。
您将元组items
作为单个参数传递给add
,该参数的编写是为了期望任意数量的单个数字参数而不是单个可迭代参数(这就是*args
语法所做的 - 它需要人工数量的参数并将它们转换为函数内部的可迭代对象)。
发生TypeError
是因为您的for x in args
正在获取items
的值作为其第一个值x
(因为它是第一个参数),因此您的函数正在尝试执行操作0 + (5, 7, 4, 12)
,这是无效的,因为您无法向tuple
添加int
(这就是错误消息这么说的原因)。
要将单个项目作为单独的参数传递,请执行以下操作:
total = add(5, 7, 4, 12)
或者通过在调用方中镜像*
语法来解压缩元组,如下所示:
total = add(*items)
请注意,Python 有一个名为sum
的内置函数,它将完全按照你想要对元组执行的操作:
total = sum(items)
您可以通过从函数定义中的*args
中删除*
,从add
函数中获得相同的行为。
当你这样做时。
items = 5, 7, 4, 12 #tuple & it looks like this (5,7,4,12)
total = add(items)
您将items
变量传递给add
函数,通常它看起来像这样。
total = add((5,7,4,12))#Not like this add(5,7,4,12)
井。。。这是正确的,它没有错,但基于你的目标,这不是正确的方法。在此处了解有关 *args 的更多信息。
这是你期望做的,你可以通过unpacking
另一个答案所暗示的来做到这一点。
add(5,7,4,12)
因为你所做的是你传递了整个元组,所以你的args
参数看起来像这样((5,7,4,12))
,当你做一个for循环时,你iterating
元组(这是args)对象的值,这是这个(5,7,4,12)
,然后将其添加到一个int
,这显然是一个错误,如前所述。
TypeError: unsupported operand type(s) for +: 'int' and 'tuple'
def add(*args):
result = 0
for x in args:
result = result + x
return result
items = 5, 7, 4, 12
total = add(*items)
print(total)
只需在total = add(*items)
中添加一个随机的 *
结果:
28
**(双星/星号)和*(星号/星号)对参数有什么作用?
星号 * 在 Python 中是什么意思?[重复]