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使用rsa加密算法模块模拟新浪微博登录
Jan 22 Python
Python中逗号的三种作用实例分析
Jun 08 Python
python实现图像识别功能
Jan 29 Python
Python中使用Counter进行字典创建以及key数量统计的方法
Jul 06 Python
python读取txt文件,去掉空格计算每行长度的方法
Dec 20 Python
Python数据可视化教程之Matplotlib实现各种图表实例
Jan 13 Python
python flask解析json数据不完整的解决方法
May 26 Python
PHP统计代码行数的小代码
Sep 19 Python
对python中 math模块下 atan 和 atan2的区别详解
Jan 17 Python
以SQLite和PySqlite为例来学习Python DB API
Feb 05 Python
Django ModelForm操作及验证方式
Mar 30 Python
Python字典的基础操作
Nov 01 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函数
2006/12/06 PHP
php中静态类与静态变量用法的区别分析
2015/01/15 PHP
javascript arguments 传递给函数的隐含参数
2009/08/21 Javascript
JS函数验证总结(方便js客户端输入验证)
2010/10/29 Javascript
jquery清空表单数据示例分享
2014/02/13 Javascript
JavaScript中的Math.sin()方法使用详解
2015/06/15 Javascript
jQuery 如何给Carousel插件添加新的功能
2016/04/18 Javascript
js获取当前年月日-YYYYmmDD格式的实现代码
2016/06/01 Javascript
解决jQuery ajax请求在IE6中莫名中断的问题
2016/06/20 Javascript
jQuery事件委托之Safari
2016/07/05 Javascript
setTimeout学习小结
2017/02/08 Javascript
jQuery图片查看插件Magnify开发详解
2017/12/25 jQuery
vue生成token并保存到本地存储中
2018/07/17 Javascript
用vue-cli开发vue时的代理设置方法
2018/09/20 Javascript
vue+iview 兼容IE11浏览器的实现方法
2019/01/07 Javascript
如何基于JavaScript判断图片是否加载完成
2019/12/28 Javascript
js实现蒙版效果
2020/01/11 Javascript
封装一下vue中的axios示例代码详解
2020/02/16 Javascript
使用Python操作Elasticsearch数据索引的教程
2015/04/08 Python
python使用Image处理图片常用技巧分析
2015/06/01 Python
对python抓取需要登录网站数据的方法详解
2018/05/21 Python
python dict 相同key 合并value的实例
2019/01/21 Python
Python之修改图片像素值的方法
2019/07/03 Python
python使用pygame实现笑脸乒乓球弹珠球游戏
2019/11/25 Python
Django用户登录与注册系统的实现示例
2020/06/03 Python
五分钟学会怎么用Pygame做一个简单的贪吃蛇
2021/01/06 Python
css3中新增的样式使用示例附效果图
2014/08/19 HTML / CSS
CSS3实现文字波浪线效果示例代码
2016/11/20 HTML / CSS
Luxplus丹麦:香水和个人护理折扣
2018/04/23 全球购物
Coggles美国/加拿大:高级国际时装零售商
2018/10/23 全球购物
小学生美德少年事迹
2014/02/02 职场文书
奥巴马英文演讲稿
2014/05/15 职场文书
2015重阳节座谈会主持词
2015/07/30 职场文书
火锅店的开业营销方案范本!
2019/07/05 职场文书
评估“风险”创业计划的几大要点
2019/08/12 职场文书
Java实现聊天机器人完善版
2021/07/04 Java/Android