我想编写自己的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函数操作的原理吗?
答案 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