2014-09-19 95 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返回列表,但变量,但变量为空

什么这些功能所应该做的...

功能离开返回Q的第一个元素中的变量。

函数op返回q的第二个元素中的运算符。

函数right返回q的第三个元素中的变量。

函数isInside将会看到v确实存在于q的左侧。

功能解决将测试如果V是Q,它是左侧,所以它会调用解决执行单独获得v中左侧

功能所需要的操作解决将检查v是否单独在q的左侧。如果是,它应该返回q来解决应该将q返回给打印终端输入。如果它不是,它将在公式上运行,使左边的v单独出现。

函数solveAdd执行操作并将结果返回给求解。

  • q为形式的列表数据类型['someVariable1, 'someOperator', 'someVariable2']

的问题是什么...

它好像我变量q在输入显示的if语句时失去其分配的值。我将举一个例子来说明为什么我怀疑这一点。

放牧,例如... 比方说我在终端打开Python和执行这个给定的文件,我给它的命令打印解决(“X”,[“X”,“+”,' b'],'=','c'])。我期望输出的是这样的等式:它看起来像['x','=',['c',' - ','b']]。但我得到的是

现在让我们考虑上面显示的解决功能。让我们假设我的程序的其余部分是正确的,并且每次都正确地重新排列方程。一旦q已经解决而有v独自在其左侧(Q [0]),解决将被称为最后的地方,决定将在作出v实际上是左单独1次手边。这意味着声明如果V ==左(Q):是要评估为true的最后一个周期,因此回报q所提到的解决函数,那么将返回q到输入打印来自终端的命令。

打印q声明中解决功能实际打印q的对最后一个周期,但是,当蟒蛇试图打印返回值(Q)的终端的预期值,它打印

关于这里发生了什么的任何建议?

〜最大

+0

因为你没有指定一个返回值,如果v不等于离开 – 2014-09-19 00:10:37

+0

,你能不能给我们一个真实的,可运行的,但简装要返回无,'解决'函数和调用这些函数的代码,并显示预期的和实际的输出,而不是试图在半个文本页面中描述它?有关示例的内容,请参见[MCVE](http://stackoverflow.com/help/mcve)。 – abarnert 2014-09-19 00:13:35

+0

是的,我正在创建一个精简的例子,代表我的问题。当我弄明白的时候编辑帖子。 – GnUfTw 2014-09-19 00:58:54

回答

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']]