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 列表list使用介绍
Nov 30 Python
python在windows下创建隐藏窗口子进程的方法
Jun 04 Python
flask中使用蓝图将路由分开写在不同文件实例解析
Jan 19 Python
wxpython实现图书管理系统
Mar 12 Python
深入浅析Python获取对象信息的函数type()、isinstance()、dir()
Sep 17 Python
Python叠加两幅栅格图像的实现方法
Jul 05 Python
解决Python中pandas读取*.csv文件出现编码问题
Jul 12 Python
pytorch使用指定GPU训练的实例
Aug 19 Python
Django中的cookie和session
Aug 27 Python
python运用pygame库实现双人弹球小游戏
Nov 25 Python
python多进程下的生产者和消费者模型
May 07 Python
Python实现Canny及Hough算法代码实例解析
Aug 06 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如何解决无法上传大于8M的文件问题
2014/03/10 PHP
PHP生成图像验证码的方法小结(2种方法)
2016/07/18 PHP
探究Laravel使用env函数读取环境变量为null的问题
2016/12/06 PHP
抽出www.templatemonster.com的鼠标悬停加载大图模板的代码
2007/07/11 Javascript
基于jQuery.Validate验证库知识点的详解
2013/04/26 Javascript
javascript中不提供sleep功能如何实现这个功能
2014/05/27 Javascript
如何在MVC应用程序中使用Jquery
2014/11/17 Javascript
轻松创建nodejs服务器(10):处理上传图片
2014/12/18 NodeJs
js使用split函数按照多个字符对字符串进行分割的方法
2015/03/20 Javascript
js实现Select列表内容自动滚动效果代码
2015/08/20 Javascript
jQuery form插件之formDdata参数校验表单及验证后提交
2016/01/23 Javascript
JavaScript实现简易的天数计算器实例【附demo源码下载】
2017/01/18 Javascript
Bootstrap缩略图与警告框学习使用
2017/02/08 Javascript
详解Vue使用 vue-cli 搭建项目
2017/04/20 Javascript
vue的状态管理模式vuex
2017/11/30 Javascript
vue.js父子组件通信动态绑定的实例
2018/09/28 Javascript
js定义类的方法示例【ES5与ES6】
2019/07/30 Javascript
浅谈vue的第一个commit分析
2020/06/08 Javascript
使用python将图片按标签分入不同文件夹的方法
2018/12/08 Python
python 执行文件时额外参数获取的实例
2018/12/18 Python
python3爬虫学习之数据存储txt的案例详解
2019/04/24 Python
详解python中自定义超时异常的几种方法
2019/07/29 Python
浅谈pytorch torch.backends.cudnn设置作用
2020/02/20 Python
CSS3地图动态实例代码(圆圈向外扩散)
2018/06/15 HTML / CSS
通过Canvas及File API缩放并上传图片完整示例
2013/08/08 HTML / CSS
美国南部最大的家族百货公司:Belk
2017/01/30 全球购物
精细化工应届生求职信
2013/11/17 职场文书
养殖人员的创业计划书范文
2013/12/26 职场文书
模具数控专业自荐信
2014/01/27 职场文书
装修施工安全责任书
2014/07/24 职场文书
法院干警四风问题自我剖析材料
2014/09/29 职场文书
婚礼父母答谢词
2015/01/04 职场文书
团日活动总结格式
2015/05/11 职场文书
钓鱼岛事件感想
2015/08/11 职场文书
JVM的类加载器和双亲委派模式你了解吗
2022/03/13 Java/Android
nginx静态资源的服务器配置方法
2022/07/07 Servers