摘要:上面的語句創(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)) >>> aat 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
摘要:到這里,如果你明白了,我們就可以繼續(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()]) 這...
摘要:但是實(shí)際寫程序中,我們經(jīng)常會(huì)寫出許多繁雜的丑陋的代碼。特別推薦,許多代碼讓我獲益匪淺,比如這里對(duì)的使用。用可以寫出很簡單直觀的代碼,如下當(dāng)然,上面不考慮效率,這里有一個(gè)利用分治法思想的高效的方法。更多文章更多閱讀中參數(shù)的用法高級(jí)編程技巧 用 Python 時(shí)間也算不短了,但總感覺自己在用寫 C++ 代碼的思維寫 Python,沒有真正用到其作為腳本語言的優(yōu)勢。之前刷 LeetCode ...
摘要:上一講和本講的標(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)在所謂某國勃起了,都一直在試圖論證足球起...
摘要:模塊的模塊是處理迭代器的工具集合。迭代器是一種可以在循環(huán)語句包括列表元組和字典中使用的數(shù)據(jù)類型。使用模塊中的函數(shù)讓你可以執(zhí)行很多迭代器操作,這些操作通常需要多行函數(shù)和復(fù)雜的列表理解。 Python 多好用不用多說,大家看看自己用的語言就知道了。但是 Python 隱藏的高級(jí)功能你都 get 了嗎?本文中,列舉了 Python 中五種略高級(jí)的特征以及它們的使用方法,快來一探究竟吧! sh...
閱讀 2832·2021-11-22 15:11
閱讀 3555·2021-09-28 09:43
閱讀 2899·2019-08-30 13:05
閱讀 3442·2019-08-30 11:18
閱讀 1455·2019-08-29 16:34
閱讀 1313·2019-08-29 13:53
閱讀 2919·2019-08-29 11:03
閱讀 1669·2019-08-29 10:57