Python的lambda函数
2022.4.5lambda函数lambda匿名函数的格式是 lambda 参数: 表达式。冒号前是参数,可以有多个,用逗号隔开,冒号右边的为表达式。其实lambda返回值是一个函数的地址,也就是函数对象。>>> flist = [ lambda x:x*x for x in range(1, 3)]>#如何修改上述函数使输出为[1,4]呢?>>> pri
·
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)
#此代码输出仍然是 列表在内存中的地址
更多推荐
已为社区贡献1条内容
所有评论(0)