Python生成器介紹(原理 實踐)

2022-07-01 14:03:07 字數 2744 閱讀 5626

本篇博文講解生成器,主要介紹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 迴圈的遍歷過程是類似的。

相比迭代器,生成器最明顯的優勢就是節省記憶體空間,即它不會一次性生成所有的資料,而是什麼時候需要,什麼時候生成。

二.完整**說明:

# 帶有引數的生成器,引數為k

def 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 語句的函式,就是生成器函式,呼叫後返...