- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我阅读了有关 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 withsend()
and any exceptions passed in withthrow()
are passed to the underlying iterator if it has the appropriate methods. If this is not the case, thensend()
will raiseAttributeError
orTypeError
, whilethrow()
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 raisingStopIteration
, 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/
function* generatorFunction() { yield (yield 1)(yield 2)(yield 3)(); } var iterator = generatorFun
ECMAScript 6 应该带来生成器函数和迭代器。生成器函数(具有 function* 语法)返回一个迭代器。迭代器有一个 next 方法,当重复调用时,该方法会执行生成器函数的主体,并在每个 y
ECMAScript 6 应该引入生成器函数和迭代器。生成器函数(具有 function* 语法)返回迭代器。迭代器有一个 next 方法,当重复调用时,它会执行生成器函数的主体,在每个 yield
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 2 年前。 Improve t
自 python 2.5 以来,可以将 send()、throw()、close() 放入生成器中。在定义的生成器中,可以通过执行以下操作来“捕获”发送的数据: def gen(): whil
return的区别和 yield似乎很清楚,直到我发现还有 yield from以及将两者结合起来的可能性 return和 yield在完全相同的功能! 我对return的理解之后的一切都是 不是 执
假设我有这个部分,我正在尝试渲染 #layouts/_subheader.html.erb 当我在这样的 View 中使用这个部分时 Content For Yield
yield操作符是由编译器在底层实现的,该编译器生成一个实现符合 IEnumerable 的状态机的类。和 IEnumerator . 给定一个罗斯林 MethodDeclarationSyntax
$item) echo "$index $item" . PHP_EOL; } resolve(generator1()); echo PHP_EOL; resolve(gener
这个问题在这里已经有了答案: Why converting list to set is faster than converting generator to set? (1 个回答) List c
是否有一个单行代码来获取生成器并生成该生成器中的所有元素?例如: def Yearly(year): yield YEARLY_HEADER for month in range(1, 13)
刚发现yield from 结构,在我看来这有点像反向的yield,而不是从生成器中获取对象,您插入/将对象发送到生成器。喜欢: def foo(): while True:
考虑以下代码: def mygen(): yield (yield 1) a = mygen() print(next(a)) print(next(a)) 输出产量: 1 None 解释器
Guido van Rossum,在 2014 年关于 Tulip/Asyncio 的演讲中 shows the slide : Tasks vs coroutines Compare: res =
谁能帮我理解“yield self”和“yield”的区别? class YieldFirstLast attr_accessor :first, :last def initiali
这是我目前使用 Laravel 5 实现的 Open Graph 标签: app.blade.php @yield('title') page.blade.php @extends('app'
在 Tornado 中,我们通常会编写如下代码来异步调用函数: class MainHandler(tornado.web.RequestHandler): @tornado.gen.coro
本文整理了Java中aQute.bnd.indexer.analyzers.Yield.yield()方法的一些代码示例,展示了Yield.yield()的具体用法。这些代码示例主要来源于Github
我们有超过 100 个共同基金的每日返回,我们希望将这些返回转换为月度返回。每月返回不应是每个月的平均值,而是每个月末的资金返回。基金在不同的时间点开始和结束,它们需要自己保留(不是每个月的共同基金
如何实现 C# yield return使用 Scala 延续?我希望能够编写 Scala Iterator s 风格相同。在 this Scala news post 的评论中有刺伤,但它不起作用(
我是一名优秀的程序员,十分优秀!