当前位置: 首页 > 科技观察

什么时候使用Lambda函数?

时间:2023-03-17 23:04:43 科技观察

在Python中有两种定义函数的方法。一种是按照常规方式定义,函数需要指定一个名字。第二种是使用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函数某个集合的所有子集,你明白吗?我很难一眼看出python之禅中有这么一句话,Explicitisbetterthanimplicit(clearwinsinobscurity)。请记住,如果使用lambda函数不能使您的代码更清晰,那么您应该考虑使用正常的函数定义方式。