2012-06-23 233 views
0

我不知道这是一个简单的问题还是不可能的,但是我找不到任何东西,所以我想我会问这个问题。从python的while循环中返回值

当循环仍在运行时,是否可以从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循环就会在后台运行,但它只会在被询问时给出结果,或类似的东西。

+2

你需要给出关于你想要做什么的更多细节,最好是一些示例代码。这听起来像发电机可能会帮助你,但很难从你的描述中知道。 – BrenBarn

+0

While循环是否需要同时保持运行操作?生成器可以暂停并返回一个值,然后在请求下一个值时恢复其停止的位置。但它在值之间停顿。 – jdi

+0

它可能会暂停,我正在考虑这样做,但如果可能的话,我宁愿不暂停while循环。 –

回答

4

创建一个发电机代替。

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) 
+0

我正准备用发电机来回答,但我对OP的意图感到困惑。他说,while循环应该继续运行,所以我认为必须有其他动作进入功能。它的一部分听起来像一个线程或只是一个no_wait队列。 – jdi

+0

也许是一个协程。 –

+0

jdi实际上是对的,我需要的东西不仅仅是返回while循环吐出的所有东西。有没有一种方法来实现收益? –

3

你正在寻找的是yield

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


for x in func(): 
    print(x): 

发生器还可以这样写列表解析:

看看这个问题:

What does the "yield" keyword do in Python?

+0

这将工作在while循环之外吗?它并不真的帮助我保持它。 –

+0

你确切地知道你想要返回什么吗?多久,以什么格式? – beoliver

+0

我想返回一个元组,可变时间跨度,半秒到一秒之间,更新发生在不规则的时间间隔。格式不重要。 –

0

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

我可能会想到试图找到相对于时间的位置,速度和加速度方程。

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

+0

我不是在处理函数,而是在处理来自不规则源的输入,就像所有有用的程序一样。 –

+0

好吧,考虑到你想要一个行为来打破while循环,拿出它在那个时刻的值,并让它继续它的工作。 我所指的是,代替while循环运行,你可以从循环计算出你想要的值,只有在你想要这个值的时刻。 –