为什么我的发电机没有返回任何值?

pla*_*etp 3 python generator python-3.x

我在Python生成器中遇到了一些令人惊讶的行为:

>>> def f(n):
...     if n < 2:
...         return [n]
...     for i in range(n):
...         yield i * 2
... 
>>> list(f(0))
[]
>>> list(f(1))
[]
>>> list(f(2))
[0, 2]
Run Code Online (Sandbox Code Playgroud)

为什么前两种情况下发电机没有返回任何值?

FHT*_*ell 5

因为生成器return语句不返回任何内容,所以它们结束执行(python知道这是一个生成器,因为它至少包含一个yield语句).而不是return [n]

 yield n
 return
Run Code Online (Sandbox Code Playgroud)

编辑

在使用python核心开发人员提出这个问题之后,他们向我指出了它所说的python文档

在生成器函数中,return语句指示生成器已完成并将导致引发StopIteration.返回值(如果有)用作构造StopIteration的参数,并成为StopIteration.value属性.

所以你可以做到

def f(n):
    if n < 2:
         return [n]
    for i in range(n):
         yield i * 2

g = f(1)
res = []
while True:
    try:
         res.append(next(g))
    except StopIteration as e:
         if e.value is not None:
              res = e.value
         break
Run Code Online (Sandbox Code Playgroud)

如果你真的,真的很想要.

  • 公平地说,我认为这是无证行为.为什么在生成器中返回n`不是`SyntaxError`超出我的范围.这个[PEP](https://www.python.org/dev/peps/pep-0255/#specification-return)没有描述关于`return n`的任何内容.编辑:实际上,它位于[底部](https://www.python.org/dev/peps/pep-0255/#then-why-not-allow-an-expression-on-return-too).尽管如此,它仍然是不允许的,而不是它无声地失败. (3认同)