我想学习如何在python函数中传递任意数量的args,所以我以递归的方式编写了一个简单的求和函数,如下所示:
def mySum(*args):
if len(args) == 1:
return args[0]
else:
return args[-1] + mySum(args[:-1])
但是当我测试mySum(3, 4)
时,我收到了这个错误:
TypeError: unsupported operand type(s) for +: 'int' and 'tuple'
有没有人对此有所了解并且给我一些线索来纠正它?
答案 0 :(得分:14)
这一行:
return args[-1] + mySum(args[:-1])
args[:-1]
返回参数元组的一部分。我假设你的目标是使用参数片段递归调用你的函数。不幸的是,您当前的代码只是使用单个对象(切片本身)来调用您的函数。
你要做的是用那些展开的args打电话。
return args[-1] + mySum(*args[:-1])
^---- note the asterisk
这种技术称为“unpacking argument lists”,星号有时(非正式地)称为“splat”运算符。
答案 1 :(得分:2)
如果您不想以递归方式执行此操作:
def mySum(*args):
sum = 0
for i in args:
sum = sum + i
return sum
答案 2 :(得分:1)
args[:-1]
是一个元组,因此嵌套调用实际上是mySum((4,))
,并且args[0]
的嵌套返回返回一个元组。所以你最终将最后一行减少到return 3 + (4,)
。要解决此问题,您需要在调用mySum时扩展元组,方法是将最后一行更改为return args[-1] + mySum(*args[:-1])
。
答案 3 :(得分:1)
在您的代码中,args[:-1]
是一个元组,因此调用mySum(args[:-1])
时args
是一个元组,其中包含另一个元组作为第一个参数。您希望调用函数mySum
,并将args[:-1]
扩展为参数,但您可以使用
mySum(*args[:-1])
答案 4 :(得分:1)
任意参数作为元组(带有一个星号*)传递给函数,(可以将其更改为代码中所示的列表)并通过使用for循环编码来计算其元素的总和;如果不想使用python的sum()方法。
def summing(*arg):
li = list(*arg)
x = 0
for i in range((len(li)-1)):
x = li[i]+x
return x
#creating a list and pass it as arbitrary argument to the function
#to colculate the sum of it's elements
li = [4, 5 ,3, 24, 6, 67, 1]
print summing(li)
答案 5 :(得分:0)
选项1:
def mySum(*args):
return sum(args)
mySum(1,2,3) # 6
mySum(1,2) # 3
选项2:
mySum2 = lambda *args: sum(args)
mySum2(1,2,3) # 6
mySum2(1,2) # 3