【问题标题】:ValueError: invalid literal for int() with base 10: '+' in calculatorValueError:int() 的无效文字,以 10 为底:计算器中的“+”
【发布时间】:2023-12-18 03:12:01
【问题描述】:

我以为 '+' 是一个整数,看起来像是一个字符串。
我正在做一个计算器,
这是我的代码:

while True:
    said = input("? \n")
    symbols = []
    for symbol in said.split():
        if symbol in ['+','-','*','/']:
            symbols.append(symbol)
    allobj = said.split()
    numbers = []
    for number in said.split():
       if number.isdigit():
          numbers.append(int(number))
    length = len(numbers)
    if '+' in allobj and length == 2:
        result = numbers[0] + int(symbols[0]) + numbers[1]
        print("Result ---- " + str(result))

如果我打印1 + 1,它会给我ValueError: invalid literal for int() with base 10: '+'
请帮忙

【问题讨论】:

  • 您不能将带有int(symbols[0]) 中符号的字符串转换为int。删除+ int(symbols[0])
  • 你对int('+')的结果有什么期望?
  • @ZarakiKenpachi 现在呢?新问题 - TypeError: unsupported operand type(s) for +: 'int' and 'str'
  • @mansuetus 真正的加分,例如 1 + 1 = 2
  • @Alex Zab 哦,伙计,尝试自己解决这个问题,在添加之前检查变量类型。检查numbers[0]numbers[1] 的类型

标签: python string numbers calculator symbols


【解决方案1】:

问题出在这里:

result = numbers[0] + int(symbols[0]) + numbers[1]

如果字符串是1 + 1,那么numbers[1, 1] 并且symbols['+']。所以symbols[0] 是字符串'+',而int(symbols[0]) 给出错误,因为int('+') 无效。

您似乎想将symbols[0] 表示的运算符应用于numbers[0]numbers[1] 作为二元运算符。直接执行此操作的唯一方法是使用eval,但由于它被认为不安全,因此通常不受欢迎。

更安全的选择是有一个由操作员索引的查找表(dict),例如:

op_lookup = {'+' : do_add,
             '-' : do_sub}

其中do_adddo_sub 是执行加法和减法的双操作数函数,例如

def do_add(x, y):
    return x + y

def do_sub(x, y):
    return x - y

那么你可以这样做:

    result = op_lookup(symbols[0])(numbers[0], numbers[1])

【讨论】:

  • 谢谢,但是如果我有很多数字和符号,比如 100 / 2 + 20 - 35 怎么办
  • 这是一个更普遍的问题。如果您想拥有一个真正的解析器,那么在不使用 eval 的情况下,您需要编写一个(或者如果您能找到一个现成的解析器库,则使用一些现成的解析器库)。递归下降解析器编写起来非常简单,但超出了 Stack Overflow 答案的范围。
  • 所以用我的代码,不可能做我想做的事?我的问题只是如何使 + 一个整数,所以它可以计算 1 + 1 或 20 + 64
  • 如果您只有两个数字和它们之间的运算符,那么我发布的解决方案将起作用。我只展示了两个受支持的运算符(+-),但您可以添加任意数量的其他运算符。您一次只能使用其中一个。
  • 我知道,但我需要两个以上的数字
最近更新 更多