是什么抛出StopIteration异常和发电机return语句之间的区别?(What is the

2019-07-17 21:51发布

我很好奇的使用之间的区别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

我猜的更“Python化”的方式来做到这一点是第二种方式(请纠正我,如果我错了),但据我可以看到两种方式筹集StopIteration异常。

Answer 1:

有没有必要明确提高StopIteration作为这就是裸return声明确实为发电机功能-所以是的,他们是相同的。 但是,没有,只是用return是更Python。

来源: http://docs.python.org/2/reference/simple_stmts.html#the-return-statement (有效期到Python 3.2)

在发电机的功能,return语句不允许包括expression_list。 在这种情况下,裸回表明发电机完成,将导致StopIteration异常得到提升。

或者,正如@Bakuriu指出 - 发电机的语义已为Python 3.3微微一变,所以下面是比较合适的:

在生成函数,返回语句表明发电机完成,将导致StopIteration异常得到提升。 返回的值(如果有的话)被用作一个参数来构造StopIteration异常并成为StopIteration.value属性。



Answer 2:

随着2014年年底的return是正确的, raise StopIteration结束发电机是折旧时间表。 见PEP 479的全部细节。

抽象

这PEP提出了改变发电机:当StopIteration是发电机内升起,它会被替换RuntimeError 。 (更准确地说,该当异常即将气泡离开发生器的堆栈帧的发生的情况。)由于变化是向后兼容,特征是使用最初引入__future__语句。

验收

这是PEP 11月22日接受了BDFL ...

合理

发电机和StopIteration异常的相互作用是目前有些令人吃惊,并且可以隐藏不明显的错误。 意外的异常不应导致微妙的变化行为,但应引起嘈杂和易于调试回溯。 目前,意外地StopIteration异常升高内部发电机功能将被解释为通过循环构造驱动发电机的迭代结束。

...



Answer 3:

这是真的,他们是等价的,除了一个是可读的,而另一种是模糊的。 这可以追溯到发电机的第一个版本(PEP 255,在“规范:返回”),以及随后的增强(如协程)不改变这一点。 3.3的yield from (PEP 380)延伸,要return <expr>作为语法糖raise StopIteration(<expr>)但不改变的含义return;



文章来源: What is the difference between raise StopIteration and a return statement in generators?