22

我想学习如何在python函数中传递任意数量的args,所以我以递归方式编写了一个简单的sum函数,如下所示:

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'

有没有人对此有想法并给出一些纠正它的线索?

4

6 回答 6

15

这一行:

return args[-1] + mySum(args[:-1])

args[:-1]返回参数元组的一部分。我假设您的目标是使用该参数片段递归调用您的函数。不幸的是,您当前的代码只是使用单个对象(切片本身)调用您的函数。

相反,您要做的是在展开这些参数的情况下进行调用。

return args[-1] + mySum(*args[:-1])
                        ^---- note the asterisk

这种技术称为“解包参数列表”,星号有时(非正式地)称为“splat”运算符。

于 2012-10-29T16:05:46.513 回答
2

如果您不想递归地执行此操作:

def mySum(*args):
    sum = 0
    for i in args:
        sum = sum + i
    return sum
于 2012-10-29T16:08:34.793 回答
1

args[:-1]是一个元组,所以嵌套调用实际上是mySum((4,)),并且嵌套返回args[0]返回一个元组。因此,您最终将最后一行简化为return 3 + (4,). 要解决此问题,您需要在调用 mySum 时通过将最后一行更改为return args[-1] + mySum(*args[:-1]).

于 2012-10-29T16:05:07.227 回答
1

在您的代码中,args[:-1]是一个元组,因此mySum(args[:-1])被调用args为一个包含另一个元组作为第一个参数的元组。但是,您想调用扩展为参数的函数mySumargs[:-1]您可以使用

mySum(*args[:-1])
于 2012-10-29T16:05:11.070 回答
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)
于 2014-05-10T18:29:26.963 回答
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
于 2013-12-03T01:51:52.377 回答