【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,才会在调用时使用。其实同第一种情况是一样的。

参考资料

1. Python中的lambda、map、filter、reduce、zip用法介绍

2. Python lambda默认参数

3. lambda表达式与for循环的搭配用法

4. python之for循环表达式

posted @ 2023-06-08 21:45  苏格拉底的落泪  阅读(45)  评论(0编辑  收藏  举报