【问题标题】:Returning values from inside a while loop in python从python中的while循环内部返回值
【发布时间】:2012-06-23 19:49:17
【问题描述】:

我不知道这是一个简单的问题还是不可能的问题,但我在上面找不到任何东西,所以我想我会问它。

是否可以在循环仍在运行时从 while 循环返回值?基本上我想要做的是让一个向量在一个while循环中不断更新,但能够在不停止while循环的情况下在被询问时返回值。这可能吗?我只需要分解程序并将while循环放在一个单独的线程中,还是可以在一个函数中完成?

另外,我更喜欢一种计算量不高的方法(显然),并且与速率限制的 while 循环兼容,因为这个方法肯定是速率限制的。

同样,如果这是一个愚蠢的问题,请告诉我,我将删除它,但我无法找到相关文档。

我正在尝试使用以下代码实现此功能:

def update(self, x_motion, y_motion, z_motion):
        self.x_pos += self.x_veloc
        self.y_pos += self.y_veloc
        self.z_pos += self.z_veloc
        self.x_veloc += self.x_accel
        self.y_veloc += self.y_accel
        self.z_veloc += self.z_accel
        self.x_accel = x_motion[2]
        self.y_accel = y_motion[2]
        self.z_accel = z_motion[2]
while True:
self.update(x_motion, y_motion, z_motion)

print vector.x_accel

至少是这样的。重要的是这些在 while 循环之外返回,以便 while 循环在后台运行,但它只在被询问时给出结果,或者类似的东西。

【问题讨论】:

  • 您需要提供更多关于您正在尝试做的事情的细节,最好是一些示例代码。听起来生成器可以帮助您,但从您的描述中很难判断。
  • while 循环是否需要保持同时运行的操作?生成器可以暂停并返回一个值,然后在请求下一个值时从中断处恢复。但它确实在值之间暂停。
  • 它可以暂停,我正在考虑这样做,但如果可能的话,我真的宁愿不暂停 while 循环。

标签: python while-loop real-time


【解决方案1】:

改为创建一个生成器。

def triangle():
  res = 0
  inc = 1
  while True:
    res += inc
    inc += 1
    yield res

t = triangle()
print next(t)
print next(t)
print next(t)
print next(t)

编辑:

或者也许是协程。

def summer():
  res = 0
  inc = 0
  while True:
    res += inc
    inc = (yield res)

s = summer()
print s.send(None)
print s.send(3)
print s.send(5)
print s.send(2)
print s.send(4)

【讨论】:

  • 我也打算用生成器来回答,但我对 OP 的意图感到困惑。他说while循环应该继续运行,所以我认为这些函数必须有其他动作。它的一部分听起来像一个线程或只是一个 no_wait 队列。
  • jdi 实际上是对的,我需要的东西不只是返回由 while 循环吐出的所有内容。有没有办法用 yield 来实现它?
【解决方案2】:

你要找的是yield:

def func():
    while True:
        yield "hello"


for x in func():
    print(x)

生成器也可以写成列表推导式:

看看这个问题:

What does the "yield" keyword do?

【讨论】:

  • 这可以在while循环之外工作吗?把它藏在里面对我没有帮助。
  • 你知道你要返回什么吗?多久一次,以什么格式?
  • 我想返回一个元组,时间跨度可变,介于半秒到一秒之间,更新以不规则的时间间隔发生。格式无关紧要。
  • 你可以做的是在循环中添加函数/方法,可以用你的元组做一些事情
  • 您从根本上误解了我的问题。我想在循环之外做一些事情,这样这两个过程就不需要联系起来了。我正在处理两个异步进程,我可能会使用线程。
【解决方案3】:

如果我理解你和你想做的代码。

我可能会考虑尝试找到位置、速度和加速度相对于时间的方程。

所以你不需要保持while循环运行,你需要将它转换为一个函数,并使用2个函数调用之间的时间差,你可以执行你想要的计算,只有当你调用函数,而不是让 while 循环一直运行。

【讨论】:

  • 我不是在处理函数,而是在处理来自不规则来源的输入,就像所有有用的程序一样。
  • 好吧,考虑到你想要一个动作来打破 while 循环,取它在那个时刻的值,让它继续它的工作。我指的是,不是运行 while 循环,而是可以从循环中计算出你想要的值,只有在你想要这个值的时刻。
猜你喜欢
  • 1970-01-01
  • 2015-02-24
  • 1970-01-01
  • 2016-07-12
  • 2014-12-04
  • 2017-11-09
  • 1970-01-01
  • 1970-01-01
  • 2016-05-29
相关资源
最近更新 更多