2022.4.5
lambda函数
lambda匿名函数的格式是 lambda 参数: 表达式。冒号前是参数,可以有多个,用逗号隔开,冒号右边的为表达式。

其实lambda返回值是一个函数的地址,也就是函数对象。

>>> flist = [ lambda x:x*x for x in range(1, 3)]
>#如何修改上述函数使输出为[1,4]呢?
>>> print(flist)
[<function <listcomp>.<lambda> at 0x03ADE2B8>, <function <listcomp>.<lambda> at 0x03ADE300>]
>>> flist[0]
<function <listcomp>.<lambda> at 0x03ADE2B8>
>>> flist[0](2)
4#限定了输入进x的值为2 flist共有两个元素 全是4
glist = [lambda x=x:x*x for x in range(1,3)]
for r in glist:
    print(r())#输出1,4
第二种方法使输出为[1,4]
slist = []
for x in range(1,3):
    def func(x=x):#这句话使得循环中的自由变量x限定为局部变量
        return x*x
    slist.append(func(x))
print(slist)
第三种方法使得输出为[1,4]
zlist = []
def func(i):
    return i*i
for x in range(1,3):
    zlist.append(func(x))
print(zlist)
此时输出为[1,4]

对a = [lambda : x for x in range(3)] 的理解
[lambda :x for x in range(10)] 和Python的循环作用域问题
对上述代码的第一行代码进行相似例子解析

a = [lambda x:x*i for i in range(3)]
print(a)
print(a[0](2))
print(a[1](3))
print(a[2](4))

上述列表循环式相当于以下函数
a = []
for i in range(3):
    def fun(x):
        return x*i
    a.append(fun)
*结果分析 *:在函数调用之前列表推导式循环创建了三个函数,在循环最后一次时i的值为2,
然后再进行调用就会出现所有参数都与2相乘的结果

**意思是 在调用之前列表推导式已经循环建立了三个函数,由于最后一次i的值为2
后续再进行调用时 i的值固定为2 再对x赋值为2
此时for循环仅仅起到限制循环次数的功能(由于range(3)限制循环次数为3),而不再给i赋值
所以最后的输出是a=[4,4,4]
print(a[0](2))#输出 4 这里的a[0](2) 中的
print(a[1](2))# 输出 4
print(a[2](2))#输出 4
print(a[3](2))#错误:调用值超出列表范围 IndexError: list index out of range
print(a[1](3)) #输出6
print(a[2](4)) # 输出8
#单个print输出与一起输出 输出相同

对类似代码进行改进:

lst = [lambda x: x*i for i in range(4)]
res = [m(2) for m in lst]
print(res)
#输出[6, 6, 6, 6]
fun_list = []
for i in range(4):
    def foo(x):
        return x*i
    fun_list.append(foo)
for m in fun_list:
    print(m(2))
#上述代码是相同意思的 输出当然也相同

如何输出[0, 2, 4, 6]
lst = [lambda x, j=i: x*j for i in range(4)]
res = [m(2) for m in lst]
print(res)

fun_list = []
for i in range(4):
    def foo(x, j=i):#每一轮循环均对i进行重新定义
        return x*j
    fun_list.append(foo)
for m in fun_list:
    print(m(2))

lambda函数代码例子

lambda返回值是一个函数的地址,也就是函数对象。
add = lambda x, y: x+y
print(type(add))#输出 <class 'function'>
f = add(3,5)#将lambda函数赋给f 此时f为lambda函数
print(f)#输出 8 可正常输出
print(add(3,5))#输出 8  可正常输出
flist = [lambda x:x*x for x in range(1, 3)]
print(flist)#输出:[<function <listcomp>.<lambda> at 0x0000011F755203A0>, <function <listcomp>.<lambda> at 0x0000011F755204C0>]
#上述代码输出的是该函数在哎内存中的地址 而不是经函数运算后的列表本身
s = flist
print(s)#输出 [<function <listcomp>.<lambda> at 0x00000274F12B03A0>, <function <listcomp>.<lambda> at 0x00000274F12B04C0>]
#此代码输出仍旧是该函数在内存中的地址
print(flist[0])#输出:<function <listcomp>.<lambda> at 0x000002C27FF903A0>
#上述代码输出的同样是列表在内存中的地址
p = flist[0]
print(p)#输出<function <listcomp>.<lambda> at 0x00000249BC6F03A0>
#上述代码输出同样是列表在内存中的地址
q = flist[0](2)
print(q)#输出 4 
#思考上述代码为何可以做出正常输出
#此代码可正确输出列表中的某个值
注意与以下错误代码作出区分
g = flist(2)
print(g)#输出;TypeError: 'list' object is not callable
#此代码不可正常输出 列表不可读取
g = flist[]#输出 SyntaxError: invalid syntax
print(g)
#上述代码不可输出
g = flist[0]#输出 <function <listcomp>.<lambda> at 0x00000299381604C0>
print(g)
#此代码输出仍然是 列表在内存中的地址
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐