Python中lambda的使用,与它的三个好基友介绍!
匿名函数lambda
除了def语句,python还提供了一种生成函数对象的表达式形式。由于它与LISP语言中的一个工具类似,所以称为lambda。
就像def一样,这个表达式创建了一个之后能够调用的函数,但是它返回一个函数而不是将这个函数赋值给一个变量。这些就是lambda叫做匿名函数的原因。实际上,他常常以一种行内进行函数定义的方式使用,或者用作推迟执行一些代码。
lambda的一般形式是关键字lambda之后跟着一个或多个参数(与一个def头部内用括号括起来的参数列表类似),紧跟着是一个冒号,之后是表达式
lambda arg1,arg2,argn:expression using arguments
由lambda表达式所返回的函数对象与由def创建并复制后的函数对象工作起来是完全一致的,但lambda有一些不同之处,让其扮演特定的角色时更有用:
lambda是一个表达式,而不是一个语句
因为这一点,lambda可以出现在python语法不允许def出现的地方。
此外,作为一个表达式,lambda返回一个值(一个新的函数),可以选择性的赋值给一个变量
相反,def语句总是得在头部将一个新的函数赋值给一个变量,而不是将这个函数作为结果返回。
lambda的主题是单个表达式,而不是一个代码块
这个lambda的主题简单的就好像放在def主体return语句中的代码一样。
简单的将结果写成一个顺畅的表达式,而不是明确的返回。
但由于它仅限于表达式,故lambda通常要比def功能少…你仅能够在lambda主体中封装有限的逻辑进去,因为他是一个为编写简单函数而设计的。
除了上述这些差别,def和lambda都能过做同样种类的工作
def与lambda的相同用法
x = lambda x, y, z: x + y + z x(2, 3, 4) >>> 9 # Python学习交流QQ群:857662006 y = (lambda a='hello', b='world': a + b) y(b='Python') >>> 'hellopython'
为什么使用lambda
看过上面的两个小例子,很多人会说这个和def没什么差别,我们又为什么要使用lambda呢?
通常来说,lambda起到一种函数的速写作用,允许在使用的代码内嵌一个函数的定义,他完全是可选的(是可以使用def代替他们),但是在你仅需要切入一段可执行代码的情况下,它会带来一个更简洁的书写效果。
lambda通常用来编写跳转表,也就是行为的列表或者字典,能够按照需求执行操作,比如:
l = [lambda x: x ** 2, lambda x: x ** 3, lambda x: x ** 4] for f in l: print(f(2)) >>> 4 >>> 8 >>> 16 print(l[0](3)) >>> 9
当需要把小段的可执行代码编写进def语句从语法上不能实现的地方是,lambda表达式作为def的一种速写来说,是最为有用的,如果上面的代码用def编写,则变为:
def f1(x): return x ** 2 # Python学习交流QQ群:857662006 def f2(x): return x ** 3 def f3(x): return x ** 4 l = [f1, f2, f3] for f in l: print(f(2)) print(l[0](3))
实际上,我们可以用python中的字典或者其他的数据结构来构建更多种类的行为表,从而做同样的事情。
lambda中实现if-else
Python中具备的单行表达式:if a:b else c语法在lambda中同样适用:
lower = lambda x,y:x if x<y else y lower(4,5) >>> 4
看了半天,大家可能也并未觉得lambda在python中到底比def优越与便利在哪里,那么说到lambda,就必须要提及三个函数map、filter、reduce,当你接触了这三个函数,那么你才能感受到lambda真实的方便之处
map 函数
程序对列表或者其他序列常常要做的一件事就是对每个元素进行一个操作,并把其结果集合起来。
python提供了一个工具map,它会对一个序列对象中的每一个元素应用该的函数,并返回一个包含了所有函数调用结果的列表。
举个栗子,我们有一个列表,需要将列表的每一个字段+10,我们该如何操作?
list_show = [1, 2, 3, 4] # 方式1 # Python学习交流QQ群:857662006 new_list_show = [] for i in list_show: new_list_show.append(i + 10) print(new_list_show) # 方式2 def adds(x): return x + 10 print(list(map(adds, list_show))) # 更优雅的方式3: print(list(map(lambda x: x + 10, list_show)))
看看上面三个实现方式,你觉得那种更加Pythonic?
eg:需要注意一点,map在python3中是一个可迭代对象,引入需要使用列表调用来使它生成所有的结果用于显示,python2不必如此。
当然map的阐述函数,不仅仅支持自己编写的,同样也支持python自带的多种函数,比如:
list_show = [1, -2, 3, -4, 5, -6] print(list(map(abs, list_show))) >>> [1, 2, 3, 4, 5, 6]
filter函数
filter通过字面意思,大家就知道它的用处了,用于数据的过滤操作,它也是lambda的一个好基友,举个栗子。
我们需要过滤0-9中,能被2整除的数字组成一个列表,我们该如何操作?只需要一行代码:
print(list(filter(lambda x: x % 2 == 0, range(10)))) >>> [0, 2, 4, 6, 8]
没错,filter就是这么的简单实用….
reduce的妙用
reduce在python2中是一个简单的函数,但在python3中它责备收录与functools中。
它接收一个迭代器来处理并返回一个单个的结果。
list_show = [1, 2, 3, 4] print(reduce(lambda x, y: x + y, list_show)) >>> 10 print(reduce(lambda x, y: x * y, list_show)) >>> 24
lambda的实用与它的好基友就介绍到这里,希望对大家有所帮助。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
面试阿里被“怼”,在源码分析和项目上栽跟头,半年后二战终拿下OFFER
源码分析和项目实战经验一直是大厂比较看重的要素,近两年来,许多大厂在面试中都会频繁问到源码&原理,记得今年上半年第一次去阿里面试时,可以说是“无地自容”,被面试官逼问得哑口无言,尤其是项目部分,(被怒鄙视一波),包括难点,怎么迭代项目。 第一次阿里面经分享 1.view绘制流程,onLayout位置不够怎么办 2.binder IPC过程描述 3.transact onTransact方法区别是什么,server怎么判断要执行哪个方法 4.leak canary原理 5.tcp编程 6.策略模式和状态模式 的区别 双检单例 装饰者模式 7.Alloctracking 8.ams了解多少,看了多少源码 9.glide源码 10.uil源码 11.MVP MVC 12.手写代码,线程安全栈(用LinkedList作为基础数据结构实现后建议我改成用数组,结果出现了内存泄漏。) 13.cpu优化 14.内存优化当时面试问的很广也很深,有一些不会的直接说了不清楚。尤其是在这些glide源码、uil源码以及看了多少源码这些回答都不理想,面完后礼貌性的回复“让回去等通知”。当然这一等就是大半...
- 下一篇
OmniTool.NET开发包 - 用C#高效开发Omni/USDT区块链应用
OmniTool.Net开发包适用于为.Net/C#应用快速增加对Omni Layer/USDT数字资产的支持能力,即支持使用自有Omni Layer节点的应用场景,也支持基于第三方API服务和离线裸交易的轻量级部署场景。OmniTool.Net开发包官方下载地址:http://sc.hubwiz.com/codebag/omni-dotnet-lib/。 1、开发包概述 OmniTool.Net开发包主要包含以下特性: 完善的Omni Layer节点RPC API封装 支持利用自有节点或第三方服务获取指定地址的比特币utxo集合 支持离线生成omni代币转账裸交易 支持利用自有节点或第三方服务广播裸交易 OmniTool.Net支持本地部署的Omnicored节点,也支持第三方服务提供的开放API,要增加新的第三方服务也非常简单,只需要参考代码实现如下接口: IUtxoCollector:utxo收集器 IBroadcaster:裸交易广播器 OmniTool.Net软件包当前版本1.0.0,主要类/接口及关系如下图所示: OmniTool.Net软件包主要代码文件清单如下: 代码文...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Linux系统CentOS6、CentOS7手动修改IP地址
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- Hadoop3单机部署,实现最简伪集群
- CentOS7安装Docker,走上虚拟化容器引擎之路
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8编译安装MySQL8.0.19
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7