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 def函数的定义、使用及参数传递实现代码
Aug 10 Python
Python 装饰器使用详解
Jul 29 Python
Python 爬虫之超链接 url中含有中文出错及解决办法
Aug 03 Python
Python中用post、get方式提交数据的方法示例
Sep 22 Python
pandas or sql计算前后两行数据间的增值方法
Apr 20 Python
Python列表list排列组合操作示例
Dec 18 Python
python 用下标截取字符串的实例
Dec 25 Python
Python实现点阵字体读取与转换的方法
Jan 29 Python
django实现用户注册实例讲解
Oct 30 Python
tensorflow对图像进行拼接的例子
Feb 05 Python
Python3运算符常见用法分析
Feb 14 Python
2021年的Python 时间轴和即将推出的功能详解
Jul 27 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实现mysql封装类示例
2014/05/07 PHP
php根据某字段对多维数组进行排序的方法
2015/03/07 PHP
Linux(CentOS)下PHP扩展PDO编译安装的方法
2016/04/07 PHP
根据key删除数组中指定的元素实现方法
2017/03/02 PHP
PHP如何防止XSS攻击与XSS攻击原理的讲解
2019/03/22 PHP
拖拉表格的JS函数
2008/11/20 Javascript
javascript 事件查询综合 推荐收藏
2010/03/10 Javascript
google jQuery 引用文件,jQuery 引用地址集合(jquery 1.2.6至jquery1.5.2)
2011/04/24 Javascript
JavaScript调用堆栈及setTimeout使用方法深入剖析
2013/02/16 Javascript
正则表达式(语法篇推荐)
2016/06/24 Javascript
AngularJS基础 ng-mouseover 指令简单示例
2016/08/02 Javascript
Angularjs中controller的三种写法分享
2016/09/21 Javascript
BootStrap tooltip提示框使用小结
2016/10/26 Javascript
jQuery Password Validation密码验证
2016/12/30 Javascript
基于JS实现9种不同的面包屑和分布式多步骤导航效果
2017/02/21 Javascript
基于rem的移动端响应式适配方案(详解)
2017/07/07 Javascript
浅谈在fetch方法中添加header后遇到的预检请求问题
2017/08/31 Javascript
使用nvm和nrm优化node.js工作流的方法
2019/01/17 Javascript
Python中的hypot()方法使用简介
2015/05/18 Python
用python写的一个wordpress的采集程序
2016/02/27 Python
利用rest framework搭建Django API过程解析
2019/08/31 Python
python开发实例之Python的Twisted框架中Deferred对象的详细用法与实例
2020/03/19 Python
Keras-多输入多输出实例(多任务)
2020/06/22 Python
基于Python爬取素材网站音频文件
2020/10/21 Python
利用CSS3的flexbox实现水平垂直居中与三列等高布局
2016/09/12 HTML / CSS
mui几种页面跳转方式对比总结概括
2017/08/18 HTML / CSS
HTML5拖拽功能实现的拼图游戏
2018/07/31 HTML / CSS
Html5定位终极解决方案
2020/02/05 HTML / CSS
Html+Css+Jquery实现左侧滑动拉伸导航菜单栏的示例代码
2020/03/17 HTML / CSS
自主招生自荐信格式
2013/12/03 职场文书
2014年大学生自我评价
2014/01/19 职场文书
资源工程专业毕业生求职信
2014/02/27 职场文书
企业活动策划方案
2014/06/02 职场文书
优秀班主任推荐材料
2014/12/17 职场文书
flex弹性布局详解
2022/03/20 HTML / CSS
Python实现对齐打印 format函数的用法
2022/04/28 Python