2015-12-10 7 views
-1

Быстро боролся с этим в течение некоторого времени, я хочу, чтобы переменная «результат» обновлялась после каждого цикла функции, чтобы в следующий раз, когда она пройдет через функцию, она вернет что-то новое. Я попытался присвоить результат за пределами моей функции, а затем попытался обновить его так, но не посмотрел.Обновить переменную в python после каждого цикла

def move2(msg): 
    global result 
    if result is None: 
     print "Error result variable does not have a value" 
    elif result is "rtn": 
     rtn() 
     result = "fwd" 
     return result 
    elif result is "fwd": 
     fwd() 
     result = "step" 
     return result 
    elif result is "step": 
     step() 
     result = "rtn" 
     return result 
    else: 
     print "ERROR" 

Отметить, что я довольно новичок в python и не против других подходов, если у кого-либо из вас есть предложения. Благодаря

+0

Для всех практических целей, просто передать 'result' в качестве аргумента на 'move2()'. – Evert

+1

Что такое (назначенное) использование для 'rospy.sleep (3)' после инструкции 'return', btw? Эти вызовы никогда не будут выполнены. – Evert

+0

только что добавленный в код, я забыл вывести его просто проигнорировать – Ben411916

ответ

0

Нечто похожее на это может работать:

def move2(msg, result=None): 

    if result is None: 
     print "Error result variable does not have a value" 
    elif result is "rtn": 
     rtn() 
     result = "fwd" 
     return result 
    elif result is "fwd": 
     fwd() 
     result = "step" 
     return result 
    elif result is "step": 
     step() 
     result = "rtn" 
     return result 
    else: 
     print "ERROR" 
    return result 

Первый звонок:

result = move2('Hello', 'start result') 

Следующая вызов:

result = move2('Hello again', result) 

Примечание: Вы ничего не делать с msg. Удалите его как аргумент или используйте внутри функции.

+0

Спасибо, я просто ухожу, но я попробую это, как только вернусь. Смотрите, если это поможет :) – Ben411916

+0

Вы должны сделать comaprison с '==', а не с 'is'. – Matthias

+0

@ Matthias [PEP8] (https://www.python.org/dev/peps/pep-0008/) говорит: * Сравнение с одиночными играми, такими как None, всегда должно быть сделано с помощью или нет, а не с операторами равенства. * × Комментарии могут быть отредактированы за 5 минут × Комментарии могут редактировать только 5 минут × Комментарии могут редактировать только на 5 минут –

1

Вы пытаетесь сделать свою функцию работоспособной, которая, как правило, плохая идея. Сделать это класс вместо этого, как

from itertools import cycle 

class StatefulCaller: 
    def __init__(self, state_fns, repeat=True): 
     if repeat: 
      state_fns = cycle(state_fns) 
     self.fn_iter = iter(state_fns) 
    def __call__(self): 
     return next(self.fn_iter)() 

, которые вы можете использовать, как:

rtn = lambda: "rtn" 
fwd = lambda: "fwd" 
step = lambda: "step" 

myfn = StatefulCaller([rtn, fwd, step]) 

for i in range(10): 
    print(i, myfn()) 

что приводит к

0 rtn 
1 fwd 
2 step 
3 rtn 
4 fwd 
5 step 
6 rtn 
7 fwd 
8 step 
9 rtn 
+0

Nice solution. Но, возможно, это слишком продвинулось для постановки вопроса. –

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