为什么这些表达式不相同?

时间:2019-05-08 13:51:22

标签: python class runtime-error

作为一项作业,我必须在python中编写一棵二叉树代码,在该树上可以执行简单的操作,然后以反波兰语表示法打印该表达式。我最初的回答基本上是正确的,最后,最后一个函数post_fix()给了我错误'NoneType' object has no attribute 'left'。这是我最初的答案:

class N:
    "un noeud de l'arbre"
    def __init__(self, c, l=None, r=None):
        self.content = c
        self.left = l
        self.right = r

    def print_tree(self):
        if self.left is not None:
            self.left.print_tree()         
        print(self.content) 
        if self.right is not None:   
            self.right.print_tree()

expression_1 = N('*', N('+', N(7), N(3)), N(4))
expression_2 = N('+', N(7), N('*', N(3), N(4)))

def isnumber(s):
    try:
        float(s)
        return True
    except ValueError:
        return False

def calcule(x, oper, y):
    "applique l'operateur à x et y et retourne le résultat"
    if isnumber(x) and isnumber(y):
        if oper == '+':
            return x + y
        elif oper == '-':
            return x - y
        if oper == '*':
            return x * y
        elif oper == '/':
            return x / y
        else: 
            print('\033[1;31mERROR: "{}" is not a valid operator.\033[1;m'.format(oper))
            return None
    else: 
        print ('\033[1;31mERROR: operands must be numerical values.\033[1;m')

def evalue(arbre):
    "evalue l'expression logée dans l'arbre"
    if type(arbre.content) in (float, int):
        return arbre.content
    else:
        operator = arbre.content
        vg = evalue(arbre.left)
        vd = evalue(arbre.right)
        return calcule(vg, operator, vd)

def post_fix(arbre):
    "retourne l'expression de cet arbre en notation post-fixée"
    pf = ''
    if arbre.left is not None :
        pf = pf + post_fix(arbre.left) + ' '
    if arbre.right is not None :
        pf = pf + post_fix(arbre.right) + ' '
    return pf + arbre.content

print('Expression 1 en notation post-fix:', post_fix(expression_1))  
print('Expression 2 en notation post-fix:', post_fix(expression_2))  

给出了定义post_fix()的正确方法:

def post_fix(arbre):
    "retourne l'expression de cet arbre en notation post-fixée"
    pf = str()
    if arbre.left is not None :
        pf = pf + post_fix(arbre.left) + ' '
    if arbre.right is not None :
        pf = pf + post_fix(arbre.right) + ' '
    return pf + str(arbre.content)

有人可以告诉我两者之间的区别,以及我的原始声明导致错误的原因吗?预先谢谢你。

编辑: 我注意到,在接受了答案之后,主要的问题是类型不兼容,但是问题仍然悬而未决:给出的错误是'NoneType' object has no attribute 'left'。我在用Jupyter。

1 个答案:

答案 0 :(得分:0)

运行代码时,我实际上收到如下错误

return pf + arbre.content
TypeError: can only concatenate str (not "int") to str

这告诉您不能将intstr串联在一起,因此第一种方法不起作用,但是可以将int转换为{{ 1}},这是我们在第二种方法中所做的

str

如您所见,将字符串和整数连接在一起会引发错误,但是在将字符串转换为整数然后进行连接时并没有引发此类错误,这是在In [16]: x = 'a' In [17]: y = 2 In [18]: x+y --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-18-259706549f3d> in <module> ----> 1 x+y TypeError: can only concatenate str (not "int") to str In [19]: x+str(y) Out[19]: 'a2' 的第一种和第二种方式中发生的情况分别