Python实现单输入计算器时出现num1、num2索引错误如何解决?
索引错误原因及修复方案
核心错误点
- 循环终止条件错误:
while判断的len(s)和len(ops)是运算前的字符串长度,整个循环过程中没有修改这两个变量,会导致循环无限执行,持续对s2L执行pop操作,直到列表为空后访问s2L[0]、s2L[1]触发索引越界。 - 数据类型错误:
opsL最终是字符串类型,你初始化Waitops = []是列表,但后续直接赋值Waitops = opsL[0]变成了字符类型,后续Waitops[0]访问逻辑会混乱,空值时会触发索引错误。 - 逻辑冗余错误:提取数字、运算符的for循环完全没必要重复执行多次,执行1次即可得到正确的
s2L和opsL;存在重复的+运算符判断分支,减号分支中误写了除法运算逻辑。 - 优先级逻辑错误:当前代码按运算符出现顺序计算,没有实现先乘除后加减的需求。
修复后可运行代码
input_str = input("Input: ") # 校验输入合法性,仅允许数字和四则运算符 while not all(c.isdigit() or c in '+-*/' for c in input_str): input_str = input("Invalid, Input: ") # 一次提取数字列表和运算符列表 s = input_str for op in '+-*/': s = s.replace(op, ' ') s2L = [int(n) for n in s.split()] opsL = [c for c in input_str if c in '+-*/'] # 先处理所有乘除运算 i = 0 while i < len(opsL): if opsL[i] == '*': s2L[i] = s2L[i] * s2L[i+1] s2L.pop(i+1) opsL.pop(i) elif opsL[i] == '/': # 需要浮点结果可把//替换为/ s2L[i] = s2L[i] // s2L[i+1] s2L.pop(i+1) opsL.pop(i) else: i += 1 # 再处理所有加减运算 result = s2L[0] for i in range(len(opsL)): if opsL[i] == '+': result += s2L[i+1] elif opsL[i] == '-': result -= s2L[i+1] print("计算结果:", result)
测试验证
输入5*20-10/5,输出结果为98,符合预期。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

