我在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]
为什么在前两种情况下没有从发生器返回值?
答案 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