四步解读python生成器
生活随笔
收集整理的這篇文章主要介紹了
四步解读python生成器
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
生成器的兩個特點:
1.惰性機制
2.生成器,在被調用之前,只是代表著一段沒有被執行過的代碼
一個有意思的python面試題,是下面的這個樣子
def add(a,b): #普通求和函數return a + b def test(): #生成器函數for r in range(4):yield r g=test() for n in [2,10]:g=(add(n,i) for i in g) print(list(g))第一步分解
代碼塊注釋如下(還是上面的內容,只是注釋加多了)
def add(a,b): #普通求和函數return a + b def test(): #生成器函數for r in range(4):yield r g=test() #獲取生成器對象,后面的操作都指向這個對象,這和直接執行fun()函數銷效果是不一樣的 for n in [2,10]: #因為前面已經定義了生成器g,這個for循環的代碼塊等于是重新定義了變量g,g=(add(n,i) for i in g) #重新定義的這個變量g也是一個生成器,使用推導式定義的生成器 print(list(g)) #list自帶for方法,所以list(g)會一次性把上面列表生成器的值拿完第二步分解
代碼簡化(對上面的代碼做了簡化,但是都是等效的,主要是對for循環做了簡化)
''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:778463939 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' def add(a,b): #普通求和函數return a + b def test(): #生成器函數for r in range(4):yield r g=test() n=2 #這一行到下一步后,就沒有了,我開始沒理解。為什么就可以省略了?答案是當n=2時,只是生成了一個生成器,而并沒有執行括號里面的代碼,因為這時,沒有人去調用#這個生成器,所以這時的g只是代表著一段代碼:(add(n,i) for i in g)。g=(add(n,i) for i in g) n=10 g=(add(n,i) for i in g) print(list(g))第三步分解
代碼簡化(對上面的代碼做了簡化,但是都是等效的,主要是對n重新賦值的過程做了簡化)
''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:778463939 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' def add(a,b): return a + b def test(): for r in range(4):yield r g=test() n=10 #和上面的代碼做比較,n重新賦值了兩次,第二次已經把一次的賦值覆蓋掉了,但是g因為前面做過定義,需要帶入。#因為n=2時,沒有執行括號里面的代碼,所以,走到了n=10。但是,這時括號里面的代碼還是沒有執行,這個時候的g也不過是#一段代碼:(add(n,i) for i in g)。而且,這時的n已經被重新賦值了,n=10.已經在內存中存在了。g=(add(n,i) for i in (add(n,i) for i in g))#這里最外層括號里的g,是n=2時的生成器,第二步已經說過,那時的g只不過是一段代碼,所以直接帶過來就好了。 print(list(g))第四步分解
代碼簡化(對上面的代碼做了簡化,但是都是等效的,帶入數字10)
def add(a,b): return a + bdef test(): for r in range(4):yield r g=test()g=(add(10,i) for i in (add(10,i) for i in g)) print(list(g))#走到這里時,因為list中有__next__(),所以開始跟生成器要值了,生成器開始循環起來。 #因為for循環自帶__next__方法,所以for循環作用于生成器的時候也是一次性遍歷完的,并不需要單獨的在一個一個執行next #分別帶入i值0,1,2,3,可以生成g的一個生成器結果,再通過list(g)一次性拿完總結
以上是生活随笔為你收集整理的四步解读python生成器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python二分查找的三种思路
- 下一篇: python魔法方法中的__str__和