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

  

posted @ 2020-06-25 09:58  _yanghh  阅读(165)  评论(0编辑  收藏  举报