0
A
回答
1
Generator使用yield來返回值。 Python生成器函數也可以使用(yield)
語句使用值。另外有兩個關於生成器對象的新方法,send()
和close()
,爲消耗和生成值的對象創建一個框架。定義這些對象的生成器函數稱爲coroutines。
協程消耗使用(yield)
語句值如下:
value = (yield)
有了這個語法,執行在此聲明將暫停,直到對象的發送方法與一個參數調用:
coroutine.send(data)
然後,執行恢復,並賦值給數據值。爲了表示計算結束,我們使用close()
方法關閉協程。這會在協程中引發一個GeneratorExit異常,我們可以用try/except子句來捕捉異常。
下面的例子說明了這些概念。這是一個協同打印匹配提供的模式的字符串。
def match(pattern):
print('Looking for ' + pattern)
try:
while True:
s = (yield)
if pattern in s:
print(s)
except GeneratorExit:
print("=== Done ===")
我們用一個模式初始化,並調用__next__()
開始執行:
m = match("Jabberwock")
m.__next__()
Looking for Jabberwock
到__next__()
的調用導致函數體被執行,所以行「尋找jabberwock」打印出來。執行繼續,直到遇到語句line = (yield)
。然後,執行暫停,並等待一個值發送給m。我們可以使用send()
將值發送給它。
0
相關問題
- 1. 爲什麼我需要等待協程?
- 2. 爲什麼我們需要目標C中的協議?
- 3. 爲什麼我們需要在這裏通用?協議不夠?
- 4. 爲什麼我們需要pop3或Imap協議?
- 5. 分析協調:: task()API和爲什麼我們需要這個?
- 6. 爲什麼我們需要Python中的「finally」子句?
- 7. 爲什麼我們需要.htaccess的worpdress?
- 8. DavLockDB:我們需要什麼?
- 9. 爲什麼我們需要simple_one_for_one?
- 10. 爲什麼我們需要TensorFlow tf.Graph?
- 11. 爲什麼我們需要使用prompt.start()?
- 12. 爲什麼我們需要scalaz.stream迭代?
- 13. 爲什麼我們需要WCF
- 14. 爲什麼我們需要Anaconda 2.7?
- 15. 爲什麼我們需要編寫log.isDebugEnabled?
- 16. 爲什麼我們需要ng-click?
- 17. 爲什麼我們需要Control.Lens.Reified?
- 18. 我們爲什麼需要纖維
- 19. 爲什麼我們需要org.junit.ComparisonFailure?
- 20. 爲什麼我們需要addRequestHeader方法?
- 21. 爲什麼我們需要時代?
- 22. 爲什麼我們需要ContinueWith方法?
- 23. 爲什麼我們需要Java NIO Selector?
- 24. 爲什麼我們需要使用ExitWindowsEx
- 25. 爲什麼我們需要包裝類
- 26. 爲什麼我們需要在JavaScript
- 27. 爲什麼我們需要設置SONAR_RUNNER_OPTS?
- 28. 爲什麼我們需要ioc容器
- 29. mongodb爲什麼我們需要getSisterDB
- 30. 爲什麼我們需要BeginGetResponse和BeginRead?
你應該能夠找到一個答案,使用谷歌。這裏的任何答案都可能是主觀和冗長的。這就是爲什麼這樣的問題被認爲是SO的主題。 –
我同意。我想獲得一個可以使用它的真實例子。 – Rainmaker
我認爲David Beasley(dabeaz)是Python中協程的主要支持者之一。他的博客或pycon會談可能是一個開始的好地方。 –