本文主要講解python生成器的使用方法以及優點,對其背後的原理不進行深程度的研究。
目錄
前言:
一 、生成器的建立
通過def&&yield
通過規則表達式
二、生成器的使用及優勢
前言:
我們都知道資料存儲在計算機裡是需要耗費記憶體的。當我們需要周遊一組資料或對這一組資料進行操作時,事先生成好的資料,特别是當資料量很大的時候;我們或許一時用不上所有的資料,但是這些資料還是會占用計算機的記憶體空間。生成器可以為我們帶來的是,每當我們需要一點資料時,取出一點資料,在需要時,再取出;有效的解決了空間浪費的問題。
一 、生成器的建立
通過def&&yield
在python語言中,生成器主要有兩種。第一種也是最常用的一種是把函數中的return換成yield。python中資料生成器與函數的傳回值不同。函數的傳回值是一次性的傳回所有結果;而資料生成器是當且僅當需要使用該資料時才會傳回。當執行到yield語句時,會暫停并儲存所執行的資訊,傳回yield後的語句;當再次調用生成器的資料時,會從yield後的語句開始執行。
def a():
for i in range(5):
it = [i]
yield it
it = []
如圖所示:
我們定義了一個生成器a,因為我們用到了保留字yield;如果将yield換成return,那麼a就是一個函數,但是此時python會報錯,因為後面還有一條it = [],當作為函數時沒有對齊,不符合python文法。但是作為生成器的a沒有任何問題,因為隻有周遊a内的資料,才會執行a,然後傳回yeild後的語句,再次擷取a内的資料時,從yield再次開始執行。

如上圖所示,我們定義了一個資料生成器a,調用資料生成器指派給b,此時的b就是一個生成器。
通過規則表達式
g = (x * x for x in range(10))
如圖所示:g就是一個資料生成器。其中x*x就是一個規則表達式,g裡面的所有元素都是通過這一規則表達式生成的。
二、生成器的使用及優勢
def b():
for i in range(5):
it = [range(i)]
yield it
it = []
yield it
c = b()
for i in c:
print(i)
如圖所示,我們定義了一個函數生成器b并指派給c,依次周遊c中所有的元素。
從運作結果來看,正如我們在前文所描述的一樣,生成器内原本并沒有值,隻是當我們需要生成器内的資料時,生成器才會從b内的yield傳回值給我們。之後的yield = []是說當我們每取完一次it内的資料,就将it清單清空,可以了解為減少記憶體的占用;這樣,當我們再次需要一組資料時,再次調用c内的資料(通過for循環),這時生成器會從yield處繼續執行。繼而在擷取資料的同時減少了記憶體的占用。
具體過程如下:
參考:https://www.runoob.com/python3/python3-iterator-generator.html
https://www.cnblogs.com/liangmingshen/p/9706181.html