解释函数内的这一行是什么意思
some_variable = yield some_function()
如果我理解正确,yield some_function()在这种情况下,它会将结果发送到生成器,然后将结果写入变量,并在此分配后继续执行代码。
如果我理解正确,那么问题。赋值是在当前结果返回处理后发生,还是当前函数先执行到最后,再将结果返回给生成器?
解释函数内的这一行是什么意思
some_variable = yield some_function()
如果我理解正确,yield some_function()在这种情况下,它会将结果发送到生成器,然后将结果写入变量,并在此分配后继续执行代码。
如果我理解正确,那么问题。赋值是在当前结果返回处理后发生,还是当前函数先执行到最后,再将结果返回给生成器?
如果你创建了一个生成器
g = gen(),那么它自己什么也不做,直到它从外部被提升next(g)。next(g)相当于g.send(None)。g.send(y)允许您将值传递给生成器:由于它
g = gen()不会自行推进生成器,因此有必要调用next(g)以使代码与x = yield '.'. 由于函数开头没有yield,所以第一次调用总是等价于g.send(None). 在后续调用中传递的值y已经分配给x:在这种情况下,生成器
'.'不断生成。可以看出第一次调用
g.send(None)没有到达x(否则我们以后会收到一个TypeError,因为None * None)。也就是说,传递给的值g.send()从yield生成器所在的位置返回,然后代码前进到下一个yield,其参数作为结果返回并分配给z.现在您可以解释会发生什么:
一步步:
创建一个生成器:
生成器内部的代码不会被执行。
我们将代码推进到第一个产量,它被称为
some_function(),我们得到 的值some_function():some_variable最后尚未分配的名称g.send()以下调用
g.send(1)分配1一个some_variable名称并在代码离开生成器时引发 StopIteration:这些生成器,或有时称为协程,可用于在单个线程中交错执行多个函数。一个实际的例子,你可以使用 装饰器
NREQUESTS对并发请求执行网络请求:NCONCURRENTtwisted.internet.defer.inlineCallbacks一种类似但略有不同的机制(基于
yield from而不是onyield)适用于 asyncio 协程。这是一个粗略的解释:
value它,你只需要value = next(g).result的东西。YOU_RESULTvaluevalue = g.send(YOU_RESULT)另请注意-
g.send(YOU_RESULT)需要初始化。这整件事对于https://ru.wikipedia.org/wiki/ Coroutine来说都是必要的。仅此而已。如果不清楚,请提出问题gnext(g)