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实现批量将word转html并将html内容发布至网站的方法
Jul 14 Python
Python实现包含min函数的栈
Apr 29 Python
python daemon守护进程实现
Aug 27 Python
对TensorFlow的assign赋值用法详解
Jul 30 Python
python读取word文档,插入mysql数据库的示例代码
Nov 07 Python
python web自制框架之接受url传递过来的参数实例
Dec 17 Python
Python中psutil的介绍与用法
May 02 Python
python 类之间的参数传递方式
Dec 20 Python
Django分组聚合查询实例分享
Apr 29 Python
基于python实现银行管理系统
Apr 20 Python
Python字符串格式化方式
Apr 07 Python
python使用pycharm安装pyqt5以及相关配置
Apr 22 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
php5中date()得出的时间为什么不是当前时间的解决方法
2008/06/30 PHP
PHP 5.3.0 安装分析心得
2009/08/07 PHP
PHP文件上传原理简单分析
2011/05/29 PHP
PHP中获取文件扩展名的N种方法小结
2012/02/27 PHP
php流量统计功能的实现代码
2012/09/29 PHP
PHP中is_dir()函数使用指南
2015/05/08 PHP
PHP使用Pthread实现的多线程操作实例
2015/11/14 PHP
yii2多图上传组件的使用教程
2018/05/10 PHP
客户端限制只能上传jpg格式图片的js代码
2010/12/09 Javascript
Jquery中find与each方法用法实例
2015/02/04 Javascript
jquery SweetAlert插件实现响应式提示框
2015/08/18 Javascript
js立即执行函数: (function ( ){})( ) 与 (function ( ){}( )) 有什么区别?
2015/11/18 Javascript
关于function类中定义变量this的简单说明
2016/05/28 Javascript
Vue下滚动到页面底部无限加载数据的示例代码
2018/04/22 Javascript
element中table高度自适应的实现
2020/10/21 Javascript
Python continue语句用法实例
2014/03/11 Python
Python网络爬虫实例讲解
2016/04/28 Python
详解使用python crontab设置linux定时任务
2016/12/08 Python
pycharm下打开、执行并调试scrapy爬虫程序的方法
2017/11/29 Python
如何在Django配置文件里配置session链接
2019/08/06 Python
pytorch numpy list类型之间的相互转换实例
2019/08/18 Python
HTML5中的新元素介绍
2008/10/17 HTML / CSS
巴西网上药房:onofre
2016/11/21 全球购物
通息工程毕业生自荐信
2013/10/16 职场文书
最新茶叶店创业计划书
2014/01/14 职场文书
环保建议书200字
2014/05/14 职场文书
环境卫生倡议书
2014/08/29 职场文书
2014年学习厉行节约反对浪费思想汇报
2014/09/10 职场文书
单位委托书
2014/10/15 职场文书
音乐教师个人工作总结
2015/02/06 职场文书
公司新员工欢迎词
2015/09/30 职场文书
2019财务管理制度最新范本!
2019/07/09 职场文书
你会写报告?产品体验报告到底该怎么写?
2019/08/14 职场文书
Redis做数据持久化的解决方案及底层原理
2021/07/15 Redis
Go 内联优化让程序员爱不释手
2022/06/21 Golang
JS前端轻量fabric.js系列之画布初始化
2022/08/05 Javascript