摘要:上面的語句創建了一個列表,其中有三個元素,每個元素都是一個匿名函數。以下的例子就可以很清晰地說明這個問題。的循環并不會引入新的作用域,因此當最后調用函數的時候,實際上是把當前的值傳遞了進去,而當我們更改了的值后,函數的返回值也就相應改變了。
上面的語句創建了一個列表 a ,其中有三個元素,每個元素都是一個 lambda 匿名函數。
>>> a = [lambda : x for x in range(3)] >>> a [. at 0x7f79c874ae18>, . at 0x7f79c874aea0>, . at 0x7f79c874af28>] >>> a[0]() 2 >>> a[1]() 2 >>> a[2]() 2 >>>
可是為什么三個函數的返回值都為 2 呢?
這是因為函數創建的時候,并沒有傳遞參數,而只有當我們最后調用三個函數的時候,這時候 x 才被作為實參傳遞進 lambda 函數,而此時的 x = 2,所以三個函數的返回值都為 2。
以下的例子就可以很清晰地說明這個問題。
>>> 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 循環并不會引入新的作用域,因此當最后調用 lambda 函數的時候,實際上是把當前 i 的值 2 傳遞了進去,而當我們更改了 i 的值后,函數的返回值也就相應改變了。
再看下面這個例子。
>>> a = [lambda x=x : x for x in range(3)] >>> a[0]() 0 >>> a[1]() 1 >>> a[2]() 2 >>> a[2](10) 10
這次,在循環過程中,我們創建函數的時候把 x 的值作為默認參數傳遞了進去,因此輸出就變成了 0, 1, 2,相當于使用了默認參數。
而如果我們將列表替換成元組,a 就變成了一個生成器,看下面的例子。
>>> 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 >>>
獲取更多精彩,請關注「seniusen」!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/44876.html
摘要:到這里,如果你明白了,我們就可以繼續進行下一步了理解匿名函數。 似乎只要一沾上for循環,難度立刻加倍,下面我們來看一道python的面試題: 要求寫出下面代碼的輸出結果并且解釋原因。 def multipliers(): return [lambda x:i*x for i in range(4)] print([m(2) for m in multipliers()]) 這...
摘要:但是實際寫程序中,我們經常會寫出許多繁雜的丑陋的代碼。特別推薦,許多代碼讓我獲益匪淺,比如這里對的使用。用可以寫出很簡單直觀的代碼,如下當然,上面不考慮效率,這里有一個利用分治法思想的高效的方法。更多文章更多閱讀中參數的用法高級編程技巧 用 Python 時間也算不短了,但總感覺自己在用寫 C++ 代碼的思維寫 Python,沒有真正用到其作為腳本語言的優勢。之前刷 LeetCode ...
摘要:上一講和本講的標題是大話題小函數,所謂大話題,就是這些函數如果溯源,都會找到聽起來更高大上的東西。是提出的一個軟件架構,用于大規模數據集大于的并行運算。 上一講和本講的標題是大話題小函數,所謂大話題,就是這些函數如果溯源,都會找到聽起來更高大上的東西。這種思維方式絕對我堅定地繼承了中華民族的優良傳統的。自從天朝的臣民看到英國人開始踢足球,一直到現在所謂某國勃起了,都一直在試圖論證足球起...
摘要:模塊的模塊是處理迭代器的工具集合。迭代器是一種可以在循環語句包括列表元組和字典中使用的數據類型。使用模塊中的函數讓你可以執行很多迭代器操作,這些操作通常需要多行函數和復雜的列表理解。 Python 多好用不用多說,大家看看自己用的語言就知道了。但是 Python 隱藏的高級功能你都 get 了嗎?本文中,列舉了 Python 中五種略高級的特征以及它們的使用方法,快來一探究竟吧! sh...
閱讀 2774·2021-11-22 15:11
閱讀 3537·2021-09-28 09:43
閱讀 2889·2019-08-30 13:05
閱讀 3431·2019-08-30 11:18
閱讀 1447·2019-08-29 16:34
閱讀 1301·2019-08-29 13:53
閱讀 2908·2019-08-29 11:03
閱讀 1658·2019-08-29 10:57