今天我们将学习Python中的lambda函数,并探讨使用它们的优点和局限性什么是Python中的Lambda函数Lambda函数是一个匿名函数(即没有名称定义)可以接受任意数量的参数,但与普通函数不同,它只计算并返回一个表达式Python中的lambda函数使用以下语法表示:lambdaparameter:expressionlambda函数由三个元素组成:关键字lambda:Sameasin普通函数def相似参数:支持传递位置参数和关键字参数,与普通函数同文:需要注意的是,在处理固定参数的表达式时,与普通函数不同。不需要使用圆括号将lambda函数的参数括起来。如果lambda函数有两个或多个参数,我们用逗号列出它们一般来说,我们将lambda函数作为参数传递给高阶函数(接受其他函数作为参数的函数),例如Python内置函数,如filter()、map()或reduce()。Python中的Lambda函数如何工作?让我们看一个lambda函数的简单示例:lambdax:x+1Output:(x)>上面的lambda函数接受一个参数,将其递增1,并返回结果如下使用def和带有return关键字的普通函数的更简单版本:defincrement_by_one(x):returnx+1到目前为止,我们的lambda函数lambdax:x+1只是创建了一个函数对象并且不返回任何东西,这是因为我们没有为其参数x提供任何值(参数)。我们先赋值一个变量,传递给lambda函数,看看这次我们得到了什么:a=2print(lambdax:a+1)Output:at0x00000250CB0A5820>我们的lambda函数看起来不像我们按预期返回了3,但返回的是函数对象本身及其内存位置,我们可以看出这不是调用lambda函数的正确方法。要将参数传递给lambda函数,执行它并返回结果,我们应该使用以下语法:(lambdax:x+1)(2)Output:3虽然我们的lambda函数的参数没有括在括号中,当我们调用它时,我们将lambda函数的整个构造和我们传递给它的参数放在圆括号中上面代码中需要注意的另一件事是,使用lambda函数,我们可以在创建并接收函数后立即执行该函数结果。这称为立即调用函数执行(或IIFE)我们可以创建一个具有多个参数的lambda函数,在这种情况下,我们在函数定义中用逗号分隔参数。当我们执行这样一个lambda函数时,我们按照相同的顺序列出相应的参数,并用逗号分隔:(lambdax,y,z:x+y+z)(3,8,1)Output:12也可以使用lambda函数执行条件操作。这是一个简单的if-else函数的lambda模拟:print((lambdax:xif(x>10)else10)(5))print((lambdax:xif(x>10)else10)(12))输出:1012如果有多个条件(if-elif-...-else),我们必须将它们嵌套:(lambdax:x*10ifx>10else(x*5ifx<5elsex))(11)输出:110但是上面的写法让代码难以阅读在这种情况下,设置了if-elif-...-else条件的普通函数将是比lambda函数更好的选择。其实我们可以把上面例子中的lambda函数写成下面这样:defcheck_conditions(x):ifx>10:returnx*10elifx<5:returnx*5else:Outreturnxcheck_conditions(11)虽然上面的函数比相应的lambda函数增加了更多的行,但它更容易阅读我们可以将lambda函数分配给一个变量,然后像普通函数一样调用该变量:increment=lambdax:x+1increment(2)输出:3但是根据Python代码的PEP8样式规则,这是一种不好的做法使用赋值语句消除了lambda表达式可以提供的唯一好处超过显式def语句(即,它可以嵌入更大的表达式中)所以如果我们确实需要存储一个函数以供进一步使用,我们最好定义一个等效的普通函数,而不是使用filter()将lambda函数分配给变量Lambda函数LambdaPython中的filter()函数有两个参数:函数定义过滤器criteria函数在运行函数时运行的可迭代对象,我们得到一个过滤器对象:lst=[33,3,22,2,11,1]filter(lambdax:x>10,lst)Output:为了从过滤器对象中得到一个新的迭代器,并且原迭代器中的所有项都满足预定义的条件,我们需要将过滤器对象传递给Python标准库的相应函数:list()、tuple()、set()、frozenset()或sorted()(返回一个排序列表)让我们过滤一个数字列表以仅选择大于10的值并返回一个按升序排序的列表:lst=[33,3,22,2,11,1]sorted(filter(lambdax:x>10,lst))Output:[11,22,33]我们没有必要创建一个新的与原始对象相同类型的可迭代对象,而且我们可以将这个操作的结果存储在一个变量中在卷中:lst=[33,3,22,2,11,1]tpl=tuple(filter(lambdax:x>10,lst))tplOutput:(33,22,11)withmap()functionLambdaWe使用Python中的map()函数对可迭代对象的每一项执行特定操作。它的语法与filter()相同:一个要执行的函数和一个应用该函数的可迭代对象。map()函数返回一个map对象,我们可以通过将对象传递给相应的Python函数来获得新的迭代:list()、tuple()、set()、frozenset()或sorted()和filter()函数,我们可以从map对象中提取出一个与原始类型不同的可迭代对象,赋值给一个变量。下面是一个使用map()函数将列表中的每个项目乘以10并将映射值作为分配给变量tpl的元组输出的示例:lst=[1,2,3,4,5]print(map(lambdax:x*10,lst))tpl=tuple(map(lambdax:x*10,lst))tplOutput:(10,20,30,40,50)map()和filter()函数之间的一个重要区别是第一个函数总是返回一个与原始函数长度相同的可迭代对象。因此,由于pandasSeries对象也是可迭代的,我们可以在DataFrame列上应用map()函数来创建一个新列:importpandasaspddf=pd.DataFrame({'col1':[1,2,3,4,5],'col2':[0,0,0,0,0]})print(df)df['col3']=df['col1'].map(lambdax:x*10)dfOutput:col1col2010120230340450col1col2col30101012020230303404045050当然,上面的情况要得到相同的结果,也可以使用apply()函数:df['col3']=df['col1'].apply(lambdax:x*10)dfOutput:col1col2col30101012020230303404045050通过创建一个新的DataFrame列柱子。对于以下代码,我们可以交替使用map()或apply()函数:df['col4']=df['col3'].map(lambdax:30ifx<30elsex)dfOutput:col1col2col3col401010301202030230303034040404505050Lambdareduce()函数与reduce()函数与functoolsPython模块相关,其它是这样工作的:对iterable的前两项进行操作并保存结果以这种方式对保存的结果和iterable的下一项操作值对,直到iterable的所有项都与此函数一起使用第一个两个函数具有相同的两个参数:一个函数和一个可迭代对象但与前面的函数不同,这个函数不需要传递给任何其他函数,直接返回结果标量值:fromfunctoolsimportreducelst=[1,2,3,4,5]reduce(lambdax,y:x+y,lst)Output:15上面的代码显示了当我们使用reduce()函数计算列表的总和时我们可以做什么。请注意,reduce()函数始终需要一个带有两个参数的lambda函数,我们必须首先从functoolsPython模块中导入它once可以在定义后立即调用它的语法比相应的普通语法更紧凑它可以作为参数传递给高阶函数,如filter()、map()和reduce()缺点它不能执行多个表达式它可以很容易变得麻烦且可读性差,例如,当它包含一个if-elif-...-else循环时,它不能包含任何变量赋值(例如,lambdax:x=0将抛出语法错误)并且我们无法提供文档字符串对于lambda函数使用lambda函数的许多方面:lambda函数与普通Python函数有何不同Python中lambda函数的语法和剖析何时使用lambda函数lambda函数的工作原理lambda函数是如何被调用的调用函数执行(IIFE)的定义如何使用lambda函数执行条件操作,如何嵌套多个条件,以及为什么我们应该避免它为什么我们应该避免将lambda函数分配给变量如何使用带有filter()函数的lambda函数如何将lambda函数与map()函数一起使用lambda函数和reduce()函数在纯Python上使用lambda函数的优点缺点以上就是本次分享的全部内容。觉得文章还不错的话,请关注公众号:Python编程学习圈,每日干货分享,发送“J”还能收到海量学习资料,涵盖Python电子书,教程、数据库编程、Django、爬虫、云计算等或者去编程学习网了解更多编程技术。