一、生成器的定義 在函數中使用yield關鍵字,由函數返回的結果就是生成器。 1 def gen(): 2 print('gen') #函數內部的代碼不執行 3 yield 0 4 yield 1 5 yield 2 6 7 g = gen() 8 print(g) 9 print(next(g)) ...
一、生成器的定義
在函數中使用yield關鍵字,由函數返回的結果就是生成器。
1 def gen(): 2 print('gen') 3 print('gen') 4 yield 0 5 print('gen') 6 yield 1 7 print('gen') 8 yield 2 9 g = gen() 10 print(g) 11 print(next(g)) 12 print(g.__next__())
執行結果:
<generator object gen at 0x106ccfcf0>
gen
gen
0
gen
1
從上面的例子可以看出,
一、生成器是迭代器,next(g),g.__next__()取值照樣可用。
二、yield關鍵字的作用可以保留生成器的狀態。
三、從第二次迭代開始,每一次迭代會從上一次迭代返回結果的位置開始往下執行代碼,遇到yield後返回迭代結果並保留生成器狀態再退出。
二、使用生成器有什麼好處
用例子來說明一下,
第一種情況:假設需要生成一百萬個數據,我們可以通過迴圈來生成一百萬個數據,然後存放於集合中。那麼這個集合所占用的記憶體空間就非常大了。這種情況會一下子讓程式崩潰。而且沒辦法做到獲取數據的時效性,等到一百萬個數據生成完畢,才可以取出數據。
第二種情況:假設同樣生成一百萬個數據,我們使用生成器來生成,我們已經明白生成器的定義和使用,生成器在使用的過程中,當需要迭代數據時,生成器就幫我們取出結果數據,每次迭代每次取出一個結果數據存放到變數中,變數使用過後,系統可以自動回收,可以很好地節省記憶體開支。並且可以做到獲取數據的時效性。
在本人看來,使用生成器在程式需要處理或者生成大量數據時,可以極大地節省記憶體空間,在性能上有所保證,基於這點好處使用生成器才真正發揮它的強大作用。