函数注解与匿名函数关于函数参数的定义、调用以及函数参数的内容,在下面的文章中已经做了初步的介绍,需要的可以访问学习:Pythonfunctionfunction注意写函数的时候一定要清楚此刻函数是怎么用的。如果功能比较复杂,编写者可能需要花一些时间,过一段时间再去理解功能的使用,其他用户也会遇到这样的困惑。所以在写函数的时候,可以在函数的参数中加入一些额外的信息。在这里给函数参数加上注解,可以提醒程序员如何正确使用这个函数。下面的例子:defadd(x:int,y:int)->int:'''返回两个数的和'''returnx+y在这里,Python解释器没有给这些注解添加任何语义(可能第3方工具和框架将)。它们不会被类型检查,运行和不添加注释没有区别。但是如果有需要的人阅读了源码,这些可以对读者有所帮助。也会出现在文档中。>>>help(add)Helponfunctionaddinmodule__main__:add(x:int,y:int)->int返回两个数字的总和函数注解仅存储在函数的__annotations__属性中。例如:>>>add.__annotations__{'x':,'y':,'return':}注解的主要目的是文档.Python没有类型声明,阅读源代码时,很难知道传递给这个函数的参数是什么。这时候,注解可以给读者更多的提示,让他们正确使用功能。如何定义匿名函数在前面的文章中,我们谈到了使用def来定义函数。但是如果函数可以单行实现,此时可以考虑使用匿名函数(lambda表达式)来实现这个函数。当function函数很简单,只是计算一个表达式的值时,可以改用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表达式主要用于排序或数据归约:>>>pairs=[(1,'one'),(2,'two'),(3,'三'),(4,'四')]>>>sorted(pairs,key=lambdapair:pair[1])[(4,'四'),(1,'一'),(3,'三'),(2,'二')]上面的例子是用来对列表元素进行排序的,按照列表元素元组的第二个元素进行排序。这里元组的第二个元素是一个字符串。关于字符串的比较,先比较字符串的第一个字符。当第一个字符相同时,比较第二个字符,依此类推。这里四和一,f排在o之前,所以四排在一之前,三和二第一个字符相同,比较第二个字符h和w,所以三排在二之前。虽然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是一个自由变量,它在Bind中运行时的值,而不是定义时的值,这与函数的默认值参数定义不同。因此,当这个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))...44444这里最后执行的结果也是因为最后执行,n的值其实就是迭代的最后一个值。修改函数达到想要的效果也是上面提到的默认值:>>>func=[lambdax,n=n:x+nforninrange(5)]>>>forfinfunc:...print(f(0))...01234现在使用默认值参数的形式,可以实现在定义的时候绑定需要的值。参考来源[1]DavidM.Beazley;布赖恩·琼斯。PythonCookbook,第3版。奥莱利媒体。2013.[2]《4.7.6Lambda表达式》.docs.python.org.2020年2月23日检索。欢迎关注微信公众号《书所集录》