Python 生成器(yield)
生活随笔
收集整理的這篇文章主要介紹了
Python 生成器(yield)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Python 生成器
一、生成器(generator)
- Python 的生成器是一種特殊的程序,可以被用作控制循環的迭代行為。生成器可以暫時掛起函數,并保留函數的局部變量等數據,然后在再次調用它的時候,從上次暫停的位置繼續執行下去。
- 如果所要的序列的元素可以按照某種算法推算出來,可以采用迭代器一邊循環一邊計算的機制,這樣就不必創建完整的序列,從而節省大量的空間。
- Python 的生成器是迭代器的一種。
- 協程是基于生成器實現的。
二、基于列表生成式的生成器
1、創建生成器:列表生成式的 [ ] 改成 ( )
# 創建一個生成器,查看其類型 g = (x * x for x in range(5)) print(g) >>> <generator object <genexpr> at 0x00000173441AB2B0>2、使用生成器:next()
每次調用next(g),就計算出生成器g的下一個元素的值,直到計算到最后一個元素,沒有更多的元素時,拋出StopIteration的錯誤
# 獲得生成器的下一個值 next(g) >>> 0 next(g) >>> 1 ...... next(g) >>> Traceback (most recent call last):File "<stdin>", line 1, in <module>StopIteration# 遍歷生成器 for n in g:print(n) >>> 0 1 4 9 16三、yield 生成器
1、創建生成器:yield
# 創建一個生成器,查看其類型 def f(n):i = 0while i < n:yield i**2i += 1return 'finish'g = f(5) print(g) >>> <generator object f at 0x000001F73626B2B0>2、使用生成器:next()
# 遍歷生成器 while True:try:x = next(g)print(x)except StopIteration as e:print('Generator return value:', e.value)break >>> 0 1 4 9 16Generator return value: finish3、生成器傳遞參數:send()
- yield 語句執行返回操作后會馬上掛起,等待接收值。send() 值時會馬上進行賦值,如果沒有接收者,會執行代碼直至 yield 語句。
- 啟動生成器:.send(None),第一次使用 send(),這時候沒有 yield 接收值,執行函數的初始化代碼,直到 yield 語句,返回 yield 后面的值(語句的賦值操作沒有執行),生成器掛起。
- 生成器再次傳遞值:.send(n),生成器會先接收值 n 賦值給 yield 語句的變量,然后執行 yield 語句之后的代碼,直至遇到下一個 yield 語句把 yield 后面的值返回給調用者,生成器再次掛起,等待接收值。
GOOD LUCK!
總結
以上是生活随笔為你收集整理的Python 生成器(yield)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 多进程和多线程
- 下一篇: 如何理解NIO