2012-06-23 4 views
0

Я не знаю, является ли это простым вопросом или невозможным или что-то еще, но я ничего не мог найти на нем, поэтому я решил, что спрошу его.Возвращаемые значения из цикла while в python

Возможно ли вернуть значения из цикла 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) 

EDIT:

Или, возможно, сопрограмма.

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

Я тоже собирался ответить генератором, но я был в замешательстве относительно намерений OPs. Он сказал, что цикл 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, вам нужно преобразовать его в функцию и использовать разницу во времени между двумя вызовами функций, вы можете выполнять вычисления, которые хотите, только когда вы вызываете функцию, а не все время цикла.

+0

Я не имею дело с функцией, я имею дело с вводом из нерегулярного источника, как это делают все полезные программы. –

+0

Ну, учитывая тот факт, что вы хотите, чтобы действие нарушило цикл while, возьмите значения, которые он имеет в тот момент времени, и дайте им продолжить свою работу, как есть. Что я имел в виду, что вместо цикла while вы можете вычислить эти значения из цикла, только в моменты, когда вы хотите получить эти значения. –

Смежные вопросы