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抓取京东图书评论数据
Aug 31 Python
Python中多线程及程序锁浅析
Jan 21 Python
用Python实现通过哈希算法检测图片重复的教程
Apr 02 Python
python中base64加密解密方法实例分析
May 16 Python
基于Python os模块常用命令介绍
Nov 03 Python
Python3 SSH远程连接服务器的方法示例
Dec 29 Python
python读取各种文件数据方法解析
Dec 29 Python
python 进程的几种创建方式详解
Aug 29 Python
python多线程高级锁condition简单用法示例
Nov 07 Python
使用 Python 合并多个格式一致的 Excel 文件(推荐)
Dec 09 Python
在ipython notebook中使用argparse方式
Apr 20 Python
Python爬虫制作翻译程序的示例代码
Feb 22 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 文件上传代码(限制jpg文件)
2010/01/05 PHP
封装ThinkPHP的一个文件上传方法实例
2014/10/31 PHP
php + WebUploader实现图片批量上传功能
2019/05/06 PHP
Javascript 中的类和闭包
2010/01/08 Javascript
在JavaScript中typeof的用途介绍
2013/04/11 Javascript
JavaScript中的函数重载深入理解
2014/08/04 Javascript
让IE8浏览器支持function.bind()方法
2014/10/16 Javascript
js实现类似MSN提示的页面效果代码分享
2015/08/24 Javascript
JS延时提示框实现方法详解
2015/11/26 Javascript
学习使用jquery iScroll.js移动端滚动条插件
2020/03/24 Javascript
Javascript点击其他任意地方隐藏关闭DIV实例
2016/06/21 Javascript
Vue获取DOM元素样式和样式更改示例
2017/03/07 Javascript
nodejs利用ajax实现网页无刷新上传图片实例代码
2017/06/06 NodeJs
实例讲解javascript实现异步图片上传方法
2017/12/05 Javascript
vue源码解析之事件机制原理
2018/04/21 Javascript
JavaScript查看代码运行效率console.time()与console.timeEnd()用法
2019/01/18 Javascript
微信小程序分享功能onShareAppMessage(options)用法分析
2019/04/24 Javascript
ant design中upload组件上传大文件,显示进度条进度的实例
2020/10/29 Javascript
Python计算程序运行时间的方法
2014/12/13 Python
Python语言描述最大连续子序列和
2017/12/05 Python
Python中跳台阶、变态跳台阶与矩形覆盖问题的解决方法
2018/05/19 Python
对python3 sort sorted 函数的应用详解
2019/06/27 Python
Python中文分词库jieba,pkusegwg性能准确度比较
2020/02/11 Python
python下载卫星云图合成gif的方法示例
2020/02/18 Python
keras 权重保存和权重载入方式
2020/05/21 Python
k-means 聚类算法与Python实现代码
2020/06/01 Python
Python从文件中读取数据的方法步骤
2020/11/18 Python
使用PyCharm官方中文语言包汉化PyCharm
2020/11/18 Python
html5 Canvas画图教程(2)—画直线与设置线条的样式如颜色/端点/交汇点
2013/01/09 HTML / CSS
详解HTML5中的picture元素响应式处理图片
2018/01/03 HTML / CSS
Johnston & Murphy官网: 约翰斯顿·墨菲牛津总统鞋
2018/01/09 全球购物
机械工程师岗位职责
2014/06/16 职场文书
“向国旗敬礼”活动策划方案(4篇)
2014/09/27 职场文书
建议书范文
2015/02/05 职场文书
消费者理赔投诉书
2015/07/02 职场文书
css3 filter属性的使用简介
2021/03/31 HTML / CSS