它用于将值发送到刚产生的生成器中。这是一个人为的(无用的)解释性示例:
>>> def double_inputs():... while True:... x = yield... yield x * 2...>>> gen = double_inputs()>>> next(gen) # run up to the first yield>>> gen.send(10) # goes into 'x' variable20>>> next(gen) # run up to the next yield>>> gen.send(6) # goes into 'x' again12>>> next(gen) # run up to the next yield>>> gen.send(94.3) # goes into 'x' again188.5999999999999
您不能只通过做到这一点
yield。
至于为什么有用,我见过的最好的用例之一是Twisted的
@defer.inlineCallbacks。本质上,它允许您编写如下函数:
@defer.inlineCallbacksdef doStuff(): result = yield takesTwoSeconds() nextResult = yield takesTenSeconds(result * 10) defer.returnValue(nextResult / 10)
发生的情况是
takesTwoSeconds()返回a
Deferred,这是一个值,该值保证一个值将在以后计算。Twisted可以在另一个线程中运行计算。计算完成后,将其传递给延迟的对象,然后将值发送回
doStuff()函数。因此
doStuff(),除了可以执行各种计算和回调等 *** 作外,最终看起来或多或少都像普通的过程函数。此功能之前的替代方法是:
def doStuff(): returnDeferred = defer.Deferred() def gotNextResult(nextResult): returnDeferred.callback(nextResult / 10) def gotResult(result): takesTenSeconds(result * 10).addCallback(gotNextResult) takesTwoSeconds().addCallback(gotResult) return returnDeferred
这更加令人费解和笨拙。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)