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对json的相关操作实例详解
Jan 04 Python
修复CentOS7升级Python到3.6版本后yum不能正确使用的解决方法
Jan 26 Python
Python学习小技巧总结
Jun 10 Python
linux查找当前python解释器的位置方法
Feb 20 Python
元组列表字典(莫烦python基础)
Apr 03 Python
一个可以套路别人的python小程序实例代码
Apr 09 Python
python并发编程多进程 模拟抢票实现过程
Aug 20 Python
python实现的登录与提交表单数据功能示例
Sep 25 Python
简单了解python字符串前面加r,u的含义
Dec 26 Python
Python基础详解之邮件处理
Apr 28 Python
一小时学会TensorFlow2之基本操作2实例代码
Sep 04 Python
python中redis包操作数据库的教程
Apr 19 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
经典的PHPer为什么被认为是草根?
2007/04/02 PHP
深入PHP变量存储的详解
2013/06/13 PHP
phpcms中的评论样式修改方法
2016/10/21 PHP
网站被恶意镜像怎么办 php一段代码轻松搞定(全面版)
2018/10/23 PHP
jQuery如何取id有.的值一般的方法是取不到的
2014/04/18 Javascript
基于Jquery实现表单验证
2020/07/20 Javascript
解决jQuery uploadify在非IE核心浏览器下无法上传
2015/08/05 Javascript
js中动态创建json,动态为json添加属性、属性值的实例
2016/12/02 Javascript
Vue.js 2.0学习教程之从基础到组件详解
2017/04/24 Javascript
Vue实现动态显示textarea剩余字数
2017/05/22 Javascript
jQuery实现的上传图片本地预览效果简单示例
2018/03/29 jQuery
js编写简易的计算器
2020/07/29 Javascript
[00:32]2018DOTA2亚洲邀请赛Mineski出场
2018/04/04 DOTA
跟老齐学Python之重回函数
2014/10/10 Python
Python中map和列表推导效率比较实例分析
2015/06/17 Python
python利用requests库进行接口测试的方法详解
2018/07/06 Python
python 内置模块详解
2019/01/01 Python
Python 中list ,set,dict的大规模查找效率对比详解
2019/10/11 Python
Python内存映射文件读写方式
2020/04/24 Python
Python打印特殊符号及对应编码解析
2020/05/07 Python
python产生模拟数据faker库的使用详解
2020/11/04 Python
基于Html5实现的react拖拽排序组件示例
2018/08/13 HTML / CSS
美国老牌主机服务商:iPage
2016/07/22 全球购物
科茨沃尔德家居商店:Scotts of Stow
2018/06/29 全球购物
Easy Spirit官网:美国休闲鞋履中的代表品牌
2019/04/12 全球购物
WSDL的操作类型主要有几种
2013/07/19 面试题
外贸会计专业自荐信
2014/06/22 职场文书
师范毕业生求职信
2014/07/11 职场文书
2015年乡镇流动人口工作总结
2015/05/12 职场文书
学历证明样本
2015/06/16 职场文书
遗嘱格式范本
2015/08/07 职场文书
车位出租协议书范本
2016/03/19 职场文书
python flask框架快速入门
2021/05/14 Python
总结一些Java常用的加密算法
2021/06/11 Java/Android
详解Flutter和Dart取消Future的三种方法
2022/04/07 Java/Android
win10更新失败无限重启解决方法
2022/04/19 数码科技