You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python计算器程序报错:ValueError(int() base10无效字面量)

Python计算器报错:int() base10问题解析与修复

问题场景

运行自制Python计算器时,输入323+566触发如下报错:

Enter a mathematical expression: 323+566
Traceback (most recent call last):
  File "C:\Users\ammar\PycharmProjects\Calculator\main.py", line 49, in <module>
    main()
  File "C:\Users\ammar\PycharmProjects\Calculator\main.py", line 44, in main
    output = solve_expression(expression)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\ammar\PycharmProjects\Calculator\main.py", line 32, in solve_expression
    return int(tokens[0])
           ^^^^^^^^^^^^^^
ValueError: invalid literal for int() with base 10: '323+566'

Process finished with exit code 1

程序代码如下:

def solve_expression(expression):

    # Remove spaces from the expression.
    expression = expression.replace(" ", "")

    # Check if the second operator is "/". If yes, ignore it.
    if expression[1] == "/":
        return int(expression[0])

    # Split the expression into a list of tokens.
    tokens = expression.split("*")

    # Evaluate the expression using BODMAS.
    for i in range(len(tokens)):
        if tokens[i] == "+":
            tokens[i - 1] = str(int(tokens[i - 1]) + int(tokens[i + 1]))
            tokens[i + 1] = ""
        elif tokens[i] == "-":
            tokens[i - 1] = str(int(tokens[i - 1]) - int(tokens[i + 1]))
            tokens[i + 1] = ""

    # Return the output of the expression.
    return int(tokens[0])


def main():
    # Get the mathematical expression from the user.
    expression = input("Enter a mathematical expression: ")

    # Solve the expression and print the output.
    output = solve_expression(expression)
    print(f"The output of the expression is {output}")


if __name__ == "__main__":
    main()

错误原因

  1. 核心报错原因:ValueError: invalid literal for int() with base 10: '323+566' 表示你试图把包含+的字符串323+566转换成整数,这不符合整数的格式要求。
    • 代码中用tokens = expression.split("*")分割表达式,但输入323+566里没有*,所以tokens的结果是['323+566'],最后执行return int(tokens[0])自然会报错。
  2. 逻辑缺陷:
    • 仅针对*做了分割处理,完全没针对+、-做拆分,导致运算符和数字混在一起无法解析。
    • if expression[1] == "/"的判断存在风险:如果表达式长度小于2(比如输入5),会直接触发索引越界错误。
    • 遍历tokens处理+、-的逻辑不成立,因为tokens里根本不会有单独的+、-元素(只有用对应运算符分割才会出现)。

修复方案

要实现支持+、-、*、/的计算器,首先需要正确拆分数字和运算符,再按BODMAS(先乘除后加减)的顺序计算。以下是修复后的代码:

import re

def solve_expression(expression):
    # 移除空格
    expression = expression.replace(" ", "")
    
    # 用正则拆分数字和运算符,支持正负数字、小数
    tokens = re.findall(r'(-?\d+\.?\d*)|([+\-*/])', expression)
    # 整理成[数字, 运算符, 数字, ...]的格式
    tokens = [item for sublist in tokens for item in sublist if item]
    
    # 先处理乘除
    i = 1
    while i < len(tokens):
        if tokens[i] == '*':
            # 计算前一个数字和后一个数字的乘积
            result = float(tokens[i-1]) * float(tokens[i+1])
            # 替换三个元素为计算结果
            tokens = tokens[:i-1] + [str(result)] + tokens[i+2:]
        elif tokens[i] == '/':
            # 处理除法,避免除以0
            if float(tokens[i+1]) == 0:
                raise ValueError("Cannot divide by zero")
            result = float(tokens[i-1]) / float(tokens[i+1])
            tokens = tokens[:i-1] + [str(result)] + tokens[i+2:]
        else:
            # 不是乘除,移动到下一个运算符
            i += 2
    
    # 再处理加减
    i = 1
    while i < len(tokens):
        if tokens[i] == '+':
            result = float(tokens[i-1]) + float(tokens[i+1])
            tokens = tokens[:i-1] + [str(result)] + tokens[i+2:]
        elif tokens[i] == '-':
            result = float(tokens[i-1]) - float(tokens[i+1])
            tokens = tokens[:i-1] + [str(result)] + tokens[i+2:]
        else:
            i += 2
    
    # 返回结果,转成整数如果是整数的话
    result = float(tokens[0])
    return int(result) if result.is_integer() else result

def main():
    expression = input("Enter a mathematical expression: ")
    try:
        output = solve_expression(expression)
        print(f"The output of the expression is {output}")
    except Exception as e:
        print(f"Error: {e}")

if __name__ == "__main__":
    main()

修复说明

  • 使用正则表达式re.findall(r'(-?\d+\.?\d*)|([+\-*/])', expression)正确拆分数字(包括正负、小数)和运算符,解决了原代码无法拆分+、-的问题。
  • 严格按照BODMAS顺序,先遍历处理乘除运算,再处理加减运算。
  • 增加了除以0的错误判断,用try-except捕获运行时异常,提升程序稳定性。
  • 最终结果自动判断是否为整数,输出更友好。

内容的提问来源于stack exchange,提问作者AmmarAli

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 17:43:19