如何理解python函数中的变长参数?

时间:2014-08-03 07:05:35

标签: python

我想编写自己的sum函数来获取可变长度参数的总和。

def myadd(*tuple):
    sum=0
    for element in tuple:
        sum=sum+element
    return(sum)

通话方法1:

myadd(*(1,2,3,4))

这是调用函数最正式的方法。这里没问题。

通话方法2:

myadd(1,2,3,4)

它也可以得到结果,为什么?

通话方法3:

myadd((1,2,3,4))

错误TypeError:+:' int'不支持的操作数类型和' tuple'。

在我看来,python不能接受调用2和调用3,参数位置没有*运算符?你能告诉我python函数操作的原理吗?

3 个答案:

答案 0 :(得分:3)

你正在混合变量参数参数和参数解包。对于初学者来说,这是一个常见的错误,因为它们都使用相同的*语法,并且它们并非完全不相关......但它们并不像您想象的那样密切相关。


这两个电话完全相同:

myadd(*(1,2,3,4))
myadd(1, 2, 3, 4)

这里*的含义是“接下来的迭代,并将其解压缩成一堆独立的参数。

您调用的函数是定义为f(*args)f(a, b, c, d)还是f(a, b, *args)并不重要,您传递了4个参数。

这意味着方法1不是“最正式的调用函数的方式”;事实上,它只是方法2的混淆版本。


另一方面,这不是同样的事情:

myadd((1, 2, 3, 4))

传递一个参数,恰好是一个元组。


所以,你的函数定义如下:

def myadd(*tuple):

这意味着无论它传递的是什么,无论它们如何被传递(除了关键字参数,但暂时忽略它),它们将被扔进名为tuple的列表中。那么,让我们来看看你的三个案例。

在第一种情况下,你传递了4个参数,所有参数都是整数。因此,tuple获取4个整数的列表。当您遍历该列表时,每个成员都是一个整数,因此您可以毫无问题地添加它们。

在第二种情况下 - 再次完全相同 - 你传递4个整数,所以tuple得到4个整数的列表。

在第三种情况下,你传递的是一个参数,它是一个元组,所以tuple得到一个1元组的列表。当您遍历该列表时,每个成员都是一个元组,并且您无法将其添加到数字中。


有关详细信息,请参阅Arguments and parameters,其中包含指向文档中所有有用位置的链接,并且希望是可读的概述。

答案 1 :(得分:2)

您将整个元组作为一个参数传递,并且无法将元组添加到数字中。如果要将所有元组元素作为单独的参数传递,请使用*运算符:

myadd(*x)

答案 2 :(得分:1)

def myadd(x):                                
    sum=0                                    
    for element in x:                        
        sum=sum+element                      
    return(sum)                              

x=(1,2,3)                                    
print myadd(x) 

<强>输出

6