在 Python 中使用 *args 时出现类型错误
TypeError while using *args in Python
我在多参数函数中使用元组时遇到类型错误。这是我的代码:
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)
,这是无效的,因为你不能将 int
添加到 tuple
(这就是错误消息这么说的原因)。
要将单个项目作为单个参数传递,请执行:
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)
嗯...这是正确的,没有任何问题,但根据您的 objective,这不是正确的方法。在此处了解有关 *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
What does ** (double star/asterisk) and * (star/asterisk) do for parameters?
What does asterisk * mean in Python? [duplicate]
我在多参数函数中使用元组时遇到类型错误。这是我的代码:
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)
,这是无效的,因为你不能将 int
添加到 tuple
(这就是错误消息这么说的原因)。
要将单个项目作为单个参数传递,请执行:
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)
嗯...这是正确的,没有任何问题,但根据您的 objective,这不是正确的方法。在此处了解有关 *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
What does ** (double star/asterisk) and * (star/asterisk) do for parameters?
What does asterisk * mean in Python? [duplicate]