簡體   English   中英

生成器中的raise StopIteration和return語句有什么區別?

[英]What is the difference between raise StopIteration and a return statement in generators?

我很好奇在生成器中使用raise StopIterationreturn語句之間的區別。

例如,這兩個功能之間有什么區別嗎?

def my_generator0(n):
    for i in range(n):
        yield i
        if i >= 5:
            return

def my_generator1(n):
    for i in range(n):
        yield i
        if i >= 5:
            raise StopIteration

我猜想第二種方法是更“ pythonic”的方法(如果我錯了,請糾正我),但是據我所知,這兩種方法都會引發StopIteration異常。

不需要顯式地提高StopIteration因為這就是生成器函數的簡單return語句-因此,它們是相同的。 但是不,僅使用return更像Pythonic。

來自: http : //docs.python.org/2/reference/simple_stmts.html#the-return-statement (對Python 3.2有效)

在生成器函數中,return語句不允許包含expression_list。 在這種情況下,簡單的返回指示生成器已完成,並將導致StopIteration升高。

或就像@Bakuriu指出的那樣-生成器的語義對於Python 3.3略有變化,因此以下更合適:

在生成器函數中,return語句指示生成器已完成,並將引起StopIteration升高。 返回的值(如果有)用作構造StopIteration的參數,並成為StopIteration.value屬性。

截至2014年底, return是正確的,並且raise StopIteration終止折舊計划的價格raise StopIteration來終止生成器。 有關完整詳細信息,請參見PEP 479

抽象

該PEP建議對生成器進行更改:在生成器內部引發StopIteration時,將其替換為RuntimeError (更確切地說,當異常將在生成器的堆棧框架中冒泡時會發生這種情況。)由於更改是向后不兼容的,因此最初使用__future__語句引入了該功能。

驗收

該PEP在11月22日被BDFL接受...

基本原理

生成器和StopIteration的交互當前有點令人驚訝,並且可以隱藏模糊的錯誤。 意外的異常不應導致行為的微妙改變,而應引起嘈雜且易於調試的回溯。 當前,生成器函數內部意外引發的StopIteration將被驅動生成器的循環構造解釋為迭代結束。

是的,它們是等效的,除了一個是可讀的而另一個是晦澀的。 這可以追溯到生成器的第一個版本(PEP 255,在“規格:返回”下),並且后續的增強功能(例如協程)也不會改變。 3.3(PEP 380)的yield from擴展了它的return <expr>作為raise StopIteration(<expr>)語法糖來return <expr> ,但這並沒有改變return;的含義return;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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