深入浅析Python函数注解与匿名函数

  

  

关于函数参数的定义,调用以及函数参数的内容,在下面的文章中已经做了初步的介绍,有需要的可以访问进行了解:

  

Python函数   

  

在编写函数,当下肯定清楚函数如何使用的。若是函数较为复杂,过段时间,编写者有可能需要花一段时间去重新了解函数的使用,那其他使用者也同样会遇到这样的困惑。

  

所以当编写完函数后,可以为函数的参数添加一些额外的信息。这里给函数参数添加注解,能够提示程序员如何正确使用这个函数。如下示例:

        def add (x: int y: int)→int(警官):   “返回两个数的总和   “‘   返回x + y      

在这里,Python解释器并不会对这些注解添加任何的语义(可能第三方工具和框架会)。它们并不会被类型检查,运行的时候跟没有添加注解前是没有任何差距的。但若是有需要的人阅读源码时,这些都能给阅读者提供帮助。同时会出现在文档里。

        在在在帮助(添加)   帮助>   在在在add.__annotations__   {“x”: & lt;类“int”祝辞,“y”: & lt;类“int”祝辞,“返回”:& lt;类“int”祝辞}      

注解的主要用途还是文档.Python并没有类型声明,当阅读源码的时候,比较难知道传递什么样的参数给这个函数。这时候,注解就能够给阅读者更多的提示,能够让他们正确使用函数。

  

  

如何定义

  

在前面提及的文章中,讲到了使用def定义一个函数。但若是函数能够单行实现,这个时候可以考虑使用匿名函数(λ表达式)来实现这种功能。

  

当函数功能非常简单,仅仅只是计算一个表达式的值时,就可以用λ表达式来替代比。如:

        在在在添加=λx, y: x + y   在在在添加   & lt;功能& lt; lambda>在0 x0000021496cd98b8>   在在在添加(2、3)   5   在在在添加(‘你好’,‘世界’)   “hello world”      

其实使用λ表达式跟下面的效果是一样的:

        在在在def添加(x, y):   …返回x + y   …   在在在添加(2、3)   5   在在在添加(‘你好’,‘世界’)   “hello world”      

λ表达式主要运用的场景是排序或者数据减少:

        在在在对=[(1,“一”),(2,' 2 '),(3,“三”),(4 ' 4 ')]   在在在排序(对,键=λ对:对[1])   [(4 ' 4 '),(1,“一”),(3,“三”),(2,' 2 ')]      

上面的例子就是用于排序列表元素,以列表元素元组的第二个元素进行排序。此处的元组的第二个元素是字符串,关于字符串的比较,先比较字符串的首字符,首字符相同时,比较第二个字符,以此类推。

  

在这里,四个与>   在在在x=10   在在在一个=λy: x + y   在在在x=20   在在在b=λy: x + y      

在这里,先猜一猜(10)和b(10)的结果?若觉得结果是20和30,那就错了:

  
  ,

祝辞祝辞的在(10)30祝辞祝辞祝辞30 b (10)

     

产生上面的结果,是因为λ表达式中的x是一个自由变量,它是在运行的时候绑定值,而不是在定义的时候就绑定,这里跟函数的默认值参数定义是不同的,因此,在调用这个λ表达式时,x的值其实是执行时的值,例如:

  
  ,

祝辞祝辞的在,x=10祝辞祝辞的在(10)20祝辞祝辞祝辞,x=20祝辞祝辞的在30 b (10)

     

若是向在匿名函数在定义时就捕获值,可以将参数值定义为默认参数:

  
  ,

祝辞祝辞的在,x=10祝辞祝辞的在=λy、x=x: x + y祝辞祝辞祝辞,x=20祝辞祝辞的在b=λy, x=x, x + y祝辞祝辞祝辞(10)20祝辞祝辞祝辞30 b (10)

     

还有一个需要注意:假如想用循环或列表推导创建一个λ表达式列表,期望函数能够在定义时就记住每次的迭代值。以下的写法是无法达到效果的:

  
  ,

祝辞祝辞的在func=[λx: x + n n的范围(5)]在祝辞祝辞在函数f:……打印(f (0))…

     

这里最终执行的结果,也是因为最终执行,n的值其实是迭代的最后一个值。

  

修改函数,使其达到想要达到的效果,也是上面提及的默认值的做法:

  
  ,

祝辞祝辞的在func=[λx, n: n=x + n n的范围(5)]在祝辞祝辞在函数f:……打印(f (0))…

     

深入浅析Python函数注解与匿名函数