# 匿名函数
# 匿名函数lambda
lambda 是一个表达式(expression) ,并不是一个语句(statement)。
- 表达式是用一系列公式去表达一个东西,比如x + 2、 x**2
- 语句表示一定完成了某些功能,比如赋值语句x = 1完成了赋值,print 语句print(x)完成了打印,条件语句 if x < 0:完成了选择功能等等。
- 因此lambda可以用在一些常规函数def不能用的地方
lambda 的主体是只有一行的简单表达式,并不能扩展成一个多行的代码块
lambda 专注于简单的任务
lambda argument1, argument2,... argumentN : expression
square = lambda x: x**2
square(3)
9
[(lambda x: x*x)(x) for x in range(10)]
# 输出[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
l = [(1, 20), (3, 0), (9, 10), (2, -1)]
l.sort(key=lambda x: x[1]) # 按列表中元组的第二个元素排序
print(l)
# 输出
[(2, -1), (3, 0), (9, 10), (1, 20)]
# 匿名函数的参数绑定
有如下代码,请给出其运行结果:
funcs = [lambda x : x+n for n in range(5)]
for f in funcs:
print(f(0))
注意到,其运行结果并不是我们期望的0,1,2,3,4:
"""
4
4
4
4
4
"""
其原因在于lambda匿名函数的函数体(表达式x+n)中的n是一个自由变量,是在运行时才进行的绑定,因此所有funcs中的func拿到的n都是4。
我们可以做如下修改使其拥有我们想要的行为:
funcs = [lambda x,n=n : x+n for n in range(5)]
for f in funcs:
print(f(0))
"""
0
1
2
3
4
"""