[英]Difference between `yield from foo()` and `for x in foo(): yield x`
在Python中,大多數收益率的例子都說明了這一點
yield from foo()
類似於
for x in foo(): yield x
另一方面,它似乎並不完全相同,並且有一些魔法投入。我覺得使用一個我不理解的魔法函數有點不安。 我必須知道什么是yield from
的魔力,以避免陷入魔法做我不期望的事情? 我應該注意到魔法提供了哪些優勢?
當foo()
返回一個常規的iterable時,兩者是等價的。 當foo()
也是一個生成器時,'魔術'就會發揮作用。 那時, yield from foo()
和yield from foo()
for x in foo(): yield x
case在物質上有所不同。
也可以使用generator.send()
方法 發送數據。 當你使用for
循環時, yield x
表達式'接收'發送的數據; foo()
生成器永遠不會看到這個。 但是當你使用yield from
發送的數據直接轉到任何yield
表達委派到發電機目前已暫停在。 換句話說, yield from
傳遞數據的傳遞yield from
因此委托生成器可以接收它。
您還可以使用generator.throw()
; 在生成器中引發異常。 對於for
循環的情況,從yield x
行引發異常,同時再次傳遞異常的yield from
; 異常是在foo()
引發的。
總之,這意味着yield from
本質上在委托迭代的持續時間內替換當前生成器。
委托生成器也可以與父生成器進行通信,完成后,將引發的StopIteration
異常的.value
屬性作為表達式的yield from
的值返回。 您可以使用delegated-to foo()
生成器中的return <expression>
設置該異常的值,也可以顯式使用raise StopIteration(<expression>)
。
使用PEP 380: 用於委托給子生成器的語法將yield from
引入語言中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.