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服务器拒绝服务攻击代码
Jan 16 Python
Python读写文件方法总结
Jun 09 Python
简单讲解Python编程中namedtuple类的用法
Jun 21 Python
Python实现的插入排序算法原理与用法实例分析
Nov 22 Python
Python Pandas实现数据分组求平均值并填充nan的示例
Jul 04 Python
解决python tkinter界面卡死的问题
Jul 17 Python
Python切图九宫格的实现方法
Oct 10 Python
浅析python函数式编程
Sep 26 Python
Python结合百度语音识别实现实时翻译软件的实现
Jan 18 Python
详解修改Anaconda中的Jupyter Notebook默认工作路径的三种方式
Jan 24 Python
2021年最新用于图像处理的Python库总结
Jun 15 Python
Python实现智慧校园自动评教全新版
Jun 18 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/10/09 PHP
Yii净化器CHtmlPurifier用法示例(过滤不良代码)
2016/07/15 PHP
PHP添加PNG图片背景透明水印操作类定义与用法示例
2019/03/12 PHP
基于JQuery的日期联动实现代码
2011/02/24 Javascript
js 实现在离开页面时提醒未保存的信息(减少用户重复操作)
2013/01/16 Javascript
jquery动态添加option示例
2013/12/30 Javascript
多种方法实现360浏览器下禁止自动填写用户名密码
2014/06/16 Javascript
javascript实现动态表头及表列的展现方法
2015/07/14 Javascript
AngularJS使用自定义指令替代ng-repeat的方法
2016/09/17 Javascript
使用bootstrap实现多窗口和拖动效果
2016/09/22 Javascript
浅析Ajax语法
2016/12/05 Javascript
jQuery使用JSONP实现跨域获取数据的三种方法详解
2017/05/04 jQuery
Vue在页面数据渲染完成之后的调用方法
2018/09/11 Javascript
vue引入axios同源跨域问题
2018/09/27 Javascript
使用vue2.6实现抖音【时间轮盘】屏保效果附源码
2019/04/24 Javascript
使用layui的router来进行传参的实现方法
2019/09/06 Javascript
Vue.extend 编程式插入组件的实现
2019/11/18 Javascript
javascript设计模式 ? 桥接模式原理与应用实例分析
2020/04/13 Javascript
JavaScript组合模式---引入案例分析
2020/05/23 Javascript
vue v-for 点击当前行,获取当前行数据及event当前事件对象的操作
2020/09/10 Javascript
vue 如何使用递归组件
2020/10/23 Javascript
Python实现快速排序算法及去重的快速排序的简单示例
2016/06/26 Python
python爬虫使用cookie登录详解
2017/12/27 Python
解决pip install xxx报错SyntaxError: invalid syntax的问题
2018/11/30 Python
pyqt5对用qt designer设计的窗体实现弹出子窗口的示例
2019/06/19 Python
Django如何使用第三方服务发送电子邮件
2019/08/14 Python
pytorch 使用加载训练好的模型做inference
2020/02/20 Python
Python自动化操作实现图例绘制
2020/07/09 Python
Python中的None与 NULL(即空字符)的区别详解
2020/09/24 Python
python爬虫中抓取指数的实例讲解
2020/12/01 Python
《狐假虎威》教学反思
2014/02/07 职场文书
医学院毕业生自荐信范文
2014/03/06 职场文书
先进个人自荐书
2015/03/06 职场文书
MySQL配置主从服务器(一主多从)
2021/08/07 MySQL
python中if和elif的区别介绍
2021/11/07 Python