lambda expression
lambda 函数的语法只包含一个语句,表现形式如下:
lambda [arg1 [,arg2,.....argn]] : expression
expression 是一个参数表达式,表达式中出现的参数需要在 [arg......]
中有定义,并且表达式只能是单行的,只能有一个表达式。
lambda的特性:
1)lambda 函数是匿名的:lambda函数没有名字。
2)lambda 函数有输入和输出:输入是传入到参数列表argument_list的值,输出是根据表达式expression计算得到的值。
3)lambda 函数拥有自己的命名空间:不能访问自己参数列表之外或全局命名空间里的参数,只能完成非常简单的功能。
下面来看个例子:
myAdd = lambda x, y: x + y print(myAdd(10, 20))
lambda 表达式中的 x 是一个自由变量,在运行时绑定值,而不是定义时就绑定,这跟函数的默认值参数定义是不同的。如:
x = 10 a = lambda y: x + y x = 20 b = lambda y: x + y print(a(10)) # 30 print(b(10)) # 30
如果你想让某个匿名函数在定义时就捕获到值,可以将那个参数值定义成默认参数即可,就像下面这样:
x = 10 a = lambda y, x=x: x + y x = 20 b = lambda y, x=x: x + y print(a(10)) # 20 print(b(10)) # 30
再举一个例子,通过在一个循环或列表推导中创建一个 lambda 表达式列表,并期望函数能在定义时就记住每次的迭代值。例如:
funcs = [lambda x: x + n for n in range(5)] # 这句是定义了一个表达式列表 for f in funcs: print(f(0)) # 4 4 4 4 4 """ 但是实际效果是运行是 n 的值为迭代的最后一个值。现在我们用另一种方式修改一下: """ _funcs = [lambda x, n=n: x + n for n in range(5)] # 这句是定义了一个表达式列表 for f in _funcs: print(f(0)) # 0 1 2 3 4