【问题标题】:Why does the yield expression collapse?为什么 yield 表达式会崩溃?
【发布时间】:2019-02-14 06:47:27
【问题描述】:

我搞砸了,注意到下面的代码产生了一次值,而我期望它返回一个生成器对象。

def f():
    yield (yield 1) 
f().next() # returns 1

def g():
    yield (yield (yield 1) 
g().next() # returns 1

我的问题是yield 表达式中的value 是什么,以及如果yield 表达式崩溃,为什么我们允许嵌套yield 表达式?

【问题讨论】:

标签: python yield


【解决方案1】:

恢复后yield expression的值取决于恢复执行的方法。如果使用__next__()(通常通过fornext() 内置函数),则结果为None。否则,如果使用send(),则结果将是传入该方法的值。

所以这个:

def f():
    yield (yield 1) 

相当于这个:

def f():
    x = yield 1
    yield x

在这种情况下(因为您没有使用generator.send())等价于:

def f():
    yield 1
    yield None

您的代码仅查看生成器生成的第一项。如果您改为调用 list() 来消耗整个序列,您会看到我的描述:

def f():
    yield (yield 1)

def g():
    yield (yield (yield 1)) 


print(list(f()))
print(list(g()))

输出:

$ python3 yield.py 
[1, None]
[1, None, None]

如果我们手动迭代生成器(如您所见),但 .send() 它的值,那么您可以看到 yield “返回”此值:

gen = f()
print(next(gen))
print(gen.send(42))

输出:

$ python3 yield_manual.py 
1
42

【讨论】:

  • yield 返回None 这不是真的。相反,它会将您send 的值返回给生成器。 (并且简单地迭代生成器就像调用send(None)。)
  • 谢谢@Aran-Fey,我一直在努力寻找文档的相关部分来详细说明。
猜你喜欢
  • 2012-04-20
  • 1970-01-01
  • 1970-01-01
  • 2013-01-31
  • 2014-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多