Python之for循环中的lambda
第⼀种
f = [lambda x: x*i for i in range(4)]  (如果将x换成i,调⽤时候就不⽤传参数,结果都为3)
对于上⾯的表达式,调⽤结果:
>>> 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
上⾯的表达式展开如下:
1def func():
2    fs = []
3for i in range(4):
4def lam(x):
5return x*i
6        fs.append(lam)
7return fs
当调⽤ func() 时,每循环⼀次,将 lam 函数的地址存到 fs 中。因为在每次循环中 lam函数都未绑定 i 的值,所以直到循环结束,i 的值为3,并将 lam 中所⽤到的 i 值定为 3 ,因此真正调⽤(例如f[0](3))的时候 i 值保持不变(为3)。
展开后的调⽤⽅法:
>>> def func():
...    fs = []
...    for i in range(4):
...        def lam(x):
...            return x*i
...        fs.append(lam)
...    return fs
...
>>> f = func()
>>> f[0](3)
9
>>> f[2](3)
9
>>> f[1](3)
9
另⼀种将x换成i,就与传⼊的x值⽆关了。(这⾥ lambda 后⾯什么参数都不跟)
>>> f = [lambda :i*i for i in range(4)]
>>> f[0]()
9
>>> f[1]()
9
>>> f[2]()
9
>>> f[3]()
9
解释同上⾯。
第⼆种
f1 = [lambda i=i: i*i for i in range(4)]
对于上⾯的表达式,调⽤结果:
>>> f1 = [lambda i=i: i*i for i in range(4)]
>>> f1[0]()
>>> f1[1]()
1
>>> f1[2]()
4
>>> f1[3]()
9
上⾯的表达式展开如下(为了更直观,替换了变量):
1def func():
2    fs = []
3for i in range(4)
4def lam(x=i):  # 即 i=i
5return x*x    # 即 i*i
6        fs.append(lam)
7return 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)]
>>> f1[0](8)
64
>>> f1[1](8)
64
>>> f1[2](8)
64
>>> f1[3](8)
64
最后⼀种
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]()
python中lambda怎么使用
9
>>> f2[3]()
9
>>> f2[0](7)
9
>>> f2[1](7)
9
>>> f2[2](7)
9
传不传参数都不影响结果。展开后:
1def func():
2    fs = []
3for i in range(4)
4def lam(x=i):
5return i*i
6        fs.append(lam)
7return fs
虽然 lam 函数将 i 的值绑定到了 x 上,但函数体中并未使⽤ x,所以直到循环结束,i 的值变为3,才会在调⽤时使⽤。其实同第⼀种情况是⼀样的。
最后:我写的也好乱,还是多试试吧。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。