介绍
lambda在完成简单函数的定义时很有作用,如编写微型函数来对各种表达式简单求值,或者需要用户提供回调函数的时候。但是lambda的局限性也是有的,如lambda只能指定一条单独的表达式,而且这个表达式的结果作为lambda的返回值。所以就有无法执行多行语句,条件分支,迭代和异常处理的缺点。当然我们会在其优势时使用,缺点时使用Python逻辑就好,不是么。
规则
书写
func = lambda x, y : x + y
# func:lambda返回的函数引用
# x, y 形参
# x + y 函数体
result = func(3, 5) # 调用,result = 8
形参规则
1、lambda表达式的形参是一个自由变量,意思是只在执行时绑定形参
2、执行时绑定,相同lambda创建的同时绑定
3、可以实现定义时绑定形参,不过形参定义为 x=x, y=y的形式,而且被绑定的形参不要再在调用时传参
# 例子
x = y = 10
func1 = lambda x, y : x + y
x = y = 15
func2 = lambda x, y : x + y
# 解析:func1和func2使用相同的lambda表达式创建,形参规则 1,2
>> func1(x, y) # 结果是 30
>> func2(x, y) # 结果是 30
x = y = 20
>> func1(x, y) # 结果是 40
# 例子
x = y = 10
func1 = lambda x, y=y : x + y
x = y = 15
func2 = lambda x, y=y : x + y
# 解析:func1和func2使用相同的lambda表达式创建,形参规则 2,3
>> func1(x) # 结果是 25
>> func2(x) # 结果是 30
# tips! x在执行时绑定最新的x值,y在定义是绑定y的值,注意调用时不再传递y的值
重要例子
funcs1 = [lambda x: x+n for n in range(5)]
funcs2 = [lambda x, n=n: x+n for n in range(5)]
for index in range(5):
print('funcs1[%s](%s):' %(index, 0),funcs1[index](0))
print('funcs2[%s](%s):' %(index, 0),funcs2[index](0))
print('*************')
# tips! funcs通过列表推导式创建列表,列表内容是lambda返回的函数引用
# 引用的每个参数符合 参数规则1,2,3
# funcs1和funcs2的区别是执行时赋值和声明时赋值
# 结果
funcs1[0](0): 4
funcs2[0](0): 0
*************
funcs1[1](0): 4
funcs2[1](0): 1
*************
funcs1[2](0): 4
funcs2[2](0): 2
*************
funcs1[3](0): 4
funcs2[3](0): 3
*************
funcs1[4](0): 4
funcs2[4](0): 4
*************
# 解析:funcs1中n为调用时传参,调用时n衡为4.funcs2中n为声明时传参,是变化的。