我想编写自己的 sum 函数来获取可变长度参数的总和。
def myadd(*tuple):
sum=0
for element in tuple:
sum=sum+element
return(sum)
Run Code Online (Sandbox Code Playgroud)
调用方法一:
myadd(*(1,2,3,4))
Run Code Online (Sandbox Code Playgroud)
这是调用函数最正式的方式。这里没问题。
调用方法2:
myadd(1,2,3,4)
Run Code Online (Sandbox Code Playgroud)
它也可以得到结果,为什么?
调用方法3:
myadd((1,2,3,4))
Run Code Online (Sandbox Code Playgroud)
错误类型错误:+ 不支持的操作数类型:'int' 和 'tuple'。
在我看来,调用2和调用3不能被python接受,参数位置没有*运算符?你能告诉我python函数的操作原理吗?
您正在混淆可变参数参数和参数解包。对于初学者来说,这是一个常见的错误,因为它们都使用相同*的语法,而且它们并非完全没有关系……但它们的关系并不像您想象的那么密切。
这两个调用执行完全相同的操作:
myadd(*(1,2,3,4))
myadd(1, 2, 3, 4)
Run Code Online (Sandbox Code Playgroud)
这里的*意思是“获取以下可迭代对象,并将其解压缩为一堆单独的参数。
这不要紧,无论功能你调用被定义为f(*args),f(a, b, c, d)或者f(a, b, *args),你传递这4个参数。
这意味着方法 1 不是“调用函数的最正式方式”;实际上,它只是方法 2 的混淆版本。
另一方面,这不会做同样的事情:
myadd((1, 2, 3, 4))
Run Code Online (Sandbox Code Playgroud)
这传递了一个参数,它恰好是一个元组。
因此,您的函数定义如下:
def myadd(*tuple):
Run Code Online (Sandbox Code Playgroud)
这意味着无论它传递的是什么参数,无论它们是如何传递的(关键字参数除外,但让我们暂时忽略它),它们都将被放入名为tuple. 所以,让我们看看你的三个案例。
在第一种情况下,您要传递 4 个参数,所有参数都是整数。所以,tuple得到一个包含 4 个整数的列表。当您遍历该列表时,每个成员都是一个整数,因此您可以毫无问题地将它们相加。
在第二种情况下——同样,完全相同——你传递了 4 个整数,所以tuple得到了一个包含 4 个整数的列表。
在第三种情况下,您传递了 1 个参数,它是一个元组,因此tuple获得一个包含 1 个元组的列表。当您遍历该列表时,每个成员都是一个元组,您不能将其添加到数字中。
有关更多详细信息,请参阅Arguments 和 parameters,其中包含指向文档中所有有用位置的链接,并希望有一个可读的概述。
| 归档时间: |
|
| 查看次数: |
4116 次 |
| 最近记录: |