如何读取两位数而不是一位数?

时间:2014-07-10 19:51:55

标签: python

我正在创建一个执行简单(+, - ,*,/)操作的后缀计算器。运行此代码并使用两个单位数字工作正常。但是,使用一个两位数字(15,20等),它将数字存储为[' 1,' 5']而不是15,然后操作混乱。我该如何解决这个问题?

evaluation = Stack()

def main():
    expression = str(input("Enter an expression: "))
    expression = expression.replace(" ","")
    for x in expression:
        evaluation.push(x)
    while len(evaluation) > 1:
        check = evaluation.pop()
        if check == "+":
            first = evaluation.pop()
            second = evaluation.pop()
            temp = int(second) + int(first)
            evaluation.push(temp)
        elif check == "-":
            first = evaluation.pop()
            second = evaluation.pop()
            temp = int(second) - int(first)
            evaluation.push(temp)
        elif check == "/":
            first = evaluation.pop()
            second = evaluation.pop()
            temp = int(second) / int(first)
            evaluation.push(temp)
        elif check == "*":
            first = evaluation.pop()
            second = evaluation.pop()
            temp = int(second) * int(first)
            evaluation.push(temp)
        elif check != "+" or check != "-" or check != "*" or check != "/":
            evaluation.push(check)
    print("Answer:", evaluation.data[0])

4 个答案:

答案 0 :(得分:0)

不要从表达式中删除空格,但使用它将表达式split转换为可用部分:

In [1]: '223 370 * 45 /'.split()
Out[1]: ['223', '370', '*', '45', '/']

迭代你现在获得的列表。要检查列表项是否为运算符,只需使用in

In [4]: '+' in '+-/*'
Out[4]: True

如果该项目不是运算符,则它必须是数字,因此请在其上使用float()并将其推入堆栈。

由于您已定义的所有运算符,您只需弹出一次操作数。由于普通的数学运算符也可用作函数,因此您可以使用字典来调用它们,而不是编写长if / elif;

In [1]: from operator import add, sub, mul, div

In [2]: ops = {'+': add, '-': sub, '*': mul, '/': div}

In [3]: ops['+'](1, 3)
Out[3]: 4

In [4]: ops['/'](1.0, 3.0)
Out[4]: 0.3333333333333333

所以一个简单的计算器函数可以像这样写出来;

from operator import add, sub, mul, div

_ops = {'+': add, '-': sub, '*': mul, '/': div}


def postfix(expr):
    """Evaluate a postsfix expression

    :param expr: The expression to evaluate
    :returns: result of the expression
    """
    items = expr.split()
    if not items:
        raise ValueError("Empty expression")
    stk = []  # A plain list works fine here.
    for i in items:
        if i not in '+-*/':
            # float() will raise an exception if it doesn't find a number.
            stk.append(float(i))
        else:
            try:
                b = stk.pop()
                a = stk.pop()
                stk.append(_ops[i](a, b))
            except IndexError:
                raise ValueError('Invalid expression; empty stack')
    return stk[-1]

答案 1 :(得分:0)

当你谈到这一点时:

elif check != "+" or check != "-" or check != "*" or check != "/":
        evaluation.push(check)

你实际上将一个符号推入​​堆栈。 你可能会做的是继续阅读符号(数字),直到你没有遇到其他东西,然后将你读过的整个字符串转换成一个整数并推送它。

答案 2 :(得分:0)

我认为您遇到了麻烦,因为您正在迭代输入中的每个字符。

我做两件事之一:     - 分解输入 - 分别询问第一个数字,操作和第二个数字     - 遍历输入中的每个字符并确定它是什么,然后对其进行校正。

请记住,您将要确保您对运营商的帐户可能是\并且如果您在两个整数上使用它,您将获得一个int而不是一个浮点数,这可能更合适。

答案 3 :(得分:0)

您可以使用正则表达式:

expression = "1234+567"
sign_index = [m.start() for m in re.finditer(r'[+-/*]', expression)][0]
sign = expression[sign_index]
first_num = int(expression.split(sign)[0])
second_num = int(expression.split(sign)[1])