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

时间:2017-12-15 11:16:13

标签: python python-3.x generator

我在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]

为什么在前两种情况下没有从发生器返回值?

2 个答案:

答案 0 :(得分:5)

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

 yield n
 return

修改

在用python核心开发者提出这个问题之后,他们向我指出python docs所说的

  

在生成器函数中,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

如果你真的,真的想要。

答案 1 :(得分:2)

return无法生成iterator。使用yield然后return

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