Python中Yield的基本用法
帶有yield的函式在Python中被稱之為generator(生成器),也就是說,當你呼叫這個函式的時候,函式內部的程式碼並不立即執行 ,這個函式只是返回一個生成器(Generator Iterator)。
def generator(): for i in range(10) : yield i*i gen = generator() print(gen) <generator object generator at 0x7ffaad115aa0>
1. 使用next方法迭代生成器
generator函式怎麼呼叫呢?答案是next函式。
print("first iteration:") print(next(gen)) print("second iteration:") print(next(gen)) print("third iteration:") print(next(gen)) print("fourth iteration:") print(next(gen))
程式輸出:
first iteration:
0
second iteration:
1
three iteration:
4
four iteration:
9
在函式第一次呼叫next(gen)函式時,generator函式從開始執行到yield,並返回yield之後的值。
在函式第二次呼叫next(gen)函式時,generator函式從上一次yield結束的地方繼續執行,直至下一次執行到yield的地方,並返回yield之後的值。依次類推。
2. 使用send()方法與生成器函式通訊
def generator(): x = 1 while True: y = (yield x) x += y gen = generator() print("first iteration:") print(next(gen)) print("send iteration:") print(gen.send(10))
程式碼輸出:
first iteration:
1
send iteration:
11
生成器(generator)函式用yield表示式將處理好的x傳送給生成器(Generator)的呼叫者;然後生成器(generator)的呼叫者可以通過send函式,將外部資訊替換生成器內部yield表示式的返回值,並賦值給y,並參與後續的迭代流程。
3. Yield的好處
Python之所以要提供這樣的解決方案,主要是記憶體佔用和效能的考量。看類似下面的程式碼:
for i in range(10000): ...
上述程式碼的問題在於,range(10000)生成的可迭代的物件都在記憶體中,如果資料量很大比較耗費記憶體。
而使用yield定義的生成器(Generator)可以很好的解決這一問題。
參考材料
- https://pyzh.readthedocs.io/en/latest/the-python-yield-keyword-explained.html
- https://liam.page/2017/06/30/understanding-yield-in-python/
總結
到此這篇關於Python中Yield基本用法的文章就介紹到這了,更多相關Python Yield用法內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!