Python何时应该使用Lambda函数
Python中定义函数有两种方法,一种是用常规方式def定义,函数要指定名字,第二种是用lambda定义,不需要指定名字,称为Lambda函数。
Lambda函数又称匿名函数,匿名函数就是没有名字的函数,函数没有名字也行?当然可以啦。有些函数如果只是临时一用,而且它的业务逻辑也很简单时,就没必要非给它取个名字不可。
好比电影里面的群众演员,往往他们的戏份很少,最多是衬托主演,跑跑龙套,他们需要名字吗?不需要,因为他们仅仅只是临时出镜,下次可能就用不着了,所以犯不着费心思给他们每个人编个号取个名字,毕竟取个优雅的名字是很费劲的事情。
先来看个简单lambda函数
>>>lambdax,y:x+yat0x102bc1c80>
x和y是函数的两个参数,冒号后面的表达式是函数的返回值,你能一眼看出这个函数就是是在求两个变量的和,但作为一个函数,没有名字如何使用呢?这里我们暂且给这个匿名函数绑定一个名字,这样使得我们调用匿名函数成为可能
>>>add=lambdax,y:x+y >>>addat0x102bc2140> >>>add(1,2) 3
它等同于常规函数
>>>defadd2(x,y): ...returnx+y ... >>>add2>>>add2(1,2) 3
如果定义匿名函数,还要给它绑定一个名字的话,有点画蛇添足,通常是直接使用lambda函数。那么lamdba函数的正确使用场景在哪呢?
1、函数式编程
尽管Python算不上是一门纯函数式编程语言,但它本身提供了很多函数式编程的特性,像map、reduce、filter、sorted这些函数都支持函数作为参数,lambda函数就可以应用在函数式编程中。
请看题:一个整数列表,要求按照列表中元素的绝对值大小升序排列,你会怎么做?思考一分钟往下看
>>>list1=[3,5,-4,-1,0,-2,-6] >>>sorted(list1,key=lambdax:abs(x)) [0,-1,-2,3,-4,5,-6]
排序函数sorted支持接收一个函数作为参数,该参数作为sorted的排序依据,这里按照列表元素的绝对值进行排序,当然,我也可以用普通函数来实现:
>>>deffoo(x): ...returnabs(x) ... >>>sorted(list1,key=foo) [0,-1,-2,3,-4,5,-6]
只不过是这种方式代码看起来不够Pythonic而已。
2、闭包
闭包本身是一个晦涩难懂的概念,它可以专门单独用一篇文章来介绍,不过在这里我们可以简单粗暴地理解为闭包就是一个定义在函数内部的函数,闭包使得变量即使脱离了该函数的作用域范围也依然能被访问到。
来看一个用lambda函数作为闭包的例子。
>>>defmy_add(n): ...returnlambdax:x+n ... >>>add_3=my_add(3) >>>add_3(7) 10
这里的lambda函数就是一个闭包,在全局作用域范围中,add_3(7)可以正常执行且返回值为10,之所以返回10是因为在my_add局部作用域中,变量n的值在闭包的作用使得它在全局作用域也可以被访问到。
换成常规函数也可以实现闭包,只不过是这种方式稍显啰嗦。
>>>defmy_add(n): ...defwrapper(x): ...returnx+n ...returnwrapper ... >>>add_5=my_add(5) >>>add_5(2) 7
那么是不是任何情况lambda函数都要比常规函数更清晰明了呢?看这个例子:
f=lambdax:[[yforj,yinenumerate(set(x))if(i>>j)&1]foriinrange(2**len(set(x)))]
这是一个返回某个集合的所有子集的lambda函数,你看明白了吗?我是很难一眼看出来
zenofpython中有这样一句话是Explicitisbetterthanimplicit(明了胜于晦涩)。记住,如果用lambda函数不能使你的代码变得更清晰时,这时你就要考虑使用常规的方式来定义函数。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。