从零开始学Python: 20课-函数使用进阶

  

在之前的课程中,我们讲到过关于函数的知识,我们还讲到过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课,函数使用进阶”>
  
  <p>
  </p>
  <p>在前面几节课中,我们讲到了面向对象程序设计,在面向对象的世界中,一切皆为对象,所以类和函数也是对象。函数的参数和返回值可以是任意类型的对象,这就意味着
  ,这就是所谓的
  . </p>
  <p>如果我们希望上面的calc函数不仅仅可以做多个参数求和,还可以做多个参数求乘积甚至更多的二元运算,我们就可以使用高阶函数的方式来改写上面的代码,将加法运算从函数中移除掉,具体的做法如下所示。</p>
  <前>
  <代码>
  (
  ):
  <br/>=init_value
  <br/>,,
  参数
  参数:
  <h2 class=从零开始学Python: 20课-函数使用进阶