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()
错误原因
- 核心报错原因:
ValueError: invalid literal for int() with base 10: '323+566'表示你试图把包含+的字符串323+566转换成整数,这不符合整数的格式要求。- 代码中用
tokens = expression.split("*")分割表达式,但输入323+566里没有*,所以tokens的结果是['323+566'],最后执行return int(tokens[0])自然会报错。
- 代码中用
- 逻辑缺陷:
- 仅针对
*做了分割处理,完全没针对+、-做拆分,导致运算符和数字混在一起无法解析。 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
相关产品推荐
相关产品推荐

