2014-09-19 3 views
-1
def left(q): 
    return q[0] 

def op(q): 
    return q[1] 

def right(q): 
    return q[2] 

def isInside(v, q): 
    if isinstance(q, list): 
     return isInside(v, (left(q))) or isInside(v, (right(q))) 
    else:  
     return v == q 

def solve(v, q): 
    if isInside(v, left(q)):   
     q3 = solving(v, q) 
     print "**" # debug line 
     print q3 # debug line. this prints "None" to the terminal."  
     return q3 
    else: 
     raise RuntimeException, "The variable does not exist in the expression." 

def solving(v, q): 
    print q # debug line 
    if v == left(q): 
     print "*" # debug line 
     print q # debug line. prints the solved expression to the terminal. 
     return q 
    else: 
     if op(left(q)) == '+': 
      solvingAdd(v, q) 
     else: 
      return "v not on left of q" 

def solvingAdd(v, q): 
    print "solvingAdd" 
    if isInside(v, left(left(q))): 
     q2 = [left(left(q)), op(q), [right(q), '-', right(left(q))]] 
     return solving(v, q2)  
    elif isInside(v, right(left(q))): 
     q2 = [right(left(q)), op(q), [right(q), '-', left(left(q))]] 
     return solving (v, q2) 

Выше - это запущенная, но урезанная версия моей программы, которая дублирует мою проблему. Если вы выполните этот файл в python и дайте ему команду print solve ('x', [['x', '+', 'b'], '=', 'c']), вы увидите возвращаемые Nones, которые дают мне неприятности.Python возвращает список, но переменной, но переменная имеет значение null

То, что эти функции должны делать ...

Функция влево возвращает переменную в первом элементе д.

Функция op возвращает оператор во втором элементе q.

Функция справа возвращает переменную в третьем элементе q.

Функция isInside увидит, что v существует в левой части q.

Функция решить испытает, если v находится на левой стороне д, что она есть, поэтому он будет вызывать решения для выполнения операций, необходимых для получения V только на левой стороне

Функция решение проверяет, является ли v одной левой частью q. Если это так, он должен вернуть q для решения, которое должно возвращать q на вход терминала печати. Если это не так, он будет работать по уравнению, чтобы получить v один слева.

Функция solveAdd выполняет операции и возвращает результат для решения.

  • д список типов данных в виде [ 'someVariable1, 'someOperator', 'someVariable2']

Что вопрос ...

Кажется, что мой переменная q теряет свое присвоенное значение при вводе показанного оператора if. Я приведу пример, чтобы показать, почему я подозреваю это.

Многословный пример ... Допустим, я открываю питона в моем терминале и выполнить этот заданный файл, и я даю ему команду печати решить («х», [[ «х», «+», ' b '],' = ',' c ']). То, что я ожидаю в качестве вывода, - это уравнение, разработанное таким образом, что оно выглядит как ['x', '=', ['c', '-', 'b']]. Но я получаю Нет.

Теперь рассмотрим функцию решения, показанную выше. Предположим, что остальная часть моей программы правильная, и это правильно упорядочивает уравнение каждый раз. После д было решено иметь ст только на левой стороне (д [0]), решение будет называться 1 последний раз, когда будет принято решение, что v на самом деле одна из левой сторона.Это означает, что оператор , если v == левая (д): собирается оценить, правда, на последнем цикле и поэтому возвращение д к упомянутому решить функцию, которая будет возвращать ц к входу печати команды с терминала.

печати д утверждение в решение функции фактически выводит ожидаемое значение д к терминалу на последний цикл, но, когда попытки питона печатать возвращаемое значение (д), он не печатает None.

Любые предложения относительно того, что здесь происходит?

~ Макс

+0

не возвращается None, как вы не указали возвращаемое значение, если v не равно остались –

+0

Можете ли вы дать нам реальную, работоспособную, но урезанный, ' solve' и код, который вызывает эти функции, и показывать ожидаемый и фактический вывод, вместо того, чтобы пытаться описать его на половине страницы текста? См. [MCVE] (http://stackoverflow.com/help/mcve) для примера. – abarnert

+0

Да, я сейчас работаю над созданием урезанного примера, который представляет мою проблему. Я редактирую сообщение, когда узнаю его. – GnUfTw

ответ

0

"еще" филиал Ваша функция "Решение" является багги:

else: 
    if op(left(q)) == '+': 
     solvingAdd(v, q) 
    else: 
     return "v not on left of q" 

должен быть

else: 
    if op(left(q)) == '+': 
     return solvingAdd(v, q) #you forgot to return this value 
    else: 
     raise RuntimeError("v not on left of q") #this should raise an exception, not return a string 

Кроме того,

raise RuntimeException, "The variable does not exist in the expression." 

должен быть

raise RuntimeError("The variable does not exist in the expression.") 

Выход:

>>> solve('x', [['x', '+', 'b'], '=', 'c']) 
[['x', '+', 'b'], '=', 'c'] 
solvingAdd 
['x', '=', ['c', '-', 'b']] 
* 
['x', '=', ['c', '-', 'b']] 
** 
['x', '=', ['c', '-', 'b']] 
['x', '=', ['c', '-', 'b']] 
Смежные вопросы