【问题标题】:How to check if token is a float?如何检查令牌是否为浮点数?
【发布时间】:2015-06-12 02:31:59
【问题描述】:

所以我需要修改以下代码,使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()

【问题讨论】:

  • 你试过内置的 type() 吗?
  • @msanti 不,我没有,而且对 python 太陌生了,我不能说我知道如何使用它哈哈。感谢您的反馈!
  • type() 方法返回某个变量的类型。例如,type(3.14) 将返回一个浮点数。所以我可以通过执行 if type(somevariable) == float: do something 来测试某物是浮点数还是任何数据类型

标签: python isinstance


【解决方案1】:

tokenList = infixexpr.split() 创建一个字符串列表,其中没有一个可以是浮点数。如果可以转换为浮点数,则可以创建一个函数转换为浮点数返回 True。

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),这将是True 或False,因此任何if isinstance(token,int) 都将被正确评估

【讨论】:

  • @alexmcf,特别是当 OP 想要在第二个函数中使用 int/float 时,尝试转换非常容易。
  • 如果 float 的值为 0,则使用 float 值作为返回值的情况可能会出现意外行为
  • @EricRenouf,是的,但是 OP 提到的多于一位的数字在 python 中必须是大于 0 的值,但我会提到它
  • 感谢您的意见。我已经尝试了您的建议,也尝试了内置的 type() ,但它没有通过测试。我会提供整个代码,但我似乎无法正确粘贴它哈哈。
  • @RonNotJohn,如果您传递任何可以解析为浮点数的字符串,那么代码将起作用,您必须有字符串,因为您无法拆分浮点数,因此无法使用 issinstance 或 type
猜你喜欢
  • 2013-02-25
  • 2023-03-14
  • 2011-08-13
  • 2012-09-10
  • 2013-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多