Ast*_*rum 3 python generator while-loop
到目前为止,这是我的代码:
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
Run Code Online (Sandbox Code Playgroud)
我想做的是让我的main()函数在down_data(1)只要该函数保持有效的情况下输出的值。运行此不完整的代码只会设置一个无限循环,我不确定为什么。
我正在尝试将这两个功能结合起来以模拟弹跳球,但是由于屈服功能,将它们缝合在一起非常困难。我尝试在其中一个函数上创建一个main()运行while循环,但这会创建一个无限循环。这是main()我尝试过的:
def main():
data = []
while down_data(1):
data.append(down_data(1))
print(data)
Run Code Online (Sandbox Code Playgroud)
有没有可能更简单的方法来做到这一点?main()我需要的功能如下所示:
编辑:我也尝试过此,但发生相同的问题;while循环不会关闭以移至下一个i:
def main():
data = []
for i in down_data(1):
while i[0] > 0:
data.append(i[0])
continue
print(data)
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
这将生成多条输出线,但h到0 时将停止。
说明:带有的Python函数yield在调用时会生成一个生成器。每次您调用next生成器时,生成器都会运行,直到命中a yield并将产生的值返回给调用者。如果生成器在不产生任何结果的StopIteration情况下撞击其主体的末端,则会引发异常。
当您在for语句中迭代生成器时,如果生成器没有更多数据要产生,则for循环会干净地退出。