python函数中的任意数量的参数

时间:2012-10-29 16:00:38

标签: python

我想学习如何在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'

有没有人对此有所了解并且给我一些线索来纠正它?

6 个答案:

答案 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