【python】lambda
lambda
lambda是匿名函数,也就是没有名字的函数。lambda的语法非常简单:
下面是一个lambda表达式的简单例子,我们可以把lambda表达式赋值给一个变量,然后通过这个变量来使用它:
>>> my_sum = lambda x, y: x+y
>>> my_sum(1, 2)
3
lambda默认参数详解
语法:
lambda [parameter_list, param=val] : expression
参数:
参数 | 描述 |
---|---|
lambda | 定义 lambda 表达式所使用的关键字,所有的 lambda 表达式前面都必须使用该关键字。 |
parameter_list | 参数列表。 |
param | 形式参数。 |
val | 形式参数 param 的默认值。 |
expression | 返回值。 |
1. 例子
sum = lambda x, y=100: x + y
print("lambda res =", sum(512, 512))
print("lambda res =", sum(512))
输出:
lambda res = 1024
lambda res = 612
lambda表达式参数运行时绑定
因为 lambda 表达式的参数是运行时动态绑定的,因此,我们运行程序时,x 的值为 20,因此我们程序最终输出的结果为 40 和 50,现在我们将程序修改为以下代码:
x = 10
add = lambda y : x + y
x = 20
# lambda 表达式参数是运行时绑定的
print("lambda add =", add(20))
print("lambda add =", add(30))
输出:
lambda add = 40
lambda add = 50
x = 10
add = lambda y, x=x : x + y
x = 20
# lambda 表达式参数是运行时绑定的
print("lambda add =", add(20))
print("lambda add =", add(30))
输出:
lambda add = 30
lambda add = 40
我们将参数 x 的值设置为默认参数,再次运行我们的程序发现,此时使用的 x 不再是动态绑定的 20 了,而是使用的 10,因此使用 lambda 表达式的默认参数可以解决参数的运行时绑定问题。
for循环中的lambda
1. 第一种情况:f = [lambda x: x*i for i in range(4)]
对于上面的表达式,调用结果:
>>> f = [lambda x:x*i for i in range(4)]
>>> f[0](1)
3 # 1*3
>>> f[1](1)
3 # 1*3
>>> f[2](1)
3 # 1*3
>>> f[3](1)
3 # 1*3>>> f[0](3)
9 # 3*3
>>> f[1](3)
9 # 3*3
>>> f[2](3)
9 # 3*3
>>> f[3](3)
9 # 3*3
上面的表达式展开如下:
def func():
fs = []
for i in range(4):
def lam(x):
return x*i
fs.append(lam)
return fs
2. 第二种情况:f1 = [lambda i=i: i*i for i in range(4)]
对于上面的表达式,调用结果:
f1 = [lambda i=i: i*i for i in range(4)]
print(f1[0]()) #0
print(f1[1]()) #1
print(f1[2]()) #4
print(f1[3]()) #9
def func():
fs = []
for i in range(4)
def lam(x=i): # 即 i=i
return x*x # 即 i*i
fs.append(lam)
return fs
当调用 func() 时,每循环一次,将 lam 函数的地址存到 fs 中。但是在每次循环中 lam函数都将 i 值绑定到了 x 上,所以直到循环结束,不同地址的 lam 函数的 x 值为都不一样,因此真正调用(例如 f[0]())的时候 x 值都为当时被绑定的值。
但如果给 lam 函数传了参数,例如 f[0](8),那么所有的调用结果都为传参的平方。与上面解释并不冲突,只是将传的参数绑定到了 x 上。
f1 = [lambda i=i: i*i for i in range(4)]
print(f1[0](8)) #64
print(f1[1](8)) #64
print(f1[2](8)) #64
print(f1[3](8)) #64
3. 第三种情况:f2 = [lambda x=i: i*i for i in range(4)]
>>> f2 = [lambda x=i: i*i for i in range(4)]
>>> f2[0]()
9
>>> f2[1]()
9
>>> f2[2]()
9
>>> f2[3]()
9
>>> f2[0](7)
9
>>> f2[1](7)
9
>>> f2[2](7)
9
传不传参数都不影响结果。展开后:
def func():
fs = []
for i in range(4)
def lam(x=i):
return i*i
fs.append(lam)
return fs
虽然 lam 函数将 i 的值绑定到了 x 上,但函数体中并未使用 x,所以直到循环结束,i 的值变为3,才会在调用时使用。其实同第一种情况是一样的。