详解Python匿名函数(lambda函数)
Python  /  管理员 发布于 7年前   164
匿名函数lambda
Python使用lambda关键字创造匿名函数。所谓匿名,意即不再使用def语句这样标准的形式定义一个函数。这种语句的目的是由于性能的原因,在调用时绕过函数的栈分配。其语法是:
lambda [arg1[, arg2, ... argN]]: expression
其中,参数是可选的,如果使用参数的话,参数通常也会在表达式之中出现。
下面举例来说明lambda语句的使用方法(无参数)。
# 使用def定义函数的方法def true(): return True#等价的lambda表达式>>> lambda :True<function <lambda> at 0x0000000001E42518># 保留lambda对象到变量中,以便随时调用>>> true = lambda :True>>> true()True
下面再举一个带参数的例子。
# 使用def定义的函数def add( x, y ): return x + y# 使用lambda的表达式lambda x, y: x + y# lambda也允许有默认值和使用变长参数lambda x, y = 2: x + ylambda *z: z# 调用lambda函数>>> a = lambda x, y: x + y>>> a( 1, 3 )4>>> b = lambda x, y = 2: x + y>>> b( 1 )3>>> b( 1, 3 )4>>> c = lambda *z: z>>> c( 10, 'test')(10, 'test')
但由于lambda表达式特殊的设计,在特定的场景中也带来了一些不同的体验。
lambda是一个表达式,不是一个语句 这就使它能够出现在一些def不能出现的地方,比如,列表常量中。
lambda是单个的表达式,不是一个代码块 lambda的设计是为了满足简单函数的场景,仅能封装有限的逻辑,有复杂逻辑的情况有def来处理,所以lambda的功能要比def小的多。
另外,lambda表达式是可以嵌套的
>>> action = (lambda x : (lambda y : x + y))>>> a = action(10)>>> a(5)15
这就是一个用lambda实现的闭包,与普通闭包一样,内嵌lambda表达式可以获得上层lambda函数的变量。
匿名函数的使用
匿名函数通常被用作高阶函数(higher-order function,参数为函数的函数)的参数。比如,几个内置函数:filter(),map(),reduce()。下面我们分别看看这几个函数的用法及达到相同效果的python另一种特征的用法
filter函数
>>> list = [1, 2, 3]>>> result = filter(lambda x: x%2==0, list)>>> result[2]>>> result = [x for x in list if x%2==0]>>> result[2]
map函数
>>> result = map(lambda x: x*2, list)>>> result[2, 4, 6]>>> result = [x*2 for x in list]>>> result[2, 4, 6]
reduce函数
>>> result = reduce(lambda x, y: x+y,list)>>> result6>>> result = sum(list)>>> result6
除reduce函数的替代用法比较特殊外,map和filter函数都可以使用列表推导式(list comprehension)代替。据说,当年lambda是一个Lisp程序员给python加的,而Guido是强烈反对的,他中意的是列表推导式。
跳转表(jump table)
lambda的另一种用法是用来编写跳转表,也就是行为列表或字典,能按需执行特定的动作。
>>> key = "get">>> {"abc":(lambda : 2 + 2),"bcd" : (lambda : 3 + 3), "get" : (lambda : 4 + 4)}[key]()8
这样在字典中,每个lambda都留下了一个后续可以调用的函数,通过索引可以取出来,并调用。这就使字段可以成为更加通用的多路分支工具。
以上所述是小编给大家介绍的Python匿名函数(lambda函数)详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对站的支持!
122 在
学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
Copyright·© 2019 侯体宗版权所有·
粤ICP备20027696号