如何理解Python函数中的可变长度参数?
我想自己写一个求和的函数,能够处理不同数量的参数。
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 个回答
def myadd(x):
sum=0
for element in x:
sum=sum+element
return(sum)
x=(1,2,3)
print myadd(x)
6
输出
你把整个元组当作一个参数传递了,而元组是不能和数字相加的。如果你想把元组里的每个元素当作单独的参数传递,可以使用 *
操作符:
myadd(*x)
你把可变参数和参数解包搞混了。这是初学者常犯的错误,因为它们都用同一个 *
符号,虽然它们有些关系,但其实没你想的那么紧密。
这两个调用是完全一样的:
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,里面有链接到文档中所有有用的地方,希望能给你一个易懂的概述。