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 while、for、生成器、列表推导等语句的执行效率测试
Jun 03 Python
windows下python和pip安装教程
May 25 Python
Python模拟百度自动输入搜索功能的实例
Feb 14 Python
Python定义函数功能与用法实例详解
Apr 08 Python
详细分析Python垃圾回收机制
Jul 01 Python
Python3爬虫中识别图形验证码的实例讲解
Jul 30 Python
Python+OpenCV图像处理——实现直线检测
Oct 23 Python
python 如何把docker-compose.yaml导入到数据库相关条目里
Jan 15 Python
matplotlib更改窗口图标的方法示例
Feb 03 Python
使用tkinter实现三子棋游戏
Feb 25 Python
Django 实现jwt认证的示例
Apr 30 Python
浅谈哪个Python库才最适合做数据可视化
Jun 28 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函数utf8转gb2312编码
2006/12/21 PHP
PHP静态新闻列表自动生成代码
2007/06/14 PHP
PHP会话处理的10个函数
2015/08/11 PHP
JQuery入门——用one()方法绑定事件处理函数(仅触发一次)
2013/02/05 Javascript
JQuery的ready函数与JS的onload的区别详解
2013/11/21 Javascript
JavaScript更改字符串的大小写
2015/05/07 Javascript
js实现简单div拖拽功能实例
2015/05/12 Javascript
基于Jquery实现焦点图淡出淡入效果
2015/11/30 Javascript
js实现拖拽功能
2017/03/01 Javascript
ES5学习教程之Array对象
2017/04/01 Javascript
jQuery EasyUI tree增加搜索功能的实现方法
2017/04/27 jQuery
详解nodejs微信jssdk后端接口
2017/05/25 NodeJs
Angularjs实现页面模板清除的方法
2018/07/20 Javascript
Vue.set() this.$set()引发的视图更新思考及注意事项
2018/08/30 Javascript
JS实现图片切换效果
2018/11/17 Javascript
微信小程序自定义弹窗滚动与页面滚动冲突的解决方法
2019/07/16 Javascript
Node.js安装详细步骤教程(Windows版)详解
2019/09/01 Javascript
js数组相减简单示例【删除a数组所有与b数组相同元素】
2020/03/04 Javascript
解决vue一个页面中复用同一个echarts组件的问题
2020/07/19 Javascript
Vue项目如何引入bootstrap、elementUI、echarts
2020/11/26 Vue.js
[00:32]2016完美“圣”典风云人物:Maybe宣传片
2016/12/05 DOTA
python+opencv实现的简单人脸识别代码示例
2017/11/14 Python
flask中的wtforms使用方法
2018/07/21 Python
用OpenCV将视频分解成单帧图片,图片合成视频示例
2019/12/10 Python
python程序文件扩展名知识点详解
2020/02/27 Python
基于Python下载网络图片方法汇总代码实例
2020/06/24 Python
lululemon美国官网:瑜伽服+跑步装备
2018/11/16 全球购物
ABOUT YOU罗马尼亚:超过600个时尚品牌
2019/09/19 全球购物
2014年个人业务工作总结
2014/11/17 职场文书
护士个人年终总结
2015/02/13 职场文书
证劵公司反洗钱宣传活动总结
2015/05/08 职场文书
办公经费申请报告
2015/05/15 职场文书
电影建党伟业观后感
2015/06/01 职场文书
工作会议简报
2015/07/20 职场文书
2016年11月份红领巾广播稿
2015/12/21 职场文书
解决Vue+SpringBoot+Shiro跨域问题
2021/06/09 Vue.js