如何理解Python函数中的可变长度参数?

0 投票
3 回答
4240 浏览
提问于 2025-04-18 15:47

我想自己写一个求和的函数,能够处理不同数量的参数。

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'。

在我看来,调用方法 2 和方法 3 是 Python 不接受的,因为参数的位置没有 * 操作符?你能告诉我 Python 函数操作的原理吗?

3 个回答

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

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

输出

2

你把整个元组当作一个参数传递了,而元组是不能和数字相加的。如果你想把元组里的每个元素当作单独的参数传递,可以使用 * 操作符:

myadd(*x)
6

你把可变参数和参数解包搞混了。这是初学者常犯的错误,因为它们都用同一个 * 符号,虽然它们有些关系,但其实没你想的那么紧密。


这两个调用是完全一样的:

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个整数的列表。

在第三种情况下,你只传了1个参数,这个参数是一个元组,所以 tuple 得到的是一个包含1个元组的列表。当你遍历这个列表时,每个成员都是一个元组,而你不能把元组加到一个数字上。


想了解更多细节,可以查看 Arguments and parameters,里面有链接到文档中所有有用的地方,希望能给你一个易懂的概述。

撰写回答