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

如何理解python函数中的变长参数?,python,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)) 错误类型错误:不支持+:“int”和“tupl

我想写我自己的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))
错误类型错误:不支持+:“int”和“tuple”的操作数类型


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

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

myadd(*x)
输出


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

这两个电话的作用完全相同:

myadd(*(1,2,3,4))
myadd(1, 2, 3, 4)
myadd((1, 2, 3, 4))
这里*的意思是,取下面的iterable,并将其分解成一组单独的参数

不管你调用的函数是定义为f*args,fa,b,c,d还是fa,b,*args,你都要给它传递4个参数

这意味着方法1不是调用函数的最正式的方式;事实上,它只是方法2的一个模糊版本

另一方面,这并不起同样的作用:

myadd(*(1,2,3,4))
myadd(1, 2, 3, 4)
myadd((1, 2, 3, 4))
它只传递一个参数,恰好是一个元组

因此,您的函数定义如下:

def myadd(*tuple):
这意味着不管它传递的是什么参数,不管它们是如何传递的,除了关键字参数,但我们暂时忽略这一点,它们将被放入一个名为tuple的列表中。那么,让我们看看你的三个案例

在第一种情况下,传递4个参数,所有参数都是整数。所以,tuple得到一个包含4个整数的列表。当您迭代该列表时,每个成员都是一个整数,因此您可以毫无问题地将它们相加

在第二种情况下,这与传递4个整数完全相同,因此tuple得到一个包含4个整数的列表

在第三种情况下,您将传递1个参数,这是一个元组,因此tuple将获得一个包含1个元组的列表。当您迭代该列表时,每个成员都是一个元组,不能将其添加到数字中


有关更多详细信息,请参阅,其中提供了指向文档中所有有用位置的链接,并希望提供一个可读的概述。

您希望0+1、2、3是什么?显而易见的问题是:内置的求和函数有什么问题?顺便说一句,您真的不应该调用参数元组,因为这隐藏了元组类型/构造函数的名称。我几乎明白了,函数是对的,调用方法是错误的。myadd*1,2,3是可以的。我知道myadd*1,2,3,4可以得到结果,为什么myadd1,2,3,4也可以得到结果?它不是*tuple的形式?这里没有*operator,你能多谈谈python中的函数原理吗?@这是一篇文学作品,读一本教程和/或手册怎么样?这是非常基本的东西。