gpt4 book ai didi

python - yield 扩展语法和 send 方法

转载 作者:行者123 更新时间:2023-11-28 21:53:43 25 4
gpt4 key购买 nike

我阅读了有关 yield 扩展语法的内容,因此如果我有:

def numgen(N):
for i in range(N):
n = yield i
if n:
yield n

我可以分解它:

def numgen(N):
n = yield from range(N)
if n:
yield n

但我注意到,如果我这样做,在我编写完第二个生成器之后:

g = numgen(10)
next(g)
g.send(54)

我收到以下错误:

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in gensquare
AttributeError: 'range_iterator' object has no attribute 'send'

那么,怎么样?如何将值发送到我的 numgen 生成器对象?

最佳答案

range()不是发电机,它没有 generator.send() method .

这在 yield expression documentation 中有明确记录:

When yield from <expr> is used, it treats the supplied expression as a subiterator. All values produced by that subiterator are passed directly to the caller of the current generator’s methods. Any values passed in with send() and any exceptions passed in with throw() are passed to the underlying iterator if it has the appropriate methods. If this is not the case, then send() will raise AttributeError or TypeError, while throw() will just raise the passed in exception immediately.

强调我的。

您正在尝试向 range() 发送一个值迭代器,但它没有 .send()方法。

range() 只是一个序列,不是生成器对象;你可以为它创建多个迭代器,你可以测试一个数字是否是序列的成员,询问它的长度,等等。

请注意,您的“重构”根本不是一回事;在你原来的n您通过 generator.send() 发送的任何内容都会被分配;在你的第二个版本中yield from返回 value StopIteration 的属性子迭代器结束时引发异常。如果子迭代器本身就是一个生成器,您可以通过手动提高 StopIteration(value) 来设置该值。或使用 return陈述。 yield from无法返回用 generator.send() 发送的值因为这些值将被传递给子生成器。

同样,来自文档:

When the underlying iterator is complete, the value attribute of the raised StopIteration instance becomes the value of the yield expression. It can be either set explicitly when raising StopIteration, or automatically when the sub-iterator is a generator (by returning a value from the sub-generator).

因此您的第一个版本设置为接收 N消息,同时产生 i for target 和任何发送的值都是 true-thy,而另一个将任何发送的消息传递给 degelated-to 生成器,然后只会产生 StopIteration值,如果它是 true-thy一次,在委托(delegate)给迭代器完成之后。

关于python - yield 扩展语法和 send 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25702444/

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