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 相关文章推荐
Python3基础之基本运算符概述
Aug 13 Python
用Python代码来绘制彭罗斯点阵的教程
Apr 03 Python
基于python select.select模块通信的实例讲解
Sep 21 Python
tensorflow 输出权重到csv或txt的实例
Jun 14 Python
Django 日志配置按日期滚动的方法
Jan 31 Python
django的分页器Paginator 从django中导入类
Jul 25 Python
解决django同步数据库的时候app models表没有成功创建的问题
Aug 09 Python
python+OpenCV实现车牌号码识别
Nov 08 Python
基于Django实现日志记录报错信息
Dec 17 Python
Python脚本打包成可执行文件过程解析
Oct 20 Python
python 模块重载的五种方法
Apr 24 Python
Python经常使用的一些内置函数
Apr 11 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中数据的批量导入(csv文件)
2006/10/09 PHP
浅谈php优化需要注意的地方
2014/11/27 PHP
Laravel框架中自定义模板指令总结
2017/12/17 PHP
基于Laravel 多个中间件的执行顺序详解
2019/10/21 PHP
PDO实现学生管理系统
2020/03/21 PHP
完美解决JS中汉字显示乱码问题(已解决)
2006/12/27 Javascript
jquery ajax方式直接提交整个表单核心代码
2013/08/15 Javascript
Nodejs学习笔记之Stream模块
2015/01/13 NodeJs
jquery使用remove()方法删除指定class子元素
2015/03/26 Javascript
基于JavaScript实现鼠标箭头移动图片跟着移动
2016/08/30 Javascript
bootstrap table表格插件使用详解
2017/05/08 Javascript
Angular2 父子组件数据通信实例
2017/06/22 Javascript
修改UA在PC中访问只能在微信中打开的链接方法
2017/11/27 Javascript
如何重置vue打印变量的显示方式
2017/12/06 Javascript
vue项目打包部署_nginx代理访问方法详解
2018/09/20 Javascript
通过JavaScript下载文件到本地的方法(单文件)
2019/03/17 Javascript
vue-cli3跨域配置的简单方法
2019/09/06 Javascript
微信小程序自定义纯净模态框(弹出框)的实例代码
2020/03/09 Javascript
python友情链接检查方法
2015/07/08 Python
python递归函数绘制分形树的方法
2018/06/22 Python
python tkinter界面居中显示的方法
2018/10/11 Python
Python中正反斜杠(‘/’和‘\’)的意义与用法
2019/08/12 Python
Python学习笔记之集合的概念和简单使用示例
2019/08/22 Python
Python3实现配置文件差异对比脚本
2019/11/18 Python
女士时装鞋:Chinese Laundry
2018/08/29 全球购物
加拿大国民体育购物网站:National Sports
2018/11/04 全球购物
澳大利亚最好的电动自行车:Leon Cycle
2020/12/19 全球购物
北大青鸟学生求职信
2013/09/24 职场文书
大一新生学期自我评价
2014/04/09 职场文书
社区班子对照检查材料
2014/08/27 职场文书
2014年中秋节活动总结
2014/08/29 职场文书
师德师风自我评价范文
2014/09/11 职场文书
python 统计代码耗时的几种方法分享
2021/04/02 Python
Pytorch中TensorBoard及torchsummary的使用详解
2021/05/12 Python
动画电影《龙珠超 超级英雄》延期上映
2022/03/20 日漫
Mysql数据库事务的脏读幻读及不可重复读详解
2022/05/30 MySQL