摘要:這是一道魔性面試題,難倒了無數英雄好漢上面代碼的執行順序是這樣的從上到下第一個函數就是實現了一個簡單的加法運算第二個函數是一個生成器函數,如果調用它會返回一個生成器這一行調用了生成器函數,所以此刻就是一個生成器它的本質還是迭代器然后執行循環
這是一道魔性面試題,難倒了無數英雄好漢……
def add(n,i): return n+i def test(): for i in range(4): yield i g=test() for n in [1,10]: g=(add(n,i) for i in g) print(n) print(list(g))
10 [20, 21, 22, 23]上面代碼的執行順序是這樣的:從上到下:
第一個函數add就是實現了一個簡單的加法運算 第二個函數test是一個生成器函數,如果調用它會返回一個生成器 g=test(),這一行調用了生成器函數,所以此刻g就是一個生成器(它的本質還是迭代器) 然后執行for循環,這里迷惑人的就是這個for循環,為了減少它的魔性,我們把for循環拆開來看: 當n = 1時: 執行了:g=(add(n,i) for i in g) 當n = 10時: 執行了:g=(add(n,i) for i in g)
乍一看這兩行代碼還是有點迷糊,但是我們要知道,生成器有個最大的特性就是惰性,當你不進行迭代時它就不進行運算,想要對生成器進行迭代有以下幾種方法:
第一種:for循環,for循環的本質就是調用了iter和next方法進行了迭代
第二種:調用next方法
第三種:調用send方法
第四種:數據類型強制轉換,比如使用list()強制轉換。
只要沒有以上四種方法進行迭代,那么生成器就沒有進行運算,所以在上面的for循環中無論是n=1時還是n=10時,生成器 g 都沒有參與運算,
當n = 1時,g=(add(n,i) for i in g),這個表達式的結果g 就是一個表達式,沒有進行運算,g的值就是一個表達式(add(n,i) for i in g),括號里面的g實際上是test(),所以g = (add(n,i) for i in test()),僅此而已
當n = 10時,g=(add(n,i) for i in g),把n=1時的g的結果帶入進去就是g=(add(n,i) for i in (add(n,i) for i in test()))
當整段代碼執行到print(list(g))語句之前,g的值就是一段代碼,或者你可以稱之為算法,沒有進行任何運算,里面的n就是n,g就是g
不過此時因為代碼是按照流程執行的,并且for循環已經執行完畢,所以n的值等于10
當執行print(list(g))語句時,生成器才開始輸出數據,此時執行最后一個g的賦值語句:
g=(add(n,i) for i in (add(n,i) for i in test()))
這時 n 的值等于10(因為代碼是按照流程執行的,for循環已經執行完了,n的最終結果就是10),其中后面的(add(n,i) for i in test())這段代碼的結果依然是個生成器,迭代后應為[10,11,12,13],所以最終的結果可以理解成:(add(n,i) for i in [10,11,12,13]),所以最終結果為:20,21,22,23
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/42559.html
摘要:到這里,如果你明白了,我們就可以繼續進行下一步了理解匿名函數。 似乎只要一沾上for循環,難度立刻加倍,下面我們來看一道python的面試題: 要求寫出下面代碼的輸出結果并且解釋原因。 def multipliers(): return [lambda x:i*x for i in range(4)] print([m(2) for m in multipliers()]) 這...
摘要:昨天晚上,筆者有幸參加了一場面試,有一個環節就是現場編程題目如下示例數據如下,求每名學生對應的成績最高的那門科目與,用實現這個題目看上去很簡單,其實,并不簡單。 ??昨天晚上,筆者有幸參加了一場面試,有一個環節就是現場編程!題目如下:??示例數據如下,求每名學生(ID)對應的成績(score)最高的那門科目(class)與ID,用Python實現: showImg(https://se...
摘要:閉包正確的說應該是指一個閉包域每當聲明了一個函數它就產生了一個閉包域可以解釋為每個函數都有自己的函數棧每個閉包域對象都有一個不是屬性內默認有個名為的全局引用有了這個引用就可以直接調用的屬性或方法凡是在閉包域內聲明的變量或方法外部無法直接訪問 閉包 正確的說,應該是指一個閉包域,每當聲明了一個函數,它就產生了一個閉包域(可以解釋為每個函數都有自己的函數棧),每個閉包域(Function...
摘要:所以能用的地方盡量用,相等運算符隱藏的類型轉換,會帶來一些違反直覺的結果。 這是在國外的一道面試題看到的,大家先自己想一下,在什么情況下這個判斷會成立?按正常思維想,這個是不可能成立的,但nothing is impossible,首先貼上正確答案代碼 const a = { i: 1, toString: function () { return a.i++; }...
摘要:這是我在一次面試中,被面試官所提問的一道題在這次面試題中相等指的是對象的屬性個數值相等有這樣兩個李德華張德華我能想到的一種方案解答過程的思考由于沒有,我只能通過轉化成數組進入第二步,對象中的屬性在另一個中是否存在。 這是我在一次面試中,被面試官所提問的一道題 在這次面試題中 相等:指的是對象的屬性個數值相等 有這樣兩個obj let obj1 = { name:李德華, ...
閱讀 3723·2021-10-13 09:39
閱讀 3789·2021-09-24 09:48
閱讀 1189·2021-09-01 10:30
閱讀 2526·2019-08-30 15:55
閱讀 1774·2019-08-29 16:39
閱讀 2296·2019-08-26 13:55
閱讀 3050·2019-08-26 12:23
閱讀 1634·2019-08-26 11:59