如何检查令牌是否是浮点数?

时间:2015-06-12 02:32:00

标签: python isinstance

所以我需要修改以下代码,以便方法PostfixEval()infixToPostfix()可以使用浮点数,以及具有多个数字的整数。我试过了isinstance(token,float) == True。也许我没有正确使用它。

def infixToPostfix(infixexpr):
    prec = {}
    prec["*"] = 3
    prec["/"] = 3
    prec["+"] = 2
    prec["-"] = 2
    prec["("] = 1
    opStack = Stack()
    postfixList = []
    tokenList = infixexpr.split()

    for token in tokenList:
        if token in "ABCDEFGHIJKLMNOPQRSTUVWXYZ" or isinstance(token,int) == True :
            postfixList.append(token)
        elif token == '(':
            opStack.push(token)
        elif token == ')':
            topToken = opStack.pop()
            while topToken != '(':
                postfixList.append(topToken)
                topToken = opStack.pop()
        else:
            while (not opStack.isEmpty()) and \
               (prec[opStack.peek()] >= prec[token]):
                  postfixList.append(opStack.pop())
            opStack.push(token)

    while not opStack.isEmpty():
        postfixList.append(opStack.pop())
    return " ".join(postfixList)

def postfixEval(postfixExpr):  # also fix this to do floats
    operandStack = Stack()
    tokenList = postfixExpr.split()

    for token in tokenList:
        if isinstance(token,int) == True:
            operandStack.push(int(token))
        else:
            operand2 = operandStack.pop()
            operand1 = operandStack.pop()
            result = doMath(token,operand1,operand2)
            operandStack.push(result)
    return operandStack.pop()

1 个答案:

答案 0 :(得分:2)

tokenList = infixexpr.split()创建一个字符串列表,其中没有一个可以是浮点数。你可以创建一个函数来强制转换为float,如果你可以强制转换为浮动。

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

然后:

lett_set = set("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
if token in lett_set or isfloat(token)

您也可以返回浮动并在其他函数中使用它:

def is_float(s):
    try:
         return float(s)
    except ValueError:
         return  None

for token in tokenList:
     test = is_float(token)
     if test is not None: # catch potential 0
        operandStack.push(test)

您可以在两个功能中使用第二个版本。你在标题中提到了浮点数,所以我认为你可以使用浮点数而不能尝试转换为int。

在旁注isinstance(token,int) == True等..可以简单地写成isinstance(token,int),这将是真或假,因此任何if isinstance(token,int)都将被正确评估