到目前为止,这是我的代码:
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)
的值,只要该函数仍然有效。运行这个不完整的代码只会设置一个无限循环,我不确定为什么。
我试图结合这两个函数来模拟一个弹跳球,但事实证明,由于 yield 函数,将它们拼接在一起很困难。我已经尝试创建一个 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)
最佳答案
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 循环会干净地退出。
关于Python:在 while 循环中使用生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42017855/