[微科技分享]Python3中lambda表达式与函数式编程讲解
今天小编就为大家分享一篇关于Python3中lambda表达式与函数式编程讲解 , 小编觉得内容挺不错的 , 现在分享给大家 , 具有很好的参考价值 , 需要的朋友一起跟随小编来看看吧
【[微科技分享]Python3中lambda表达式与函数式编程讲解】
本文插图
简单来说 , 编程中提到的 lambda 表达式 , 通常是在需要一个函数 , 但是又不想费神去命名一个函数的场合下使用 , 也就是指匿名函数 。 其一般有如下几种使用方式:
1、lambda的一般形式是关键字lambda后面跟一个或多个参数 , 紧跟一个冒号 , 以后是一个表达式 。 lambda是一个表达式而不是一个语句 。 它能够出现在Python语法不允许def出现的地方 。 作为表达式 , lambda返回一个值(即一个新的函数) 。 lambda用来编写简单的函数 , 而def用来处理更强大的任务 。 例如:f = lambda x,y,z : x+y+z print f(1,2,3) g = lambda x,y=2,z=3 : x+y+z print g(1,z=4,y=5)
结果:6 10
2、lambda表达式常用来编写跳转表(jump table) , 就是行为的列表或字典 。 例如:L = [(lambda x: x**2),(lambda x: x**3),(lambda x: x**4)] print L[0](2),L[1](2),L[2](2) D = {'f1':(lambda: 2+3),'f2':(lambda: 2*3),'f3':(lambda: 2**3)} print D['f1'](),D['f2'](),D['f3']()
结果:4 8 16 5 6 8
3、lambda表达式可以嵌套使用 , 但是从可读性的角度来说 , 应尽量避免使用嵌套的lambda表达式 。
Lambda函数又称匿名函数 , 匿名函数就是没有名字的函数 , 函数没有名字也行?当然可以啦 。 有些函数如果只是临时一用 , 而且它的业务逻辑也很简单时 , 就没必要非给它取个名字不可 。 lamdba函数的正确使用场景:
1、函数式编程
尽管Python算不上是一门纯函数式编程语言 , 但它本身提供了很多函数式编程的特性 , Python中 , 也有几个定义好的全局函数方便使用的 , 像map、reduce、filter、sorted这些函数都支持函数作为参数 , lambda函数就可以应用在函数式编程中 。 如下:from functools import reduce foo = [2, 18, 9, 22, 17, 24, 8, 12, 27] print (list(filter(lambda x: x % 3 == 0, foo))) #[18, 9, 24, 12, 27] print (list(map(lambda x: x * 2 + 10, foo))) #[14, 46, 28, 54, 44, 58, 26, 34, 64] print (reduce(lambda x, y: x + y, foo)) #139
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的值在闭包的作用使得它在全局作用域也可以被访问到 。
换成常规函数也可以实现闭包 , 只不过是这种方式稍显啰嗦 , 如下:>>> 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函数 , 相信你要看一会儿才能看明白 。
python中有这样一句话是Explicit is better than implicit(明了胜于晦涩) 。 若用lambda函数不能使代码变得更清晰 , 就要考虑使用常规的方式来定义函数 。
- 中国网科技@撤出液晶面板生产,三星将关闭两座工厂
- #即科技#107国赞同票作废!,想“加入”联合国?中国使用一票否决
- 【腾讯科技】全球应用市场第一季度大爆发:花费达234亿美元创纪录 时长增20%
- 即科技■决定权掌握在中国手,?联合国五常将变六常?此国获美俄一致力挺
- #新华网#中国卫生专家与沙特同行分享抗疫经验
- 「新华网」中美举行网络研讨会分享抗击疫情经验
- 『极速聊科技』目前仅剩10余人,暴风集团:员工持续大量流失
- 【科技生活快报】普京:已与欧佩克和美国就石油价格下跌问题进行讨论
- 「科技小数据」消费信贷的客户呈现出年轻化的趋势,新消费崛起
- 『科技拌饭』敌人无处遁形,手机变身物理外挂?华为MateXs双倍视野刚枪