Python3中lambda表达式与函数式编程讲解


Posted in Python onJanuary 14, 2019

简单来说,编程中提到的 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)

结果:


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的值在闭包的作用使得它在全局作用域也可以被访问到。

换成常规函数也可以实现闭包,只不过是这种方式稍显??拢?缦拢?/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函数,相信你要看一会儿才能看明白。

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

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。如果你想了解更多相关内容请查看下面相关链接

Python 相关文章推荐
Python WXPY实现微信监控报警功能的代码
Oct 20 Python
Python编程实现粒子群算法(PSO)详解
Nov 13 Python
Python3 循环语句(for、while、break、range等)
Nov 20 Python
django解决跨域请求的问题
Nov 11 Python
基于Python打造账号共享浏览器功能
May 30 Python
python 申请内存空间,用于创建多维数组的实例
Dec 02 Python
flask实现验证码并验证功能
Dec 05 Python
Python实现线性判别分析(LDA)的MATLAB方式
Dec 09 Python
pytorch1.0中torch.nn.Conv2d用法详解
Jan 10 Python
python爬虫实现获取下一页代码
Mar 13 Python
Python 字典一个键对应多个值的方法
Sep 29 Python
pycharm中选中一个单词替换所有重复单词的实现方法
Nov 17 Python
Jupyter notebook在mac:linux上的配置和远程访问的方法
Jan 14 #Python
使用CodeMirror实现Python3在线编辑器的示例代码
Jan 14 #Python
python 根据时间来生成唯一的字符串方法
Jan 14 #Python
python ipset管理 增删白名单的方法
Jan 14 #Python
python 监听salt job状态,并任务数据推送到redis中的方法
Jan 14 #Python
在python 不同时区之间的差值与转换方法
Jan 14 #Python
Python常见数据结构之栈与队列用法示例
Jan 14 #Python
You might like
PHP实现多图片上传类实例
2014/07/26 PHP
PHP实现的登录,注册及密码修改功能分析
2016/11/25 PHP
详解yii2实现分库分表的方案与思路
2017/02/03 PHP
JQuery中$之选择器用法介绍
2011/04/05 Javascript
仿百度的关键词匹配搜索示例
2013/09/25 Javascript
使用js声明数组,对象在jsp页面中(获得ajax得到json数据)
2013/11/05 Javascript
jquery实现当滑动到一定位置时固定效果
2014/06/17 Javascript
JavaScript中对象property的删除方法介绍
2014/12/30 Javascript
jQuery根据元素值删除数组元素的方法
2015/06/24 Javascript
BootStrap Fileinput初始化时的一些参数
2016/12/30 Javascript
vue bootstrap小例子一枚
2017/06/09 Javascript
你有必要知道的10个JavaScript难点
2017/07/25 Javascript
浅谈es6语法 (Proxy和Reflect的对比)
2017/10/24 Javascript
详解NODEJS基于FFMPEG视频推流测试
2017/11/17 NodeJs
vue踩坑记-在项目中安装依赖模块npm install报错
2019/04/02 Javascript
详解VUE前端按钮权限控制
2019/04/26 Javascript
微信JS-SDK实现微信会员卡功能(给用户微信卡包里发送会员卡)
2019/07/25 Javascript
Vuex中的Mutations的具体使用方法
2020/06/01 Javascript
JS闭包原理及其使用场景解析
2020/12/03 Javascript
[01:04:01]2014 DOTA2华西杯精英邀请赛5 24 DK VS VG
2014/05/25 DOTA
[01:27]2014DOTA2展望TI 剑指西雅图IG战队专访
2014/06/30 DOTA
Python实现将一个大文件按段落分隔为多个小文件的简单操作方法
2017/04/17 Python
python字符串过滤性能比较5种方法
2017/06/22 Python
python实现人民币大写转换
2018/06/20 Python
python中利用matplotlib读取灰度图的例子
2019/12/07 Python
Python脚本如何在bilibili中查找弹幕发送者
2020/06/04 Python
vscode+PyQt5安装详解步骤
2020/08/12 Python
amazeui时间组件的实现示例
2020/08/18 HTML / CSS
体育教育毕业生自荐信
2013/11/21 职场文书
视光学专业自荐信
2014/06/24 职场文书
客户答谢会活动方案
2014/08/31 职场文书
大一新生军训新闻稿
2015/07/17 职场文书
sql server删除前1000行数据的方法实例
2021/08/30 SQL Server
Python爬虫 简单介绍一下Xpath及使用
2022/04/26 Python
Win11无法安装更新补丁KB3045316怎么办 附KB3045316补丁修复教程
2022/08/14 数码科技
mysql序号rownum行号实现方式
2022/12/24 MySQL