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

标签 python while-loop generator

到目前为止,这是我的代码:

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/

相关文章:

java - 我应该如何正确地将Java加密算法移植到Python?

java - 使用 While 循环添加到数组列表

python - 如果字符串有重叠区域,则连接它们

python - 不可排序的类型 : str() > float () in when filtering generator expression

python - 循环遍历生成器的 Cythonizing for 循环

python - 神经网络似乎在每次执行时都停留在单个输出上

python - 我怎样才能对每 n 个数组值求和并将结果放入一个新数组中?

c++ - 为什么不是 while ((i <= 9) && square == pow(i, 2)) { cout << i << square;我++;按照我的意愿打印出来?

javascript - yield 关键字如何在 JavaScript ES6 生成器中真正起作用?

python - 在Python中导入RTree时如何修复 "ImportError: No module named index"?