“yield”表达式和值在生成器函数内部返回

问题描述

我了解 yield 关键字的作用。但是 here 我找到了一个 yield 用法示例,这让我很沮丧:

@defer.inlineCallbacks
def doStuff():
    result = yield takesTwoSeconds()
    nextResult = yield takesTenSeconds(result * 10)
    defer.returnValue(nextResult / 10)

这是一个 Twisted 示例。这是(如作者所描述的)yield 用于异步工作或类似的东西。我决定用非异步简单代码测试它:

import random

def func():
    return random.randint(0,10)

def foo():
    while True:
        x = yield func()
        print("'x' value is",x)

f = foo()
for i in range(0,3):
    print(next(f))

我得到的输出

6
'x' value is None
0
'x' value is None
7

那么为什么我为 None 函数获取 yield/return 而作者的示例(如上所述)获取正确的值并将其插入下一个表达式?

解决方法

您在打印前返回/产生结果。

你应该像这样重写代码的一部分以在产生它之前打印值:

import random

def func():
    return random.randint(0,10)

def foo():
    while True:
        x = func()
        print("'x' value is",x)
        yield x
        
f = foo()
for i in range(0,3):
    print(next(f))

这将显示您的期望:

'x' value is 6
6
'x' value is 5
5
'x' value is 2
2

您应该记住 yield 关键字中断函数并返回结果,然后在下一次函数调用时恢复发生 yield 的位置。