首页 > Python笔记 阅读数:20

Python函数怎样接收任意个参数

存在可变参数(Variable Parameter)的情况是指,在函数调用时,其参数的个数并不固定。在 C、C++ 或 Java 中,可变参数应用得非常普遍。比如说,在 C、C++ 中,我们在使用 printf( ) 函数时,无论传递多少参数,只要格式正确,程序都不会报错。

在 Python 中,其实也能很方便地使用可变参数。Python 中的可变参数的表现形式为,在形参前添加一个星号*,意为函数传递过来的实参个数不定,可能为 0 个、1 个,也可能为 n 个(n≥2)。需要注意的是,不管可变参数有多少个,在函数内部,它们都被“收集”起来并统一存放在以形参名为某个特定标识符的元组之中。因此,可变参数也被称为“收集参数”。

参见如下代码:
In [4]: def varParaFun(name,*args):
   ...:     print("位置参数是:",name)
   ...:     print("收集参数是:", args)
   ...:     print("第一个收集参数是:", args[0])
In [5]: varParaFun("Zhangsan",111,222,333)

位置参数是:zhangsan
收集参数是:(111, 222, 333)
第一个收集参数是:111

在 In [4] 处,形参 args 就是元组。其前面的星号*并不是形参的一部分,而是用来标识 args 是一个可变参数的。需要说明的是,在函数参数列表中,常用 *args 来表示可变参数,实际上 args 就是一个形参名,它可以是任何合法的 Python 名称。args 是 arguments(参数)的英文简写,这里常用这个名称,就是因为它具有可读性。

下面,我们再来看一个更加实用的可变参数示例,以便更加感性认知可变参数带来的便利,见例 1。

【例 1】可变参数范例(var-argments.py)
def mySum(*args):
    sum = 0
    for i in range (0, len(args)):
        sum = sum + args[i]
    return sum

#可变参数函数调用
print(mySum(1, 2Z 3, 4, 5) ) #5 个整型数值求和
print(mySum(20.1, 30.2) ) #2 个浮点数求和
程序执行结果为:

15
50.3


简单解释一下上述代码。如前所述,可变参数被打包成了一个元组。而读取元组元素的格式就是“元组名[索引]”。所以,在第 03~04 行的 for 循环中,我们先用全局函数 len( ) 读取元组中的元素个数(即长度),然后用读取元组中元素的方法 args[i],逐一读取数据并求和。

除了用单个星号*表示可变参数,其实还有另一种标定可变参数的形式,即用两个星号**来标定。通过前文的介绍,我们知道,一个星号*将多个参数打包为一个元组,而两个星号**的作用是什么呢?它的作用就是把可变参数打包成字典模样。

这时调用函数则需要采用如“arg1 = value1,arg2 = value2”这样的形式。等号左边的参数好比字典中的键(key),等号右边的数值好比字典中的值(value),示例代码如下。
In [6]:def varFun(**x):
  ...:    if len(x) == 0;
  ...:        print ("None")
  ...:    else:
  ...:        print(x)

In [7]: varFun()              #0个参数
None
In [8]: varFun(a = 1,b = 3)   #有2个参数,以键/值对将可变参数存放在字典中
{ 'a' : 1, 'b': 3}
In [9]: varFun(1,3)           #错误!必须以键/值对(即字典)的形式给函数传参
Traceback (most recent call last):
    File "<pyshell#36>", line 1 in <module>
        varFun(1,3)
TypeError: varFun() takes 0 positional arguments but 2 were given

从上述代码的输出结果可以看出,以两个星号**标定可变参数时,表明可变参数是字典元素。在调用时,参数必须成对出现,并用等号区分键和值,这时如果我们还使用传统的参数赋值方式,如 varFun(1,3),编译器是不会答应的。

除了用等号给可变关键字参数赋值,事实上,我们还可以直接用字典给可变关键字参数赋值,如例 2 所示。

【例 2】用字典给可变关键字参数赋值(kwargs.py)
def some_kwargs(name, age, sex):
    print ("姓名:", name)
    print ("年龄:", age)
    print ("性别:", sex)

kwargs_dic = {'name' : 'Alice', 'age' : 11, 'sex' : '女'}
some_kwargs(**kwargs_dic)
程序执行结果为:

姓名:Alice
年龄:11
性别:女


在形式上,可变数量的关键字参数调用,有点类似于带有默认参数值的参数调用。下面,我们就顺便讨论一下带有默认参数的函数使用方法。

相关文章