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


Posted in Python onFebruary 24, 2020

函数注解与匿名函数

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

函数注解

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

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

def add(x:int, y:int) -> int:
 '''Returns the sum of two numbers
 '''
 return x + y

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

>>> help(add)
Help on function add in module __main__:

add(x: int, y: int) -> int
 Returns the sum of two numbers

函数注解只存储于函数的 __annotations__ 属性中。比如:

>>> add.__annotations__
{'x': <class 'int'>, 'y': <class 'int'>, 'return': <class 'int'>}

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

匿名函数

如何定义

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

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

>>> add = lambda x, y: x + y
>>> add
<function <lambda> at 0x0000021496CD98B8>
>>> add(2, 3)
5
>>> add('hello', ' world')
'hello world'

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

>>> def add(x, y):
... return x + y
...
>>> add(2, 3)
5
>>> add('hello', ' world')
'hello world'

lambda 表达式主要运用的场景是排序或者数据 reduce:

>>> pairs = [(1, 'one'), (2, 'two'), (3, 'three'), (4, 'four')]
>>> sorted(pairs, key=lambda pair: 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 = lambda y: x+y
>>> x = 20
>>> b = lambda y: 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 = lambda y, x=x: x+y >>> x=20 >>> b = lambda y, x=x: x+y >>> a(10) 20 >>> b(10) 30

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

>>> func = [lambda x: x+n for n in range(5)] >>> for f in func: ... print(f(0)) ...

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

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

>>> func = [lambda x, n=n: x+n for n in range(5)] >>> for f in func: ... print(f(0)) ...

现在使用默认值参数的形式,就能够实现在定义时绑定所需的值。

参考资料

来源

[1] David M. Beazley;Brian K. Jones.Python Cookbook, 3rd Edtioni.O'Reilly Media.2013.

[2] "4.7.6 Lambda Expressions".docs.python.org.Retrieved 23 February 2020.

总结

到此这篇关于Python 函数注解与匿名函数的文章就介绍到这了,更多相关Python 函数注解与匿名函数内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python使用rsa加密算法模块模拟新浪微博登录
Jan 22 Python
pygame学习笔记(5):游戏精灵
Apr 15 Python
使用Python的Scrapy框架编写web爬虫的简单示例
Apr 17 Python
python字符串的方法与操作大全
Jan 30 Python
python 日志增量抓取实现方法
Apr 28 Python
Anaconda2 5.2.0安装使用图文教程
Sep 19 Python
详解python中*号的用法
Oct 21 Python
Pycharm小白级简单使用教程
Jan 08 Python
pytorch-RNN进行回归曲线预测方式
Jan 14 Python
Python基于time模块表示时间常用方法
Jun 18 Python
Python 多进程原理及实现
Dec 21 Python
Python字典和列表性能之间的比较
Jun 07 Python
python数据预处理方式 :数据降维
Feb 24 #Python
python实现PCA降维的示例详解
Feb 24 #Python
Python sklearn库实现PCA教程(以鸢尾花分类为例)
Feb 24 #Python
python 线性回归分析模型检验标准--拟合优度详解
Feb 24 #Python
最小二乘法及其python实现详解
Feb 24 #Python
在Python 的线程中运行协程的方法
Feb 24 #Python
Python 爬取必应壁纸的实例讲解
Feb 24 #Python
You might like
php中对2个数组相加的函数
2011/06/24 PHP
php选择排序法实现数组排序实例分析
2015/02/16 PHP
php中有关合并某一字段键值相同的数组合并的改进
2015/03/10 PHP
Laravel日志用法详解
2016/10/09 PHP
PHP进程通信基础之信号量与共享内存通信
2017/02/19 PHP
PHP数组去重的更快实现方式分析
2018/05/09 PHP
laravel框架实现为 Blade 模板引擎添加新文件扩展名操作示例
2020/01/25 PHP
thinkphp框架表单数组实现图片批量上传功能示例
2020/04/04 PHP
javascript使用正则获取url上的某个参数
2014/09/04 Javascript
JavaScript设计模式之建造者模式介绍
2014/12/28 Javascript
JavaScript组件开发完整示例
2015/12/15 Javascript
jQuery添加options点击事件并传值实例代码
2016/05/18 Javascript
angular+ionic 的app上拉加载更新数据实现方法
2017/01/16 Javascript
js编写简单的计时器功能
2017/07/15 Javascript
解决Vue+Element ui开发中碰到的IE问题
2018/09/03 Javascript
layui的面包屑或者表单不显示的解决方法
2019/09/05 Javascript
JavaScript简易计算器制作
2020/01/17 Javascript
JS forEach跳出循环2种实现方法
2020/06/24 Javascript
jQuery实现推拉门效果
2020/10/19 jQuery
JavaScript实现瀑布流布局的3种方式
2020/12/27 Javascript
Python实现快速排序和插入排序算法及自定义排序的示例
2016/02/16 Python
Python数据结构与算法之完全树与最小堆实例
2017/12/13 Python
python实现excel读写数据
2021/03/02 Python
python实现密码验证合格程序的思路详解
2020/06/01 Python
Python创建临时文件和文件夹
2020/08/05 Python
纯CSS3制作的简洁蓝白风格的登录模板(非IE效果更好)
2013/08/11 HTML / CSS
LivingSocial英国:英国本地优惠
2019/02/22 全球购物
美国排名第一的泳池用品直接来源:In The Swim
2019/09/23 全球购物
如何查找和删除数据库中的重复数据
2014/11/05 面试题
外语专业毕业生自我评价分享
2013/10/05 职场文书
医学检验专业个人求职信范文
2013/12/04 职场文书
遵纪守法演讲稿
2014/05/23 职场文书
大学生社会实践活动总结
2014/07/03 职场文书
公证委托书格式
2014/09/13 职场文书
泰山导游词
2015/02/02 职场文书
2015年中秋寄语
2015/07/31 职场文书