首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Coroutine的奇怪行为

Coroutine的奇怪行为
EN

Stack Overflow用户
提问于 2012-08-06 08:38:51
回答 2查看 550关注 0票数 4

我正在学习科鲁丁,但奇怪的是我不明白.这是消息来源

代码语言:javascript
复制
@coroutine
def printer():
    tmp=(yield)
    print tmp

def sender(coru):
    coru.send("hello")
    print "I'm sender"

if __name__=="__main__":
    coru=printer()
    sender(coru)
    print "I'm master"

显示

你好 StopItertationError @ coru.send("hello")

同时,

代码语言:javascript
复制
@coroutine
def printer():
          while 1:
               tmp=(yield)
               print tmp

def sender(coru):
    coru.send("hello")
    print "I'm sender"

if __name__=="__main__":
    coru=printer()
    sender(coru)
    print "I'm master"

显示

你好 我是发送者 我是师父

正确无误。

所以我想知道

  1. 为什么coroutine总是与循环一起工作,以及为什么第一个例子引起了错误
  2. 我在3.3版上听说过“从语法中获得收益”。这对第一个成功有帮助吗?
  3. 我知道每个coroutine函数的工作原理与子程序不同。 但是,我认为,在打印机功能结束后,程序应该终止而不返回发件人。 但确实如此。这不意味着发件人优于打印机吗?那么子例程和协同线的区别是什么呢?

谢谢你的阅读,如果你点亮我,我真的很感激:)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-06 08:57:37

当生成器(如printer)结束时,它会引发StopIteration异常。

当Python执行

代码语言:javascript
复制
coru.send("hello")

它跳到

代码语言:javascript
复制
tmp = (yield)

并向tmp发出“你好”。然后执行下一行:

代码语言:javascript
复制
print tmp

然后生成器结束,从而引发StopIteration异常。

另一方面,如果不允许printer结束(通过使用while 1循环),则不会引发StopIteration异常。相反,执行(在printer中)一直持续到到达下一个yield表达式为止:

代码语言:javascript
复制
tmp = (yield)

send方法返回该yield表达式的值(在本例中为None)。此时,Python再次返回到sender函数,然后执行

代码语言:javascript
复制
print "I'm sender"

yield from语法的目的是使将生成器(用于与sendthrow一起使用)重构为子生成器变得更容易。请参阅PEP380Python3的新特点是什么?.

它不会改变StopIteration行为。

票数 5
EN

Stack Overflow用户

发布于 2012-08-06 09:00:25

这是一个非常好的合作介绍:

http://www.dabeaz.com/coroutines/

特别是,您可以查看:

http://www.dabeaz.com/coroutines/grep.py

和(exemple @coroutine ):

http://www.dabeaz.com/coroutines/coroutine.py

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11824954

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档