海口网站建设维护,策划方案,资讯门户 wordpress,紫色网站匿名函数lambda Python使用lambda关键字创造匿名函数。所谓匿名#xff0c;意即不再使用def语句这样标准的形式定义一个函数。这种语句的目的是由于性能的原因#xff0c;在调用时绕过函数的栈分配。其语法是#xff1a; lambda [arg1[, arg2, ... argN]]: expression 其中意即不再使用def语句这样标准的形式定义一个函数。这种语句的目的是由于性能的原因在调用时绕过函数的栈分配。其语法是 lambda [arg1[, arg2, ... argN]]: expression 其中参数是可选的如果使用参数的话参数通常也会在表达式之中出现。 无参数 # 使用def定义函数的方法
def true():return True#等价的lambda表达式lambda :True
function lambda at 0x0000000001E42518# 保留lambda对象到变量中以便随时调用true lambda :Truetrue()
True一个参数 # 使用def定义的函数
def add( x, y ):return x y# 使用lambda的表达式
lambda x, y: x y# lambda也允许有默认值和使用变长参数
lambda x, y 2: x y
lambda *z: z# 调用lambda函数a lambda x, y: x ya( 1, 3 )
4b lambda x, y 2: x yb( 1 )
3b( 1, 3 )
4c lambda *z: zc( 10, test)
(10, test)lambda是单个的表达式不是一个代码块 lambda的设计是为了满足简单函数的场景仅能封装有限的逻辑有复杂逻辑的情况有def来处理所以lambda的功能要比def小的多 lambda表达式是可以嵌套的闭包 action (lambda x : (lambda y : x y))a action(10)a(5)
15匿名函数的使用 匿名函数通常被用作高阶函数(higher-order function,参数为函数的函数)的参数。比如几个内置函数filter(),map(),reduce()。下面我们分别看看这几个函数的用法及达到相同效果的python另一种特征的用法 filter函数 list [1, 2, 3]result filter(lambda x: x%20, list)result
[2]result [x for x in list if x%20]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: xy,list)result
6result sum(list)result
6跳转表(jump table) lambda的另一种用法是用来编写跳转表,也就是行为列表或字典能按需执行特定的动作。 key get{abc:(lambda : 2 2),bcd : (lambda : 3 3), get : (lambda : 4 4)}[key]()
8注意问题 x 10
a lambda y: y xx 20
b lambda y: y x#猜想一下a(10) 和 b(10)返回的结果是什么如果你认为结果是20 和 30那么就错了print(a(10)) ##输出30print(b(10)) ##输出30lambda表达式中的x是一个自由变量 是在运行时绑定值而不是定义时就绑定即lambda表达式中的x是执行时的值这与函数的默认值参数定义是不同的。例如 x 15
print(a(10)) ##输出25x 3
print(a(10)) ##输出13如果想让匿名函数在定义时就捕获到参数值可以将那个参数值定义成默认参数即可例如 m 4
c lambda n, m m: m nprint(c(10)) ##输出14m 2
print(c(10)) ##输出14有时候可能会不恰当的使用lambda表达式。 比如通过在一个循环或列表推导中创建一个lambda表达式列表并期望函数能在定义时就记住每次的迭代值。例如 funcs [lambda x: xn for n in range(3)]
for f in funcs:print(f(0))# 2
# 2
# 2但是实际效果是n的值为迭代的最后一个值。将参数值设置为默认参数才能得到想要的效果修改代码如下 funcs [lambda x, n n: xn for n in range(3)]
for f in funcs:print(f(0))# 0
# 1
# 2转载于:https://www.cnblogs.com/a-ant/p/11030145.html