到目前为止,这是我的代码:
def down_data(h):
t = 0
while h > 0:
t += .0001
h = -4.9*t**2 + 1
v = g*t
yield h, v
return False
def up_data(v):
t = 0
h = 0
vel = v
while h < 1:
t += .0001
h = -4.9*t**2 - v*t
vel = -9.8*t - v
yield h, vel, t
我尝试做的是让我的main()
函数输出down_data(1)
的值,只要该函数保持有效。运行这个不完整的代码只会设置一个无限循环,我不知道为什么。
我试图将这两个功能结合起来模拟一个弹跳球,但由于屈服功能,将它们拼接在一起已经证明是困难的。我尝试在其中一个函数上创建main()
并运行while
循环,但这会创建一个无限循环。这是我尝试的main()
:
def main():
data = []
while down_data(1):
data.append(down_data(1))
print(data)
是否有更简单的方法可以做到这一点?我之后的main()
函数将是这样的:
编辑:我也试过这个,但同样的问题发生了; while循环不会关闭以移动到下一个i
:
def main():
data = []
for i in down_data(1):
while i[0] > 0:
data.append(i[0])
continue
print(data)
答案 0 :(得分:4)
Python中的生成器函数与您尝试使用它们的方式略有不同。
您应该只拨打down_data(1)
一次。
试试这个:
g = 9.8
def down_data(h):
t = 0
while h > 0:
t += .0001
h = -4.9*t**2 + 1
v = g*t
yield h, v
for h, v in down_data(1):
print h, v
这将生成许多输出行,但在h
达到0时将停止。
说明:调用时带有yield
的Python函数会生成一个生成器。每次在生成器上调用next
时,生成器都会运行,直到它到达yield
并且生成的值返回给调用者。如果生成器击中它的主体末端而没有产生任何结果,则会引发StopIteration
异常。
当你在for
语句中迭代一个生成器时,当生成器没有更多的数据要生成时,for循环会干净地退出。
答案 1 :(得分:1)
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异常,major()失败,但是在异常之后执行了down_data(h)返回:
mainly()
Traceback (most recent call last):
File "<ipython-input-103-015c95441865>", line 1, in <module>
mainly()
File "C:/Users/john/mypy/mySE_answers/tagd.py", line 48, in mainly
data.append(next(data_gen))
StopIteration: fred
如果您使用自己的next()调用到达生成器的末尾,则需要显式try / except
def 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))