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)
为什么前两种情况下发电机没有返回任何值?
因为生成器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)
如果你真的,真的很想要.