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读取excel表格生成erlang数据
Aug 26 Python
Python从零开始创建区块链
Mar 06 Python
python pandas库中DataFrame对行和列的操作实例讲解
Jun 09 Python
详解python的argpare和click模块小结
Mar 31 Python
Django中使用 Closure Table 储存无限分级数据
Jun 06 Python
python aiohttp的使用详解
Jun 20 Python
利用python实现PSO算法优化二元函数
Nov 13 Python
Python 实现将数组/矩阵转换成Image类
Jan 09 Python
Django 解决distinct无法去除重复数据的问题
May 20 Python
python 代码实现k-means聚类分析的思路(不使用现成聚类库)
Jun 01 Python
python实现数据结构中双向循环链表操作的示例
Oct 09 Python
python实现简单的聊天小程序
Jul 07 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
SONY ICF-SW07收音机电路分析
2021/03/02 无线电
php+js实现图片的上传、裁剪、预览、提交示例
2013/08/27 PHP
php 根据url自动生成缩略图并处理高并发问题
2014/01/23 PHP
PHP写的资源下载防盗链类分享
2014/05/12 PHP
php中Session的生成机制、回收机制和存储机制探究
2014/08/19 PHP
php抓取网站图片并保存的实现方法
2015/10/29 PHP
PDO::beginTransaction讲解
2019/01/27 PHP
jQuery之DOM对象和jQuery对象的转换与区别分析
2015/01/08 Javascript
JavaScript仿微博输入框效果(案例分析)
2016/12/06 Javascript
javascript html5轻松实现拖动功能
2017/03/01 Javascript
关于vue.js组件数据流的问题
2017/07/26 Javascript
webpack中使用iconfont字体图标的方法
2018/02/22 Javascript
Koa2微信公众号开发之消息管理
2018/05/16 Javascript
使用wxapp-img-loader自定义组件实现微信小程序图片预加载功能
2018/10/18 Javascript
node.js基于socket.io快速实现一个实时通讯应用
2019/04/23 Javascript
解决layer弹出层msg的文字不显示的问题
2019/09/11 Javascript
vue实现修改图片后实时更新
2019/11/14 Javascript
微信小程序实现列表左右滑动
2020/11/19 Javascript
python新手经常遇到的17个错误分析
2014/07/30 Python
对于Python异常处理慎用“except:pass”建议
2015/04/02 Python
python添加模块搜索路径和包的导入方法
2019/01/19 Python
使用python创建生成动态链接库dll的方法
2020/05/09 Python
Python socket服务常用操作代码实例
2020/06/22 Python
用python读取xlsx文件
2020/12/17 Python
python 利用openpyxl读取Excel表格中指定的行或列教程
2021/02/06 Python
利用CSS3的定位页面元素
2009/08/29 HTML / CSS
入学申请自荐信范文
2014/02/26 职场文书
法院授权委托书格式
2014/09/28 职场文书
北京离婚协议书范文2014
2014/09/29 职场文书
党的群众路线教育实践活动个人整改落实情况汇报
2014/10/28 职场文书
出国留学单位推荐信
2015/03/26 职场文书
Promise面试题详解之控制并发
2021/05/14 面试题
代码解析React中setState同步和异步问题
2021/06/03 Javascript
Nginx使用Lua模块实现WAF的原理解析
2021/09/04 Servers
Python使用MapReduce进行简单的销售统计
2022/04/22 Python
Ubuntu安装Mysql+启用远程连接的完整过程
2022/06/21 Servers