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 不关闭控制台的实现方法
Oct 23 Python
Python中.py文件打包成exe可执行文件详解
Mar 22 Python
python中的迭代和可迭代对象代码示例
Dec 27 Python
Python中fnmatch模块的使用详情
Nov 30 Python
Python面向对象程序设计类的封装与继承用法示例
Apr 12 Python
Python利用pandas处理Excel数据的应用详解
Jun 18 Python
Python 硬币兑换问题
Jul 29 Python
Pandas0.25来了千万别错过这10大好用的新功能
Aug 07 Python
python使用opencv在Windows下调用摄像头实现解析
Nov 26 Python
PyQt5+Pycharm安装和配置图文教程详解
Mar 24 Python
Python configparser模块常用方法解析
May 22 Python
浅谈TensorFlow中读取图像数据的三种方式
Jun 30 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
ThinkPHP之用户注册登录留言完整实例
2014/07/22 PHP
TP5框架请求响应参数实例分析
2019/10/17 PHP
php实现根据身份证获取精准年龄
2020/02/26 PHP
PHP如何通过带尾指针的链表实现'队列'
2020/10/22 PHP
js获得参数的getParameter使用示例
2014/02/26 Javascript
nodejs教程之环境安装及运行
2014/11/21 NodeJs
根据配置文件加载js依赖模块
2014/12/29 Javascript
javascript与jquery中的this关键字用法实例分析
2015/12/24 Javascript
javascript原型继承工作原理和实例详解
2016/04/07 Javascript
微信小程序 toast 详解及实例代码
2016/11/09 Javascript
js前端日历控件(悬浮、拖拽、自由变形)
2017/03/02 Javascript
关于使用axios的一些心得技巧分享
2017/07/02 Javascript
微信小程序中button组件的边框设置的实例详解
2017/09/27 Javascript
vue写一个组件
2018/04/09 Javascript
JS实现的文件拖拽上传功能示例
2018/05/21 Javascript
解决iview多表头动态更改列元素发生的错误的方法
2018/11/02 Javascript
微信小程序左右滚动公告栏效果代码实例
2019/09/16 Javascript
Vue 实现分页与输入框关键字筛选功能
2020/01/02 Javascript
vue 组件销毁并重置的实现
2020/01/13 Javascript
three.js欧拉角和四元数的使用方法
2020/07/26 Javascript
JavaScript事件委托实现原理及优点进行
2020/08/29 Javascript
vue+Element-ui实现分页效果
2020/11/15 Javascript
零基础写python爬虫之神器正则表达式
2014/11/06 Python
浅谈django model的get和filter方法的区别(必看篇)
2017/05/23 Python
python函数中return后的语句一定不会执行吗?
2017/07/06 Python
python 实现倒排索引的方法
2018/12/25 Python
使用Template格式化Python字符串的方法
2019/01/22 Python
Django 实现前端图片压缩功能的方法
2019/08/07 Python
pytorch制作自己的LMDB数据操作示例
2019/12/18 Python
Mysql数据库反向生成Django里面的models指令方式
2020/05/18 Python
解决python和pycharm安装gmpy2 出现ERROR的问题
2020/08/28 Python
施华洛世奇天猫官方旗舰店:SWAROVSKI
2017/04/17 全球购物
Sql面试题
2013/03/20 面试题
走群众路线学习笔记
2014/11/06 职场文书
中学音乐课教学反思
2016/02/18 职场文书
mysql部分操作
2021/04/05 MySQL