簡體   English   中英

`from foo()`和`for f in foo()之間的區別:yield x`

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM