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

时间:2017-02-03 06:10:56

标签: 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)的值,只要该函数保持有效。运行这个不完整的代码只会设置一个无限循环,我不知道为什么。

我试图将这两个功能结合起来模拟一个弹跳球,但由于屈服功能,将它们拼接在一起已经证明是困难的。我尝试在其中一个函数上创建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)

2 个答案:

答案 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))
相关问题