Python何时应该使用Lambda函数


Posted in Python onJuly 02, 2019

Python 中定义函数有两种方法,一种是用常规方式 def 定义,函数要指定名字,第二种是用 lambda 定义,不需要指定名字,称为 Lambda 函数。

Lambda 函数又称匿名函数,匿名函数就是没有名字的函数,函数没有名字也行?当然可以啦。有些函数如果只是临时一用,而且它的业务逻辑也很简单时,就没必要非给它取个名字不可。

好比电影里面的群众演员,往往他们的戏份很少,最多是衬托主演,跑跑龙套,他们需要名字吗?不需要,因为他们仅仅只是临时出镜,下次可能就用不着了,所以犯不着费心思给他们每个人编个号取个名字,毕竟取个优雅的名字是很费劲的事情。

先来看个简单 lambda 函数

>>> lambda x, y : x+y
<function <lambda> at 0x102bc1c80>

x 和 y 是函数的两个参数,冒号后面的表达式是函数的返回值,你能一眼看出这个函数就是是在求两个变量的和,但作为一个函数,没有名字如何使用呢?这里我们暂且给这个匿名函数绑定一个名字,这样使得我们调用匿名函数成为可能

>>> add = lambda x, y : x+y
>>> add
<function <lambda> at 0x102bc2140>
>>> add(1,2)
3

它等同于常规函数

>>> def add2(x, y):
... return x+y
...
>>> add2
<function add2 at 0x102bc1c80>
>>> add2(1,2)
3

如果定义匿名函数,还要给它绑定一个名字的话,有点画蛇添足,通常是直接使用 lambda 函数。那么 lamdba 函数的正确使用场景在哪呢?

1、函数式编程

尽管 Python 算不上是一门纯函数式编程语言,但它本身提供了很多函数式编程的特性,像 map、reduce、filter、sorted 这些函数都支持函数作为参数,lambda 函数就可以应用在函数式编程中。

请看题:一个整数列表,要求按照列表中元素的绝对值大小升序排列,你会怎么做?思考一分钟往下看

>>> list1 = [3,5,-4,-1,0,-2,-6]
>>> sorted(list1, key=lambda x: abs(x))
[0, -1, -2, 3, -4, 5, -6]

排序函数 sorted 支持接收一个函数作为参数,该参数作为 sorted 的排序依据,这里按照列表元素的绝对值进行排序,当然,我也可以用普通函数来实现:

>>> def foo(x):
... return abs(x)
...
>>> sorted(list1, key=foo)
[0, -1, -2, 3, -4, 5, -6]

只不过是这种方式代码看起来不够 Pythonic 而已。

2、闭包

闭包本身是一个晦涩难懂的概念,它可以专门单独用一篇文章来介绍,不过在这里我们可以简单粗暴地理解为闭包就是一个定义在函数内部的函数,闭包使得变量即使脱离了该函数的作用域范围也依然能被访问到。

来看一个用 lambda 函数作为闭包的例子。

>>> def my_add(n):
... return lambda x:x+n
...
>>> add_3 = my_add(3)
>>> add_3(7)
10

这里的 lambda 函数就是一个闭包,在全局作用域范围中,add_3(7) 可以正常执行且返回值为10,之所以返回10是因为在 my_add 局部作用域中,变量 n 的值在闭包的作用使得它在全局作用域也可以被访问到。

换成常规函数也可以实现闭包,只不过是这种方式稍显??隆?/p>

>>> def my_add(n):
... def wrapper(x):
... return x+n
... return wrapper
...
>>> add_5 = my_add(5)
>>> add_5(2)
7

那么是不是任何情况 lambda 函数都要比常规函数更清晰明了呢?看这个例子:

f = lambda x: [[y for j, y in enumerate(set(x)) if (i >> j) & 1] for i in range(2**len(set(x)))]

这是一个返回某个集合的所有子集的 lambda 函数,你看明白了吗?我是很难一眼看出来

zen of python 中有这样一句话是 Explicit is better than implicit(明了胜于晦涩)。记住,如果用 lambda 函数不能使你的代码变得更清晰时,这时你就要考虑使用常规的方式来定义函数。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python中mechanize库的简单使用示例
Jan 10 Python
Python爬取读者并制作成PDF
Mar 10 Python
python中lambda与def用法对比实例分析
Apr 30 Python
Python3实现购物车功能
Apr 18 Python
浅谈pandas筛选出表中满足另一个表所有条件的数据方法
Feb 08 Python
对pyqt5多线程正确的开启姿势详解
Jun 14 Python
pandas dataframe的合并实现(append, merge, concat)
Jun 24 Python
使用PyInstaller将Pygame库编写的小游戏程序打包为exe文件及出现问题解决方法
Sep 06 Python
Python大数据之从网页上爬取数据的方法详解
Nov 16 Python
PyTorch之nn.ReLU与F.ReLU的区别介绍
Jun 27 Python
Python insert() / append() 用法 Leetcode实战演示
Mar 31 Python
关于python类SortedList详解
Sep 04 Python
Python Pandas分组聚合的实现方法
Jul 02 #Python
使用Python做垃圾分类的原理及实例代码附源码
Jul 02 #Python
python flask框架实现重定向功能示例
Jul 02 #Python
python实现串口自动触发工作的示例
Jul 02 #Python
python常用函数与用法示例
Jul 02 #Python
pandas DataFrame 行列索引及值的获取的方法
Jul 02 #Python
python for和else语句趣谈
Jul 02 #Python
You might like
十天学会php之第十天
2006/10/09 PHP
使用phpQuery采集网页的方法
2013/11/13 PHP
PHP CodeIgniter框架的工作原理研究
2015/03/30 PHP
PHP技术开发微信公众平台
2015/07/22 PHP
验证控件与Button的OnClientClick事件详细解析
2013/12/04 Javascript
css与javascript跨浏览器兼容性总结
2014/09/15 Javascript
jquery实现根据浏览器窗口大小自动缩放图片的方法
2015/07/17 Javascript
jQuery+php实时获取及响应文本框输入内容的方法
2016/05/24 Javascript
canvas 画布在主流浏览器中的尺寸限制详细介绍
2016/12/15 Javascript
jQuery+HTML5实现弹出创意搜索框层
2016/12/29 Javascript
微信小程序 登录实例详解
2017/01/16 Javascript
javascript+css3开发打气球小游戏完整代码
2017/11/28 Javascript
详解Angular中实现自定义组件的双向绑定的两种方法
2018/11/23 Javascript
Vue + element 实现多选框组并保存已选id集合的示例代码
2020/06/03 Javascript
JS制作简易计算器的实例代码
2020/07/04 Javascript
vue-drawer-layout实现手势滑出菜单栏
2020/11/19 Vue.js
react项目从新建到部署的实现示例
2021/02/19 Javascript
[03:17]2014DOTA2 国际邀请赛中国区预选赛 四强专访
2014/05/23 DOTA
python使用正则表达式检测密码强度源码分享
2014/06/11 Python
在Python的Django框架中使用通用视图的方法
2015/07/21 Python
原生python实现knn分类算法
2019/10/24 Python
python获取array中指定元素的示例
2019/11/26 Python
用Python做一个久坐提醒小助手的示例代码
2020/02/10 Python
Python3 字典dictionary入门基础附实例
2020/02/10 Python
python使用turtle库绘制奥运五环
2020/02/24 Python
Django扫码抽奖平台的配置过程详解
2021/01/14 Python
联想英国官网:Lenovo英国
2019/07/17 全球购物
美国隐形眼镜网上商店:Lens.com
2019/09/03 全球购物
Currentbody德国站:健康与美容技术专家
2020/04/05 全球购物
用你熟悉的语言写一个连接ORACLE数据库的程序,能够完成修改和查询工作
2012/06/11 面试题
下列程序在32位linux或unix中的结果是什么
2014/03/25 面试题
董事长岗位职责
2013/11/30 职场文书
大一期末自我鉴定
2013/12/13 职场文书
致长跑运动员广播稿
2014/01/31 职场文书
中介业务员岗位职责
2014/04/09 职场文书
PyTorch 如何设置随机数种子使结果可复现
2021/05/12 Python