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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 18:15:04