python的lambda和for一起使用_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

上面的表达式展开如下:

1 deffunc():2 fs =[]3 for i in range(4):4 deflam(x):5 return x*i6 fs.append(lam)7 return fs

当调用 func() 时,每循环一次,将 lam 函数的地址存到 fs 中。因为在每次循环中 lam函数都未绑定 i 的值,所以直到循环结束,i 的值为3,并将 lam 中所用到的 i 值定为 3,因此真正调用(例如f[0](3))的时候 i 值保持不变(为3)。

展开后的调用方法:

>>> deffunc():

... fs=[]

...for i in range(4):

...deflam(x):

...return x*i

... fs.append(lam)

...returnfs

...>>> 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]()

0>>> f1[1]()1

>>> f1[2]()4

>>> f1[3]()9

上面的表达式展开如下(为了更直观,替换了变量):

1 deffunc():2 fs =[]3 for i in range(4)4 def lam(x=i): #即 i=i5 return x*x #即 i*i6 fs.append(lam)7 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)]>>> 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]()9

>>> f2[3]()9

>>> f2[0](7)9

>>> f2[1](7)9

>>> f2[2](7)9

传不传参数都不影响结果。展开后:

1 deffunc():2 fs =[]3 for i in range(4)4 def lam(x=i):

5 return i*i

6 fs.append(lam)7 return fs

虽然 lam 函数将 i 的值绑定到了 x 上,但函数体中并未使用 x,所以直到循环结束,i 的值变为3,才会在调用时使用。其实同第一种情况是一样的。

最后:我写的也好乱,还是多试试吧。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值