问题描述
我了解 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 的位置。