2017-02-10 122 views
2

我试图学习Python,通过学习Python书阅读,并遇到在生成器中使用return语句的部分,我发现很难将它包裹在它周围。在生成器中使用return语句

它说,虽然在生成器函数中使用return语句,但它会产生一个StopIteration异常以提高效率,从而有效地结束迭代。如果return声明实际上是使该函数返回某些内容,则会破坏迭代协议。

下面的代码示例

def geometric_progression(a, q): 
    k = 0 
    while True: 
     result = a * q**k 
     if result <= 100000: 
      yield result 
     else: 
      return 
     k += 1 

for n in geometric_progression(2,5): 
    print(n) 

谁能请解释它,以及如何在其他任何情况下继续使用它。提供额外的例子,如果你可以。

+0

只要把它看成是尽早停止迭代。在这种情况下,条件'result <= 100000'使发生器停止产生大于'100000'的结果,这是一种人为的做法,因为你可以在<= 100000'时使while循环达到相同的效果效果(对'result'有一些适当的初始值)。老实说,我不认为它使用得太多,但有些情况下,你想立即停止迭代,可能会派上用场。 –

+0

[在Python 3.3中与yield一起返回生成器的可能的副本](http://stackoverflow.com/questions/16780002/return-in-generator-together-with-yield-in-python-3-3) –

+0

@ Chris_Rands - FWIW,这与这个问题略有不同。这就是具体问什么“返回值”的意思,而这是问裸回归(因此也适用于python2.x)。我同意 - 他们很相似,我可以理解,如果这样做最终会被封闭为: - ) – mgilson

回答

3

return在发生器中只是语法糖raise StopIteration。在python 3.3(?)+中,你也可以返回一个值(return value == raise StopIteration(value))。至于你为什么要把它放在那里,明显提高StopIteration意味着发电机将停止产出物品。换句话说,发生器完成执行 - 就像return表示函数执行结束。类似地,任何迭代生成器的东西(例如for循环)都会明白它应该停止尝试从生成器中获取值。

已添加return value位以支持使用协同例程IIRC的一些工作流程。这是一个非常先进的功能,但在各种异步上下文中发现了很多有用的功能。

+0

因此,这里的'return'语句意味着当它达到需要的特定值时从迭代中突破? – phawk

+0

@phawk - 是的。非常好。 – mgilson