Python何时应该使用Lambda函数


Posted in Python onJuly 02, 2019

Python 中定义函数有两种方法,一种是用常规方式 def 定义,函数要指定名字,第二种是用 lambda 定义,不需要指定名字,称为 Lambda 函数。

Lambda 函数又称匿名函数,匿名函数就是没有名字的函数,函数没有名字也行?当然可以啦。有些函数如果只是临时一用,而且它的业务逻辑也很简单时,就没必要非给它取个名字不可。

好比电影里面的群众演员,往往他们的戏份很少,最多是衬托主演,跑跑龙套,他们需要名字吗?不需要,因为他们仅仅只是临时出镜,下次可能就用不着了,所以犯不着费心思给他们每个人编个号取个名字,毕竟取个优雅的名字是很费劲的事情。

先来看个简单 lambda 函数

>>> lambda x, y : x+y
<function <lambda> at 0x102bc1c80>

x 和 y 是函数的两个参数,冒号后面的表达式是函数的返回值,你能一眼看出这个函数就是是在求两个变量的和,但作为一个函数,没有名字如何使用呢?这里我们暂且给这个匿名函数绑定一个名字,这样使得我们调用匿名函数成为可能

>>> add = lambda x, y : x+y
>>> add
<function <lambda> at 0x102bc2140>
>>> add(1,2)
3

它等同于常规函数

>>> def add2(x, y):
... return x+y
...
>>> add2
<function add2 at 0x102bc1c80>
>>> add2(1,2)
3

如果定义匿名函数,还要给它绑定一个名字的话,有点画蛇添足,通常是直接使用 lambda 函数。那么 lamdba 函数的正确使用场景在哪呢?

1、函数式编程

尽管 Python 算不上是一门纯函数式编程语言,但它本身提供了很多函数式编程的特性,像 map、reduce、filter、sorted 这些函数都支持函数作为参数,lambda 函数就可以应用在函数式编程中。

请看题:一个整数列表,要求按照列表中元素的绝对值大小升序排列,你会怎么做?思考一分钟往下看

>>> list1 = [3,5,-4,-1,0,-2,-6]
>>> sorted(list1, key=lambda x: abs(x))
[0, -1, -2, 3, -4, 5, -6]

排序函数 sorted 支持接收一个函数作为参数,该参数作为 sorted 的排序依据,这里按照列表元素的绝对值进行排序,当然,我也可以用普通函数来实现:

>>> def foo(x):
... return abs(x)
...
>>> sorted(list1, key=foo)
[0, -1, -2, 3, -4, 5, -6]

只不过是这种方式代码看起来不够 Pythonic 而已。

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 函数,你看明白了吗?我是很难一眼看出来

zen of python 中有这样一句话是 Explicit is better than implicit(明了胜于晦涩)。记住,如果用 lambda 函数不能使你的代码变得更清晰时,这时你就要考虑使用常规的方式来定义函数。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
详解Python的单元测试
Apr 28 Python
Python教程之全局变量用法
Jun 27 Python
Python自动化测试Eclipse+Pydev 搭建开发环境
Aug 15 Python
python中reload(module)的用法示例详解
Sep 15 Python
浅谈python装饰器探究与参数的领取
Dec 01 Python
Python设计模式之命令模式简单示例
Jan 10 Python
对Python中type打开文件的方式介绍
Apr 28 Python
python实现生成字符串大小写字母和数字的各种组合
Jan 01 Python
python使用多线程编写tcp客户端程序
Sep 02 Python
python实现数字炸弹游戏程序
Jul 17 Python
linux中nohup和后台运行进程查看及终止
Jun 24 Python
Python list列表删除元素的4种方法
Nov 01 Python
Python Pandas分组聚合的实现方法
Jul 02 #Python
使用Python做垃圾分类的原理及实例代码附源码
Jul 02 #Python
python flask框架实现重定向功能示例
Jul 02 #Python
python实现串口自动触发工作的示例
Jul 02 #Python
python常用函数与用法示例
Jul 02 #Python
pandas DataFrame 行列索引及值的获取的方法
Jul 02 #Python
python for和else语句趣谈
Jul 02 #Python
You might like
PHP6 中可能会出现的新特性预览
2014/04/04 PHP
PhpStorm2020 + phpstudyV8 +XDebug的教程详解
2020/09/17 PHP
javascript编程起步(第六课)
2007/02/27 Javascript
JS正则表达式获取分组内容的方法详解
2013/11/15 Javascript
Javascript玩转继承(三)
2014/05/08 Javascript
js监控IE火狐浏览器关闭、刷新、回退、前进事件
2014/07/23 Javascript
Jquery日期选择datepicker插件用法实例分析
2015/06/08 Javascript
Node.js使用gm拼装sprite图片
2017/07/04 Javascript
Webpack path与publicPath的区别详解
2018/05/03 Javascript
浅谈Node.js 中间件模式
2018/06/12 Javascript
jQuery使用动画队列自定义动画操作示例
2018/06/16 jQuery
layui实现点击按钮给table添加一行
2018/08/10 Javascript
Python def函数的定义、使用及参数传递实现代码
2014/08/10 Python
python定时执行指定函数的方法
2015/05/27 Python
Python numpy实现数组合并实例(vstack,hstack)
2018/01/09 Python
Django开发中的日志输出的方法
2018/07/02 Python
在Django中URL正则表达式匹配的方法
2018/12/20 Python
python消费kafka数据批量插入到es的方法
2018/12/27 Python
Django之使用内置函数和celery发邮件的方法示例
2019/09/16 Python
pytorch 实现tensor与numpy数组转换
2019/12/27 Python
pyinstaller还原python代码过程图解
2020/01/08 Python
Python3 pywin32模块安装的详细步骤
2020/05/26 Python
pytorch 常用函数 max ,eq说明
2020/06/28 Python
Python自动巡检H3C交换机实现过程解析
2020/08/14 Python
K近邻法(KNN)相关知识总结以及如何用python实现
2021/01/28 Python
解决pytorch 数据类型报错的问题
2021/03/03 Python
Dune London官网:英国著名奢华鞋履品牌
2017/11/30 全球购物
财务副总经理工作职责
2013/11/25 职场文书
酒店个人培训自我鉴定
2013/12/11 职场文书
诚信承诺书模板
2014/05/26 职场文书
学习“七一”讲话精神体会
2014/07/08 职场文书
商场圣诞节活动总结
2015/05/06 职场文书
企业安全生产检查制度
2015/08/06 职场文书
心理健康教育主题班会
2015/08/13 职场文书
Python基本数据类型之字符串str
2021/07/21 Python
mysql中int(3)和int(10)的数值范围是否相同
2021/10/16 MySQL