【自用】关于lamdba函数

1!!!!!!
lambdalist 结合使用
>>>li = [lambda :x for x in range(10)]
>>>print(li[0])
<function <listcomp>.<lambda> at 0x0000017B0C5B99D8>
>>>print(li[0]())
92!!!!!!
>>>li = [lambda x:x for x in range(10)]
>>>print(li[0])
<function <listcomp>.<lambda> at 0x0000017B0C5B9A60>
>>>print(li[0](0))
0


lambda表达式不会形成对函数体内变量的记忆,只记录最后一个状态
lambda的入参中带有x,就会得到我们想要的结果03!!!!!!
from functools import reduce

def add(x,y):
    return x+y
red = reduce(add,[1,2,3,4,5])
print(red)  运行结果为:154!!!!!!
from functools import reduce

red = reduce(lambda x,y: x+y, [1, 2, 3, 4, 5])
print(red)  运行结果为:15

reduce() 函数语法如下:
reduce(function, iterable[, initializer])
function -- 函数,有两个参数
iterable -- 可迭代对象
initializer -- 可选,初始参数
传给 reduce 中的函数 function(有两个参数)先对集合中的第 12 个元素进行操作,
得到的结果再与第三个数据用 function 函数运算,最后得到一个结果


坑5!!!!!!
用一行python写出1+2+3++10**8
reduce(lambda x,y:x+y,range(1,10**8+1))6!!!!!!
def multipliers():
    return [lambda x : i*x for i in range(4)]
print ([m(2) for m in multipliers()] )
输出结果为:[6, 6, 6, 6]
这段代码相当于:
def multipliers():
    squares = []
    for i in range(4):
        res = lambda x:i*x
        squares.append(res)
    return squares
print([m(2) for m in multipliers()])

print(multipliers())的输出结果如下:
[<function multipliers.<locals>.bar at 0x000001775400B950>, 
<function multipliers.<locals>.bar at 0x000001775B0E42F0>, 
<function multipliers.<locals>.bar at 0x000001775B0E4378>, 
<function multipliers.<locals>.bar at 0x000001775B0E4400>]
匿名函数lambda x:i*x引用了外层函数multipliers()的命名空间内的变量i,所以它触发了闭包规则,
然后函数multipliers()的返回值是一个列表,这个列表的元素为四个闭包函数名指向的内存地址
虽然for i in range(4)这段代码里面的i的值分别被赋予了 0 1 2 3这四个值,
但是闭包函数res并没有引用这四个值,因为闭包函数此时此刻还没有被真正调用,
列表推导式仅仅是把四个匿名函数指向的内存地址保存在了一个列表里,因为没有调用,
所以匿名函数内部的代码并没有执行,也就不存在引用。
函数multipliers()的返回值就是这样的一个列表:[lambda x:ix,lambda x:ix,lambda x:ix,lambda x:ix]


上面的代码完全拆开的话如下:
def multipliers():
    squares = []
    for i in range(4):
        res = lambda x:i*x
        squares.append(res)
    return squares

squares2 = []
for m in multipliers():
    squares2.append(m(2))
print(squares2)7!!!!!!
def multipliers():
    # 添加了一个默认参数i=i
    return [lambda x, i=i: i*x for i in range(4)]
print ([m(2) for m in multipliers()] )
输出结果为:
[0, 2, 4, 6]

拆开后的代码如下:
def multipliers():
    squares = []
    for i in range(4):
        res = lambda x,i=i:i*x
        squares.append(res)
    return squares

squares2 = []
for m in multipliers():
    squares2.append(m(2))
print(squares2)输出结果为[0, 2, 4, 6]


添加了一个i=i后,就给匿名函数,添加了一个默认参数,而python函数中的默认参数,

是在python 解释器遇到def(i=i)lambda 关键字时,就必须初始化默认参数,

此时for i in range(4),每循环一次,匿名函数的默认参数i,就需要找一次i的引用,

i=0时,第一个匿名函数的默认参数值就是0,i=1时,第二个匿名函数的默认参数值就是1,以此类推


坑8!!!!!!
lambdamap函数的结合使用
s = [1,2,3]
res = list((map(lambda x,y,z:x*y*z ,s,s,s)))
print(res) 输出结果为[1, 8, 27]

在python3.X中测试如下:
print(map(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10]))
print(type(map(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10])))
print(list(map(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10])))
输出结果如下:
<map object at 0x000001D54825C9E8>
<class 'map'>
[3, 7, 11, 15, 19]

转载于https://blog.csdn.net/weixin_45222544/article/details/103143357

发布了2 篇原创文章 · 获赞 0 · 访问量 29

猜你喜欢

转载自blog.csdn.net/weixin_41508797/article/details/104694517