在之前的课程中,我们讲到过关于函数的知识,我们还讲到过Python中常用的数据类型,这些类型的变量都可以作为函数的参数或返回值;通过前几节课的学习,我们又知道了写在类中的函数通常称之为方法,它代表了类或者对象可以接收的消息。如果我们把这些知识汇总一下,我们的函数就可以做更多的事情。
下面是一个判断传入的三条边长能否构成三角形的函数,在调用函数传入参数时,我们可以指定参数名,也可以不指定参数名,代码如下所示。
<前> <代码> def can_form_triangle (a, b, ):,, (f # 39;={一},b={b},={ }& # 39;)
,, a + b比; 和b + 比;a和a + 比;b #调用函数传入参数不指定参数名按位置对号入座
(can_form_triangle ( , , ))
#调用函数通过“参数名=参数值”的形式按顺序传入参数
(can_form_triangle (a=,b=,=))
#调用函数通过“参数名=参数值”的形式不按顺序传入参数
(can_form_triangle (=一个=,b=)代码>
在没有特殊处理的情况下,函数的参数都是 ,也就意味着传入参数的时候对号入座即可,如上面代码的第7行所示,传入的参数值1,2,3会依次赋值给参数a, b, c。当然,也可以通过参数名=参数值的方式传入函数所需的参数,因为指定了参数名,传入参数的顺序可以进行调整,如上面代码的第9行和第11行所示。
调用函数时,如果希望函数的调用者必须以参数名=参数值的方式传参,可以用 取代位置参数。所谓命名关键字参数,是在函数的参数列表中,写在*之后的参数,代码如下所示。
<前> <代码> :,,打印( ,b=c=& # 39;)
,, a + b比;c b + c比;一个 + c比;b
代码>
:上面的can_form_triangle函数,参数列表中的*是一个分隔符,*前面的参数都是位置参数,而*后面的参数就是命名关键字参数。
引用>我们之前讲过在函数的参数列表中可以使用 * args来接收任意数量的参数,但是我们需要看看,* args是否能够接收带参数名的参数。
<前> <代码> :
,,结果=
,, 参数 参数:
,,,+=参数结果
,, 结果 打印(calc (a=,b=c=)代码>执行上面的代码会引发TypeError错误,错误消息为钙()有一个意想不到的关键字参数& # 39;一个# 39;,由此可见,* args并不能处理带参数名的参数。我们在设计函数时,如果既不知道调用者会传入的参数个数,也不知道调用者会不会指定参数名,那么同时使用可变参数和 ,关键字参数会将传入的带参数名的参数组装成一个字典,参数名就是字典中键值对的键,而参数值就是字典中键值对的值,代码如下所示。
<前> <代码> def calc (* args, * * kwargs):
,,结果=
,, 参数:
,,,结果+=
,, 价值 kwargs.values ():
,,,结果+=值
,, 总计 print (calc ()),,,,,,,,,#
(钙( , , )),,,,,#
(calc (a=,b=c=)),,#
(钙( , c=d=)),,# 代码>: 否,则将会引发异常,例如,执行calc (1、2, c=3, d=4, 5)将会引发SyntaxError错误,错误消息为位置参数是关键字参数,翻译成中文意思是“位置参数出现在关键字参数之后”。
引用> 从零开始学Python: 20课-函数使用进阶