Python:在while循环内使用生成器

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)

Ray*_*oal 5

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循环会干净地退出。