程序员Python培训分享函数式编程匿名函数定义函数的时候不想给函数起名字。这时候可以使用lambda定义一个匿名函数;匿名函数也称为高效函数;因为它们声明的时候可以直接调用(不需要先声明定义再调用)。语法lambda变量名...:语句表达式的特点a.声明时没有函数名(减少程序员对函数名的定义)b.使用lambda关键字举个栗子*创建一个无参匿名函数func1=lambda:1==2res=func1()print(res)#输出结果为False*创建一个传递多个参数的匿名函数func2=lambdax,y,z:x+y+zres=func2(1,2,3)print(res)#输出结果为6*创建一个带if判断的匿名函数func3=lambdax,y:xifx>;yelseyres=func3(2,6)print(res)#输出结果大于6定义不规范,为了更好理解,一步步定义;详情请参考下面的错误描述;注1.逗号用于分隔变量名;2.调用时可以直接把lambda整体括起来,后面加括号传入对应的实参(如果没有实参,需要加括号表示执行匿名函数,否则对象将返回匿名函数)3.匿名函数之间可以相互调用,嵌套函数一行一行使用,无需定义函数名,节省了变量定义在内存中的空间。如果想让程序更简洁,匿名函数的规则一般只有一行表达式。必须有返回值,无返回,无参数,一个或多个。参数匿名函数大量实例A.使用max函数求字典最大值dict1={'age1':12,'age2':13,'age3':14}res=max(dict1,key=lambdax:dict1[x])print(res)B.使用filter过滤字符串是否以某个字母开头Names=['Anne','Amy','Bob','David','Carrie','Barbara','Zach']B_Name=filter(lambdax:x.startswith('B'),Names)B_Name#输出结果为:['Bob','Barbara']C.lambdaandmap,filter组合使用squares=map(lambdax:x**2,range(10))filters=filter(lambdax:x>;5andx<;50,squares)print(filters)#输出结果为:[9,16,25,36,49]D.lambda和sorted结合使用death=[('James',32),('Alies',20),('Wendy',25)]sorted(death,key=lambdaage:age[1])#按照第二个元素排序,索引为1#输出结果为:[('Alies',20),('Wendy',25),('James',32)]E.lambdaandreducecombinedlist1=[1,2,3,4]sum=reduce(lambdax,y:x+y,list1)print(sum)#输出结果是:10F。求两个列表元素的和a=[1,2,3,4]b=[5,6,7,8]map(lambdax,y:x+y,a,b)#Theoutputresultis:[6,8,10,12]误区一、命名匿名函数PEP8建议我们不要写这样的代码func1=lambda:1==2匿名函数可以直接作为变量传递,比如传递给函数的参数不要求它有名字。需要注意的是,其实上面的操作并没有真正起到函数命名的作用。不必要的匿名函数有时,我们不需要使用匿名函数,但我们无意中使用了它们。一般有两种情况。一种是使用无意义的调用,比如下面的代码res=sorted(list1,key=lambdax:len(x))按照元素的长度对列表进行排序其实我们可以直接使用res=sorted(list1,key=len)上面一提到大家马上就明白了,但是平时我们或多或少都犯过类似的错误。另一方面,标准库中已经实现了很多功能,我们不知道,所以做多余的事情。降低可读性的匿名函数按元素长度和字典序排序列表list1=["abc","bcde","mhjk"]res=sorted(list1,key=lambdax:(len(x),x.upper()))上面的代码可以实现功能,但是我觉得下面的可读性更好res=sorted(list1,key=get_len_upper)我们可以通过函数名大致知道函数的作用。如果是匿名函数,就要看对应的逻辑了。可能根本不需要传递函数来对列表求和,我们可能会看到这样的代码fromfunctoolsimportreducedata=[1,2,3,4,5]res=reduce(lambdax,y:x+y,data)print(res)其实直接使用sum函数就可以了data=[1,2,3,4,5]print(sum(data))对于一些特定的需求,Python可能已经有了现成的方案。我们必须意识到这一点,并尝试尽可能简单地解决问题。您不能使用地图/过滤器。Python中的map和filter一般都是和匿名函数结合使用。前者是在迭代过程中对元素进行处理,后者是过滤掉一些元素。在许多情况下,我们可以改用列表推导式或生成器表达式。使用生成器表达式代替mapdata=[1,2,3,4,5]res=map(lambdax:x**2,data)#equivalenttores2=(x**2forxindata)生成器表达式而不是filterdata=[1,2,3,4,5]res=filter(lambdax:x>;3,data)#equivalenttores2=(xforxindataifx>;3)可以很清楚看到使用生成器表达式的代码更具可读性。免责声明:内容及图片来源于网络,版权归原作者所有。如有侵犯您的原创版权,请告知,我们将第一时间删除相关内容。
