鉴于函数定义中可能包含多个形参变量,因此函数调用中也可能包含多个实参变量。向函数传递实参变量给形参变量的方式有很多,可使用位置参数,这要求实参变量的顺序与形参变量的顺序相同;也可使用关键字参数,都由变量名和值组成,简称名称-值对;还可使用列表(元组)和字典。
调用函数时,Python必须将函数调用中的每个实参变量都关联到函数声明中的一个形参变量上。为此,最简单的关联方式是基于形参变量与实参变量的位置顺序。这种关联方式被称为位置参数。
其语法逻辑如下所示:
我们假设一个输出人的爱好信息函数,编写程序如下所示:
通过这个函数的声明可以发现,它需要一个人的姓名和爱好。调用print_hobby函数时,需要按位置顺序提供一个人的姓名和爱好。字符串变量的文本内容'张三'传递给函数声明中形参变量name,字符串变量的文本内容'足球'传递给函数声明中形参变量hobby,然后print_hobby函数就可以利用形参变量name和hobby去实现功能,这里实现的功能很简单,就是输出拼接字符串信息。
我们可以再进行第二次调用看是否是按照实参变量与形参变量的位置顺序来进行传递的,编写程序如下所示:
通过输出结果发现是我们所设想的输出结果。
在函数中,可根据需要使用任意数量的位置参数,Python将按位置顺序从前到后将函数调用中的实参变量关联到函数声明中相应的形参变量,完成数据信息的传递
使用位置参数来调用函数时,如果实参变量的顺序不正确,结果会出乎我们的意料,比如我们把第一个实参变量位置填写爱好信息,第二个实参变量位置填写姓名信息,编写程序如下所示:
通过上面的输出结果我们发现显然不是我们想要的结果,所以一定要在函数调用时,按照形参变量的位置顺序,编写对实参变量的位置顺序,不然就会发生错误。
之前我们接触过字典的键值对,现在我们再学习一个关系对,名称-值对。关键字参数是传递给函数的名称-值对。我们直接在函数调用时将名称和值关联起来,因此向函数传递实参变量时不会混淆。用关键字参数的时候无须考虑函数调用中的实参变量的位置顺序。
我们还是以人名和爱好两个信息来举例,编写程序如下所示:
我们可以发现通过关键字参数,即使改变了实参变量的位置顺序,输出结果还是我们之前所设想的,所以,关键字参数的顺序无关紧要,因为Python知道各个实参变量的值该存储到哪个形参变量中,但是使用关键字参数时,务必准确地指定函数定义中的形参变量名。
编写函数时,可给每个形参变量指定默认值。在调用函数中给形参变量提供实参变量的值时,Python将使用指定的实参变量的值;否则,将使用形参变量的默认值。因此,给形参变量指定默认值后,可在函数调用中省略相应的实参变量。使用默认值可简化函数调用,比如,经过我们大量收集人的爱好,发现爱好音乐的人比较多,我们可以将音乐作为默认值,编写程序如下所示:
我们可以发现,当我们按照位置参数的方式进行实参变量值传递的时候,hobby的值由'篮球'变为了'足球',输出结果上爱好是足球,当我们不传递第二个实参变量值的时候,hobby因为没有接收到新值,所以使用了默认值'篮球',输出结果上爱好是篮球。
虽然我们的部分形参变量使用了默认值,在上面的程序中,name还是第一个位置参数,hobby还是第二个位置参数,如果我们改成print_hobby(hobby='篮球',name):这样会发生什么,编写程序如下所示:
运行后发现,提示错误,该错误显示没有默认值的参数后面应该跟随有默认值的参数。也就是说明了,在形参变量有默认值的情况下,有默认值的形参变量在后面,没有默认值的形参变量在前面,如果是多个形参变量,一部分为有默认值的形参变量,一部分为没有默认值的形参变量,那么我们要先列出没有默认值的形参变量,再列出有默认值的形参变量。这让Python依然能够正确地解读位置参数。比如我们再构造两个形参变量,一个调查时间time,一个调查者people,调查时间我们默认是'2023-01-01',编写程序如下所示:
我们一旦将有默认值的提前到没有默认值的前面,或者没有默认值的放在有默认值的后面,将在运行时产生错误,编写程序如下所示:
有时候,我们预先不知道函数需要接受多少个实参变量,但是Python允许函数从调用语句中收集任意数量的实参变量。因为爱好可以只有一个,也可以有很多,所以数量是不一定的,我们可以通过任意数量参数来解决,其语法格式:def 函数名(_形参变量名):
编写程序如下所示:
通过输出结果我们可以看出,我们把实参变量值传递给形参变量hobby的过程中,经过_号的作用,hobby变成了元组,通过元组的形式来接收多个实参变量值,既然是元组接收,我们可以遍历该元组,编写程序如下所示:
通过对输出结果的观察是符合我们设想的。
总而言之,在不知道函数具体收到多少个实参变量值的时候,我们可以采取将形参变量在左上角加上*号的方式。
如果要让函数接受不同类型的实参变量,必须在函数声明中将接纳任意数量参数的形参变量放在最后,Python先匹配位置参数和关键字参数,再将余下的实参变量都收集到最后一个形参变量中。
比如我们在之前的程序中,加入人名,函数声明时,人名形参变量name,必须放在任意数量形参变量的前面,函数调用时先写人名实参变量,然后再写任意数量实参变量,编写程序如下所示:
基于上述函数声明,Python将第一个实参变量值'张三'传递到形参变量name,并将其他的实参变量值都存储在元组hobby中
有时候,需要接受任意数量的实参变量,但预先不知道传递给函数的会是什么样的信息。在这种情况下可将函数的形参变量编写成能够接受任意数量的关键字参数。比如一个人的信息简介,我们知道名字是必须的,但是我们不知道他会提供什么其他的信息,我们可以使用任意数量的关键字参数,编写程序如下所示:
函数print_info的声明要求提供姓名,同时允许用户根据需要提供任意数量的关键字参数,也就是名称-值对。
形参变量**other中的两个星号让Python创建一个名为other的空字典,并将收到的所有名称-值对都封装到这个字典中。在函数中可以向访问其他字典那样访问other中的名称-值对。
总而言之,编写函数时,可以以各种方式混合使用位置参数、关键字参数和任意数量参数。
手机扫一扫
移动阅读更方便
你可能感兴趣的文章