gpt4 book ai didi

python - 协程的奇怪行为

转载 作者:太空狗 更新时间:2023-10-30 02:22:13 26 4
gpt4 key购买 nike

我正在学习协程,但它的工作方式很奇怪,我无法理解...这是来源

@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"

表演

hello

StopItertationError @ coru.send("hello")

同时,

@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"

表演

hello

I'm sender

I'm master

正确。

所以我想知道

  1. 为什么协程总是与循环一起工作以及为什么第一个示例出现错误

  2. 我在 3.3 版中听说过“yield from”语法。这有助于第一个成功吗?

  3. 我知道每个协程函数的工作方式都与子例程不同。

    但是,我认为,在 Printer 函数结束后,程序应该终止而不返回 Sender。

    但确实如此。这不是意味着发件人优于打印机吗?那么子程序和协程有什么区别。

感谢您的阅读,如果您能启发我,我将不胜感激:)

最佳答案

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

当Python执行时

coru.send("hello")

它跳转到

tmp = (yield)

并将“hello”分配给tmp。然后它执行下一行:

print tmp

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

另一方面,如果您不允许 printer 结束(通过使用 while 1 循环),则 StopIteration 异常从未被提出。相反,执行(在 printer 中)会继续,直到到达下一个 yield 表达式:

tmp = (yield)

send 方法返回 yield 表达式的值(在本例中为 None)。至此,Python又一次回到了sender函数,next执行

print "I'm sender"

yield from 语法的目的是使重构生成器(旨在与 sendthrow 一起使用)变得更容易子发电机。 See PEP380What's New in Python3 .

它不会改变 StopIteration 行为。

关于python - 协程的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11824954/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com