本篇博文講解生成器,主要介紹2個方面,其一為原理,其二為完整**執行及註解說明。
一.生成器原理
生成器卻不同,它可以實現在迭代的同時生成元素。
也就是說,對於可以用某種演算法推算得到的多個資料,生成器並不會一次性生成它們,而是什麼時候需要,才什麼時候生成。不僅如此,生成器的建立方式也比迭代器簡單很多,大體分為以下 2 步:
定義乙個以 yield 關鍵字標識返回值的函式;
呼叫剛剛建立的函式,即可建立乙個生成器;
舉個例子:
def intnum():
print("開始執行")
for i in range(5):
yield i
print("繼續執行")
num = intnum()
由此,我們就成功建立了乙個 num 生成器物件。顯然,和普通函式不同,number() 函式的返回值用的是 yield 關鍵字,而不是 return 關鍵字,此類函式又成為生成器函式。
和 return 相比,yield 除了可以返回相應的值,還有乙個更重要的功能,即每當程式執行完該語句時,程式就會暫停執行。不僅如此,即便呼叫生成器函式,python 直譯器也不會執行函式中的**,它只會返回乙個生成器(物件)。
要想使生成器函式得以執行,或者想使執行完 yield 語句立即暫停的程式得以繼續執行,有以下 2 種方式:
通過生成器(上面程式中的 num)呼叫 next() 內建函式或者 __next__() 方法;
通過 for 迴圈遍歷生成器。
例如,在上面程式的基礎上,新增如下語句:
#呼叫 next() 內建函式
print(next(num))
#呼叫 __next__() 方法
print(num.__next__())
#通過for迴圈遍歷生成器
for i in num:
print(i)
程式執行結果為:
開始執行
0繼續執行
1繼續執行
2繼續執行
3繼續執行
4繼續執行
這裡有必要給讀者分析乙個程式的執行流程:
1) 首先,在建立有 num 生成器的前提下,通過其呼叫 next() 內建函式,會使 python 直譯器開始執行 intnum() 生成器函式中的**,因此會輸出「開始執行」,程式會一直執行到yield i
,而此時的 i==0,因此 python 直譯器輸出「0」。由於受到 yield 的影響,程式會在此處暫停。
2) 然後,我們使用 num 生成器呼叫 __next__() 方法,該方法的作用和 next() 函式完全相同(事實上,next() 函式的底層執行的也是 __next__() 方法),它會是程式繼續執行,即輸出「繼續執行」,程式又會執行到yield i
,此時 i==1,因此輸出「1」,然後程式暫停。
3) 最後,我們使用 for 迴圈遍歷 num 生成器,之所以能這麼做,是因為 for 迴圈底層會不斷地呼叫 next() 函式,使暫停的程式繼續執行,因此會輸出後續的結果。
注意,在 python 2.x 版本中不能使用 __next__() 方法,可以使用 next() 內建函式,另外生成器還有 next() 方法(即以 num.next() 的方式呼叫)。除此之外,還可以使用 list() 函式和 tuple() 函式,直接將生成器能生成的所有值儲存成列表或者元組的形式。例如:
num = intnum()
print(list(num))
num = intnum()
print(tuple(num))
程式執行結果為:
開始執行
繼續執行
繼續執行
繼續執行
繼續執行
繼續執行
[0, 1, 2, 3, 4]
開始執行
繼續執行
繼續執行
繼續執行
繼續執行
繼續執行
(0, 1, 2, 3, 4)
通過輸出結果可以判斷出,list() 和 tuple() 底層實現和 for 迴圈的遍歷過程是類似的。
相比迭代器,生成器最明顯的優勢就是節省記憶體空間,即它不會一次性生成所有的資料,而是什麼時候需要,什麼時候生成。二.完整**說明:
# 帶有引數的生成器,引數為kdef intnum(k):
print("開始執行")
n=0while n<4:
n=n+1
yield n+5+k
print("繼續執行")
num = intnum(3)
# 說明引數k=3保持不變,每次迭代都不會改變,
# 而n將會在每次迭代中一直+1,當n<10滿足條件
# 就終止迭代。
for i in num:
# 這裡i是num函式返回的值,即n+5+k
print(i)
# 注:第一執行將執行wile上面的**,隨後在yield處停止,
# 當再次迭代時將執行yield後面的**(print("繼續執行")),
# 然後在從while處執行直到遇到yield後,又重複上述步驟執行
執行結果:
python 生成器作用 Python生成器
生成器介紹 在函式內部包含yield關鍵字,那麼該函式執行的結果是生成器,生成器就是迭代器。生成器的功能 把函式結果做成迭代器 以一種優雅的方式封裝好iter,next 提供了一種自己定義迭代器的方式。使用生成器建立乙個迭代器 def a print a yield 11 使用yield,執行後返回...
python生成器好處 Python生成器筆記
python中三大器有迭代器,生成器,裝飾器,本文主要講述生成器。主要從生成器的概念,本質,以及yield關鍵字的使用執行過程。本質 生成器是一類特殊的迭代器,使用了yield關鍵字的函式不再是函式,而是生成器。使用了yield的函式就是生成器 1.yield關鍵字有兩點作用 1.1 yield語句...
python生成器函式 Python 生成器函式
一 生成器 生成器指的是生成器物件,可由生成器表示式得到,也可使用 yield 關鍵字得到乙個生成器函式,呼叫這個函式得到乙個生成器物件 生成器物件,是乙個可迭代物件,是乙個迭代器 生成器物件,是延遲計算 惰性求值的 1.1 生成器函式 函式體重包含 yield 語句的函式,就是生成器函式,呼叫後返...