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 def func():
2     fs = []
3     for i in range(4):
4         def lam(x):
5             return x*i
6         fs.append(lam)
7     return 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]()
0
>>> f1[1]()
1
>>> f1[2]()
4
>>> f1[3]()
9

上面的表達式展開如下(為了更直觀,替換了變量):

1 def func():
2     fs = []
3     for i in range(4)
4         def lam(x=i):   # 即 i=i
5             return x*x    # 即 i*i
6         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 def func():
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,才會在調用時使用。其實同第一種情況是一樣的。

 

 

最后:我寫的也好亂,還是多試試吧。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM