深入浅析Python 函数注解与匿名函数
函数注解与匿名函数
关于函数参数的定义,调用以及函数参数的内容,在下面的文章中已经做了初步的介绍,有需要的可以访问进行了解:
Python函数
函数注解
在编写函数,当下肯定清楚函数如何使用的。若是函数较为复杂,过段时间,编写者有可能需要花一段时间去重新了解函数的使用,那其他使用者也同样会遇到这样的困惑。
所以当编写完函数后,可以为函数的参数添加一些额外的信息。这里给函数参数添加注解,能够提示程序员如何正确使用这个函数。如下示例:
defadd(x:int,y:int)->int: '''Returnsthesumoftwonumbers ''' returnx+y
在这里,Python解释器并不会对这些注解添加任何的语义(可能第三方工具和框架会)。它们并不会被类型检查,运行的时候跟没有添加注解前是没有任何差距的。但若是有需要的人阅读源码时,这些都能给阅读者提供帮助。同时会出现在文档里。
>>>help(add) Helponfunctionaddinmodule__main__: add(x:int,y:int)->int Returnsthesumoftwonumbers
函数注解只存储于函数的__annotations__属性中。比如:
>>>add.__annotations__ {'x':,'y': ,'return': }
注解的主要用途还是文档。Python并没有类型声明,当阅读源码的时候,比较难知道传递什么样的参数给这个函数。这时候,注解就能够给阅读者更多的提示,能够让他们正确使用函数。
匿名函数
如何定义
在前面提及的文章中,讲到了使用def定义一个函数。但若是函数能够单行实现,这个时候可以考虑使用匿名函数(lambda表达式)来实现这种功能。
当函数功能非常简单,仅仅只是计算一个表达式的值时,就可以用lambda表达式来替代。比如:
>>>add=lambdax,y:x+y >>>addat0x0000021496CD98B8> >>>add(2,3) 5 >>>add('hello','world') 'helloworld'
其实使用lambda表达式跟下面的效果是一样的:
>>>defadd(x,y): ...returnx+y ... >>>add(2,3) 5 >>>add('hello','world') 'helloworld'
lambda表达式主要运用的场景是排序或者数据reduce:
>>>pairs=[(1,'one'),(2,'two'),(3,'three'),(4,'four')] >>>sorted(pairs,key=lambdapair:pair[1]) [(4,'four'),(1,'one'),(3,'three'),(2,'two')]
上面的例子就是用于排序列表元素,以列表元素元组的第二个元素进行排序。此处的元组的第二个元素是字符串,关于字符串的比较,先比较字符串的首字符,首字符相同时,比较第二个字符,以此类推。
在这里,four与one,f比o排序更前,所以four排在one前面,three和two首字符相同,比较的是第二个字符h和w,所以three排在two前面。
尽管lambda表达式能够定义简单函数,但其实是有限制的。只能指定单个表达式,它的值就是最后返回的值。即是不能包含其他的语言特性,包括多个语句、迭代以及异常处理等等。
捕获变量值
如何在定义匿名函数时捕获某些变量的值?现在,先看看以下示例代码的效果:
>>>x=10 >>>a=lambday:x+y >>>x=20 >>>b=lambday:x+y
在这里,先猜猜a(10)和b(10)的结果?若觉得结果是20和30,那就错了:
>>>a(10)30>>>b(10)30
产生上面的结果,是因为lambda表达式中的x是一个自由变量,它是在运行的时候绑定值,而不是在定义的时候就绑定,这里跟函数的默认值参数定义是不同的。因此,在调用这个lambda表达式时,x的值其实是执行时的值。例如:
>>>x=10>>>a(10)20>>>x=20>>>b(10)30
若是向在匿名函数在定义时就捕获值,可以将参数值定义为默认参数:
>>>x=10>>>a=lambday,x=x:x+y>>>x=20>>>b=lambday,x=x:x+y>>>a(10)20>>>b(10)30
还有一个需要注意:假如想用循环或列表推导创建一个lambda表达式列表,期望函数能够在定义时就记住每次的迭代值。以下的写法是无法达到效果的:
>>>func=[lambdax:x+nforninrange(5)]>>>forfinfunc:...print(f(0))...
这里最终执行的结果,也是因为最终执行,n的值其实是迭代的最后一个值。
修改函数,使其达到想要达到的效果,也是上面提及的默认值的做法:
>>>func=[lambdax,n=n:x+nforninrange(5)]>>>forfinfunc:...print(f(0))...
现在使用默认值参数的形式,就能够实现在定义时绑定所需的值。
参考资料
来源
[1]DavidM.Beazley;BrianK.Jones.PythonCookbook,3rdEdtioni.O'ReillyMedia.2013.
[2]"4.7.6LambdaExpressions".docs.python.org.Retrieved23February2020.
总结
到此这篇关于Python函数注解与匿名函数的文章就介绍到这了,更多相关Python函数注解与匿名函数内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。