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实现的石头剪子布代码分享
Aug 22 Python
Python两个整数相除得到浮点数值的方法
Mar 18 Python
老生常谈Python基础之字符编码
Jun 14 Python
python利用thrift服务读取hbase数据的方法
Dec 27 Python
Python爬虫 urllib2的使用方法详解
Sep 23 Python
python实现从wind导入数据
Dec 03 Python
pytorch 实现查看网络中的参数
Jan 06 Python
TensorFlow自定义损失函数来预测商品销售量
Feb 05 Python
在Matplotlib图中插入LaTex公式实例
Apr 17 Python
Python __slots__的使用方法
Nov 15 Python
python+opencv3.4.0 实现HOG+SVM行人检测的示例代码
Jan 28 Python
python工具dtreeviz决策树可视化和模型可解释性
Mar 03 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 应用程序安全防范技术研究
2009/09/25 PHP
php计算数组相同值出现次数的代码(array_count_values)
2015/01/20 PHP
PHP简单的MVC框架实现方法
2015/12/01 PHP
php reset() 函数指针指向数组中的第一个元素并输出实例代码
2016/11/21 PHP
PHP实现截取中文字符串不出现?号的解决方法
2016/12/29 PHP
JavaScript监测ActiveX控件是否已经安装过的代码
2008/09/02 Javascript
JavaScript中json对象和string对象之间相互转化
2012/12/26 Javascript
使用jQuery清空file文件域的解决方案
2013/04/12 Javascript
Js放到HTML文件中的哪个位置有什么区别
2013/08/21 Javascript
IE的事件传递-event.cancelBubble示例介绍
2014/01/12 Javascript
Jquery倒计时源码分享
2014/05/16 Javascript
HTML+CSS+JS实现完美兼容各大浏览器的TABLE固定列
2015/04/26 Javascript
JavaScript实现打字效果的方法
2015/07/10 Javascript
JS利用cookie记忆当前位置的防刷新导航效果
2015/10/15 Javascript
Bootstrap 粘页脚效果
2016/03/28 Javascript
Node.js获取前端ajax提交的request信息
2017/02/20 Javascript
jQuery插件FusionWidgets实现的AngularGauge图效果示例【附demo源码】
2017/03/23 jQuery
node.js博客项目开发手记
2018/03/16 Javascript
JS+HTML5实现获取手机验证码倒计时按钮
2018/08/08 Javascript
Vue 使用计时器实现跑马灯效果的实例代码
2019/07/11 Javascript
vue-cli3配置与跨域处理方法
2019/08/17 Javascript
[04:48]DOTA2亚洲邀请赛林书豪为VGJ加油
2017/04/01 DOTA
netbeans7安装python插件的方法图解
2013/12/24 Python
在Python的框架中为MySQL实现restful接口的教程
2015/04/08 Python
Django使用httpresponse返回用户头像实例代码
2018/01/26 Python
Python实现k-means算法
2018/02/23 Python
对python实现二维函数高次拟合的示例详解
2018/12/29 Python
使用python将多个excel文件合并到同一个文件的方法
2019/07/09 Python
浅谈tensorflow 中的图片读取和裁剪方式
2020/06/30 Python
Tarte Cosmetics官网:美国最受欢迎的化妆品公司之一
2017/08/24 全球购物
经典c++面试题二
2015/08/14 面试题
大学生应聘自荐信
2013/10/11 职场文书
土地转让协议书
2014/09/27 职场文书
2015年教务处干事工作总结
2015/07/22 职场文书
早上好问候语大全
2015/11/10 职场文书
docker compose 部署 golang 的 Athens 私有代理问题
2022/04/28 Servers