生成器

生成器

摘錄自《利用 Python 進行數據分析》第三版 3.2.6

迭代器協議是一種令對象可遍歷的通用方式。比如用 for 循環來遍歷一個字典 some_dict,Python 解釋器會先嚐試根據 some_dict 生成一個迭代器,即一種用於在上下文中向 Python 解釋器生成對象的對象。

大部分以列表或列表型對象爲參數的方法都可以接收任意迭代器對象,如 min, max, sum, list 和 tuple。

image-20200118220819647

生成器是構造新的可遍歷對象的一種非常簡潔的方式。普通函數執行並一次返回單個結果,而生成器則“惰性”地返回一個多結果序列,在每個元素產生之後暫停,直到下一個請求。

如需創建一個生成器,只需要在函數中返回關鍵字 return 替換爲 yield 關鍵字。

def squares(n=10):
    print('Generating squares from 1 to {0}'.format(n ** 2))
    for i in range(1, n+1):
        yield i ** 2

當實際調用生成器時,代碼並不會立即執行。

image-20200118221213228

直到請求生成器中的元素時,它纔會執行它的代碼。

image-20200118221327547

生成器表達式

創建一個生成器表達式,只需要將列表推導式的中括號替換爲小括號即可。

image-20200118221441281

生成器使用總結
1.生成器的好處是可以一邊循環一邊進行計算,不用一下子就生成一個很大的集合,佔用內存空間。生成器的使用節省內存空間。
2.生成器保存的是算法,而列表保存的計算後的內容,所以同樣內容的話生成器佔用內存小,而列表佔用內存大。每次調用 next(G) ,就計算出 G 的下一個元素的值,直到計算到最後一個元素,沒有更多的元素時,拋出 StopIteration 的異常。
3.使用for 循環來遍歷生成器內容,因爲生成器也是可迭代對象。通過 for 循環來迭代它,不需要關心 StopIteration 異常。但是用for循環調用generator時,得不到generator的return語句的返回值。如果想要拿到返回值,必須用next()方法,且捕獲StopIteration錯誤,返回值包含在StopIteration的value中。
4.在 Python 中,使用了 yield 的函數都可被稱爲生成器(generator)。生成器是一個返回迭代器的函數,只能用於迭代操作。更簡單點理解生成器就是一個迭代器。
5.一個帶有 yield 的函數就是一個 generator,它和普通函數不同,生成一個 generator 看起來像函數調用,但不會執行任何函數代碼,直到對其調用 next()(在 for 循環中會自動調用 next())纔開始執行。雖然執行流程仍按函數的流程執行,但每執行到一個 yield 語句就會中斷,保存當前所有的運行信息,並返回一個迭代值,下次執行next() 方法時從 yield 的下一個語句繼續執行。看起來就好像一個函數在正常執行的過程中被 yield 中斷了數次,每次中斷都會通過 yield 返回當前的迭代值。生成器不僅“記住”了它數據狀態;生成器還“記住”了它在流控制構造中的位置。

【參考】

[1] Python中生成器的原理與使用詳解

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章