成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

對(duì) a = [lambda : x for x in range(3)] 的理解

cocopeak / 1397人閱讀

摘要:上面的語句創(chuàng)建了一個(gè)列表,其中有三個(gè)元素,每個(gè)元素都是一個(gè)匿名函數(shù)。以下的例子就可以很清晰地說明這個(gè)問題。的循環(huán)并不會(huì)引入新的作用域,因此當(dāng)最后調(diào)用函數(shù)的時(shí)候,實(shí)際上是把當(dāng)前的值傳遞了進(jìn)去,而當(dāng)我們更改了的值后,函數(shù)的返回值也就相應(yīng)改變了。

上面的語句創(chuàng)建了一個(gè)列表 a ,其中有三個(gè)元素,每個(gè)元素都是一個(gè) lambda 匿名函數(shù)。

>>> a = [lambda : x for x in range(3)]
>>> a
[. at 0x7f79c874ae18>, 
. at 0x7f79c874aea0>, 
. at 0x7f79c874af28>]
>>> a[0]()
2
>>> a[1]()
2
>>> a[2]()
2
>>>

可是為什么三個(gè)函數(shù)的返回值都為 2 呢?

這是因?yàn)楹瘮?shù)創(chuàng)建的時(shí)候,并沒有傳遞參數(shù),而只有當(dāng)我們最后調(diào)用三個(gè)函數(shù)的時(shí)候,這時(shí)候 x 才被作為實(shí)參傳遞進(jìn) lambda 函數(shù),而此時(shí)的 x = 2,所以三個(gè)函數(shù)的返回值都為 2。

以下的例子就可以很清晰地說明這個(gè)問題。

>>> a = []
>>> for i in range(3):
...     a.append(lambda:i)
... 
>>> a
[ at 0x7f79c88022f0>, 
 at 0x7f79c8802378>, 
 at 0x7f79c8802400>]
>>> a[0]()
2
>>> a[1]()
2
>>> a[2]()
2
>>> i
2
>>> i = 10
>>> a[2]()
10
>>> 

Python 的 for 循環(huán)并不會(huì)引入新的作用域,因此當(dāng)最后調(diào)用 lambda 函數(shù)的時(shí)候,實(shí)際上是把當(dāng)前 i 的值 2 傳遞了進(jìn)去,而當(dāng)我們更改了 i 的值后,函數(shù)的返回值也就相應(yīng)改變了。

再看下面這個(gè)例子。

>>> a = [lambda x=x : x for x in range(3)]
>>> a[0]()
0
>>> a[1]()
1
>>> a[2]()
2
>>> a[2](10)
10

這次,在循環(huán)過程中,我們創(chuàng)建函數(shù)的時(shí)候把 x 的值作為默認(rèn)參數(shù)傳遞了進(jìn)去,因此輸出就變成了 0, 1, 2,相當(dāng)于使用了默認(rèn)參數(shù)。

而如果我們將列表替換成元組,a 就變成了一個(gè)生成器,看下面的例子。

>>> a = (lambda:x for x in range(3))
>>> a
 at 0x7f79c8f08200>
>>> next(a)
. at 0x7f79ca827f28>
>>> next(a)
. at 0x7f79c88022f0>
>>> next(a)
. at 0x7f79ca827f28>
>>> next(a)
Traceback (most recent call last):
  File "", line 1, in 
StopIteration
>>> a = (lambda:x for x in range(3))
>>> next(a)()
0
>>> next(a)()
1
>>> next(a)()
2
>>> next(a)()
Traceback (most recent call last):
  File "", line 1, in 
StopIteration
>>>

獲取更多精彩,請(qǐng)關(guān)注「seniusen」!

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/44876.html

相關(guān)文章

  • python面試題之“該死for循環(huán)系列”(二)

    摘要:到這里,如果你明白了,我們就可以繼續(xù)進(jìn)行下一步了理解匿名函數(shù)。 似乎只要一沾上for循環(huán),難度立刻加倍,下面我們來看一道python的面試題: 要求寫出下面代碼的輸出結(jié)果并且解釋原因。 def multipliers(): return [lambda x:i*x for i in range(4)] print([m(2) for m in multipliers()]) 這...

    shiweifu 評(píng)論0 收藏0
  • 由 sort 中 key 用法淺談 python

    摘要:但是實(shí)際寫程序中,我們經(jīng)常會(huì)寫出許多繁雜的丑陋的代碼。特別推薦,許多代碼讓我獲益匪淺,比如這里對(duì)的使用。用可以寫出很簡單直觀的代碼,如下當(dāng)然,上面不考慮效率,這里有一個(gè)利用分治法思想的高效的方法。更多文章更多閱讀中參數(shù)的用法高級(jí)編程技巧 用 Python 時(shí)間也算不短了,但總感覺自己在用寫 C++ 代碼的思維寫 Python,沒有真正用到其作為腳本語言的優(yōu)勢。之前刷 LeetCode ...

    keke 評(píng)論0 收藏0
  • [零基礎(chǔ)學(xué)python]大話題小函數(shù)(2)

    摘要:上一講和本講的標(biāo)題是大話題小函數(shù),所謂大話題,就是這些函數(shù)如果溯源,都會(huì)找到聽起來更高大上的東西。是提出的一個(gè)軟件架構(gòu),用于大規(guī)模數(shù)據(jù)集大于的并行運(yùn)算。 上一講和本講的標(biāo)題是大話題小函數(shù),所謂大話題,就是這些函數(shù)如果溯源,都會(huì)找到聽起來更高大上的東西。這種思維方式絕對(duì)我堅(jiān)定地繼承了中華民族的優(yōu)良傳統(tǒng)的。自從天朝的臣民看到英國人開始踢足球,一直到現(xiàn)在所謂某國勃起了,都一直在試圖論證足球起...

    leejan97 評(píng)論0 收藏0
  • Python 隱藏高級(jí)功能你都 get 到了嗎?

    摘要:模塊的模塊是處理迭代器的工具集合。迭代器是一種可以在循環(huán)語句包括列表元組和字典中使用的數(shù)據(jù)類型。使用模塊中的函數(shù)讓你可以執(zhí)行很多迭代器操作,這些操作通常需要多行函數(shù)和復(fù)雜的列表理解。 Python 多好用不用多說,大家看看自己用的語言就知道了。但是 Python 隱藏的高級(jí)功能你都 get 了嗎?本文中,列舉了 Python 中五種略高級(jí)的特征以及它們的使用方法,快來一探究竟吧! sh...

    k00baa 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<