在调用函数sum_1n(n)时,传入一个参数n,这是传入单个参数。Python支持更多格式的传入方式,可以传入任意个参数。接下来将介绍函数参数的一些定义及传入方式。
在定义函数时,如果需要传入参数,在括号里需要指明,如sum_1n(n)中的n,这类参数称为形式参数,简称形参。
在调用函数或执行函数时,函数括号里的参数,如sum_1n(100)中的100,就是实际参数,简称实参。
在具体使用时,有时为简便起见,不分形参和实参,有些参考资料上统称参数。
函数定义时可以没有参数、有一个参数或多个参数。如果有多个参数,在调用函数时可能需要多个实参。向函数传入实参的方式有很多,可以依据函数定义时的位置和顺序而定;可以使用关键字作为实参;还可以使用列表和字典作为实参等。接下来将介绍这些内容。
位置参数就是定义函数时与参数位置有关的参数,调用函数时,位置参数必须与定义函数时的顺序保持一致。
位置参数是必备参数,调用函数时根据函数定义的形参位置来传递实参。为了更好地说明这个原理,下面以函数sum_1n为例进行讲解。
假设现在修改一下要求,把从1开始累积,改为从任何一个小于n的数m(如m<n)开始累积,那么,m也需要作为参数。为此,修改函数sum_1n如下。
定义函数sum_1n时,指明了两个参数m和n(如果是多个参数,需要用逗号分隔),在调用函数sum_1n时,实参需要输入两个,而且这两个实参的位置及顺序必须与形参保持一致,如以下代码。
其中1,10或10,20就是位置实参。位置实参的顺序很重要,如果顺序不正确,可能报错或出现异常情况。
位置参数多了,记住各参数的位置和顺序将非常麻烦,而且还很容易出错。为改进这种纯粹依据位置来传递参数的方式,人们想到了定义函数时,用一些代表一定含义的单词(或关键字)来命名参数,然后将这些单词(或关键字)赋给对应值即可,无须考虑这些参数的位置或顺序,这样就方便多了。
为此,我们把函数sum_1n的形参改成有一定含义的单词,调用时直接给这些单词赋值即可。
调用函数时,说明参数名并赋给对应值即可,无须考虑它们的位置或次序。当然,实参名称必须与形参名称一致,否则将报错。
位置参数如果很多,要记住这些位置和顺序非常麻烦,使用关键字参数可有效解决位置参数带来的麻烦。不过如果参数很多,使用关键字参数也不是很方便,尤其是有些参数相对稳定或经常使用,所以关键字参数还有优化空间。可以对那些比较稳定或经常使用的形参指定默认值。在调用函数中给形参提供了实参时,Python将使用指定的实参值,否则将使用默认值。如此,在很多情况下调用函数时,就可以少写很多实参。
比如sum_1n(start, end)函数,其中start一般从1开始,所以形参start设置为1,即start=1。形参end也可以设置默认值,如end=10。如果end不设置默认值,定义函数时,需要把end放在前面,把含默认值的参数放在后面,这样可以使Python正确地解读位置参数。
修改sum_1n(start, end)函数,代码如下。
调用函数,代码如下。
在Python中,在函数体内用return语句为函数指定返回值,返回值可以是一个或多个,类型可以是任何类型。如果没有return语句,则返回None值,即返回空值。不管return语句在函数体的什么位置,执行完return语句后,都会立即结束函数的执行。下面介绍函数返回值的情况。
1.返回一个值
上节介绍的sum_1n函数只返回一个值,如以下代码。
2.返回多个值
把sum_1n函数的返回值改一下,同时返回所有数的累加值、偶数的累加值,代码如下。
调用函数,代码如下。
3.返回空值
在函数体中不使用return语句,不过可以用print语句把结果显示出来。
调用函数,代码如下。
前面介绍了Python支持的几种参数类型,如位置参数、关键字参数和默认值参数,适当使用这些参数,可大大提高Python函数的灵活性。此外,Python还支持列表或元组参数,即用列表或元组作为实参传入函数,例如以下代码。
由此可见,Python的参数功能非常强大。不过调用时需要以列表或元组作为实参,所以还不够完美。但对形参进行一定的修改,就可以不以列表作为实参,只要输入一些以逗号分隔的数即可,这就是Python的可变参数或任意参数类型,接下来将详细介绍。
要实现输入任意数量的实参,只要在形参前加一个*即可,比如将calc_sum(lst)函数改为calc_sum(*lst)。形参加上*后,在函数内部,参数*lst接收到的是一个元组,因此函数代码完全不变。但是调用该函数时,可以传入任意个参数,包括0个参数,示例如下。
通过这种方式传入任意多个实参,就和我们的预期一样了。
位置参数可以和支持任意数量的实参一起使用,不过如果遇到不同类型的实参,必须在定义函数时,将接纳任意数量的实参放在最后。Python先匹配位置实参和关键字实参,然后再将剩下的实参归到最后的实参里,如以下实例。
根据函数calc_add的定义,Python在调用函数的实参时,把第一个数字4存储在size中,把剩下的所有值存储在元组numb中。
Python支持采用关键字实参,而且也可以是任意数量,只要在定义函数时在对应的形参前加上两个*即可。对应的形参在函数内部将以字典的方式存储,调用函数需要采用arg1=value1,arg2=value2的形式,例如以下代码。
调用函数,代码如下。
运行结果如下。
有时会出现有多种类型参数的情况,如既有位置形参,又有表示任意数量的一般形参和任意数量的关键字形参的函数。如格式为customer(fargs,*args,**kwargs)的函数,其中*args与**kwargs都是Python中的可变参数,*args表示可传入任意多个无名实参,**kwargs表示可传入任意多个关键字实参,它本质上是一个dict,示例如下。
调用函数,代码如下。
当函数中有多种类型的参数时,需注意以下问题。
(1)注意顺序,如果多种类型的参数同时出现,fargs在前,*args必在**args之前。
(2)*args相当于一个不定长的元组。
(3)**args相当于一个不定长的字典。