Ray是对的,生成器在隐藏StopIteration异常的for e in gen之外使用可能会很困难
但是没有SyntaxError: 'return' with argument inside generator,至少在Python 3.5,Spyder IDE中是这样g = 1
def down_data(h):
t = 0
while h > 0:
t += .0001
h = -4.9*t**2 + 1
v = g*t
yield h, v
return 'fred' # this will be returned on StopIteration Exception
def mainly():
data_gen = down_data(1)
data = [next(data_gen)]
while data_gen:
data.append(next(data_gen))
#print(data)
return len(data)
由于StopIteration异常,main()失败,但down_data(h)返回确实在异常之后执行:mainly()
Traceback (most recent call last):
File "", line 1, in
mainly()
File "C:/Users/john/mypy/mySE_answers/tagd.py", line 48, in mainly
data.append(next(data_gen))
StopIteration: fred
如果要使用自己的next()调用到生成器的末尾,则需要显式try/exceptdef my_try():
data_gen = down_data(1)
try:
data = [next(data_gen)]
while True:
data.append(next(data_gen))
except: StopIteration
return len(data), data[-1]
my_try()
Out[104]: (4518, (-0.0002038759998519435, 0.45179999999996656))