-1

在多参数函数中使用元组时出现 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,但我不知道为什么会这样。

4

3 回答 3

4

您将元组items作为单个参数传递给add,它被编写为期望任意数量的单个数字参数而不是单个可迭代参数(这就是*args语法的作用——它需要一个任意数量的参数并将它们转换为在函数内部可迭代)。

发生这种TypeError情况是因为您for x in args将 的值items作为其第一个值x(因为它是第一个参数),因此您的函数正在尝试执行操作0 + (5, 7, 4, 12),这是无效的,因为您无法将 an 添加int到 a tuple(即为什么错误消息这么说)。

要将单个项目作为单个参数传递,请执行以下操作:

total = add(5, 7, 4, 12)

*或者通过镜像调用者中的语法来解包元组,如下所示:

total = add(*items)

请注意,Python 有一个名为的内置函数sum,它将完全按照您想要对元组执行的操作:

total = sum(items)

通过从函数定义中add删除 ,您可以从函数中获得相同的行为。**args

于 2020-12-29T16:48:37.610 回答
2

当你这样做时。

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)对象的值,它是 this (5,7,4,12)& 然后将它添加到int显然是一个错误就像声明的那样。

TypeError: unsupported operand type(s) for +: 'int' and 'tuple'
于 2020-12-29T16:55:43.750 回答
1
def add(*args):
    result = 0
    for x in args:
        result = result + x
    return result

items = 5, 7, 4, 12
total = add(*items)
print(total)

只需添加一个随机 * intotal = add(*items)

结果:

28

**(双星/星号)和*(星号/星号)对参数有什么作用?

星号 * 在 Python 中是什么意思?[复制]

于 2020-12-29T17:20:51.093 回答