gpt4 book ai didi

python - 为什么这个协程永远生成 None 值?

转载 作者:行者123 更新时间:2023-11-28 21:54:03 24 4
gpt4 key购买 nike

我有一个简单的协程

def id():
while True:
x = yield
yield x

我可以用它来创建一个生成器并用 next 启动它

gen = id()
next(gen)

for x in gen:
print(x)

这将永远打印None。我的直觉是,来自 id 的生成器只会在一个值被发送给它时yield一个值,但在这种情况下它产生None 值本身。

有人可以向我解释这种行为吗? x = yield 语句是否将 x 默认为 None

最佳答案

正如其他人所指出的,调用 next(gen) 等同于调用 gen.send(None)。如果您查看 C code for generator objects 就可以看到这一点:

PyDoc_STRVAR(send_doc,
"send(arg) -> send 'arg' into generator,\n\
return next yielded value or raise StopIteration.");

PyObject *
_PyGen_Send(PyGenObject *gen, PyObject *arg)
{
return gen_send_ex(gen, arg, 0);
}
...
static PyObject *
gen_iternext(PyGenObject *gen)
{
return gen_send_ex(gen, NULL, 0);
}

如您所见,iternext(当您调用 next(generator_object) 时被调用的)调用与 generator_object.send 完全相同的方法,只不过它总是传入一个NULL对象。考虑一下您的 for x in gen 循环基本上等同于这样做:

iterable = iter(gen):
while True:
try:
x = next(iterable)
except StopIteration:
break
print(x)

然后您就知道问题出在哪里了。

重要的是要认识到协程和生成器实际上是完全独立的概念,即使它们都是使用 yield 关键字实现的。一般来说,您不应该迭代协程,并且通常您不需要/不想将东西发送到生成器中。我强烈推荐 David Beazley 的 PyCon coroutine tutorial有关此内容和一般协程的更多信息。

关于python - 为什么这个协程永远生成 None 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24856451/

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