【问题标题】:"yield" expression and value return right inside generator function“yield”表达式和值在生成器函数内返回
【发布时间】:2021-04-07 18:58:56
【问题描述】:

我了解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

那么为什么我得到Noneyield/return 函数值,而作者的例子(上面提到的)得到了正确的值并将其插入到下一个表达式中?

【问题讨论】:

  • 好吧send 的东西。再次阅读其他问题及其答案。
  • @superbrain 做到了,但没有得到任何结果。由于作者示例中没有前后上下文。 “嗯 send 某事”好多了。
  • 是的,他们的 Twisted 示例没有显示发送,但他们的解释性示例及其使用演示可以。发送是问题的重点。此外,the documentation 会告诉您有关 nextNonesend 的信息。
  • @superbrain 对于有经验的程序员来说可能很明显,但对于新手来说却不是。但是我会把你的“成为 Python 专业人士,学习所有框架然后提出问题”标记为学习的好点,谢谢

标签: python yield


【解决方案1】:

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

您应该像这样重写代码部分以在生成值之前打印该值:

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 的地方恢复。

【讨论】:

  • 你能评论一下这个答案有什么问题吗,谢谢。
  • 他们的生成器代码完全没问题,只是他们使用不正确。看来您也没有阅读链接到的问题和答案。
  • 正如我在问题上方和下方所写的那样。我完整阅读了两次答案和问题。但是由于没有之前的上下文,所以很难理解发生了什么。当然,我得到的不是用户友好的答案,而是“他只是没有眼睛阅读,哈哈,kek”。没什么新鲜的。
  • @Malo btw,更重要的是为什么链接的作者得到了正确的结果。我假设@defer.inlineCallbacks 装饰器在他的实现中使用send 方法来“doStuff”函数。所以这是 2-side 结果移动:1)send 方法从内部 defer.inlineCallbacks 传输值到 doStuff 然后分配给 result 值,然后 2)takesTwoSeconds() 返回结果到 defer.inlineCallbacks。但我不确定 100% 的代码占主导地位 觉得不值得写正确答案的大神
  • @ArmyofEarth:是的,原始示例不同,您提供的简单示例并不能完全复制原始复杂示例。所以我友好的回答是试图让你的代码工作并避免 None 值结果......
猜你喜欢
  • 2017-12-16
  • 1970-01-01
  • 2013-06-17
  • 2015-06-07
  • 2014-07-24
  • 2021-09-05
  • 1970-01-01
相关资源
最近更新 更多