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

使用next()方法触发StopIteration异常排查及数学表达式字符串格式化问题求助

使用next()方法触发StopIteration异常排查及数学表达式字符串格式化问题求助

大家好,我是Python新手,最近在做一个小需求:让代码识别一串数学表达式字符串,然后自动给它加上规范的空格输出——简单说就是让数字和运算符之间有合适的空格,同时像**、//这种双字符的运算符不能被拆开。

我自己尝试写了一段代码,但遇到了几个问题,想请各位帮忙看看怎么解决,也欢迎大家给我提一些代码优化的建议。

我的实现思路和代码

首先我定义了要识别的运算符集合,然后处理输入的表达式字符串:先去掉所有空格,再用迭代器来判断当前字符的下一个字符是什么,以此来决定要不要加空格。以下是我的代码:

# 定义需要识别的数学运算符
operators = ("+", "-", "*", "/", "%", "**", "//")
# 待格式化的表达式字符串
oper = "20 *2"
# 用于存储格式化后的结果
new_oper = ""

# 先去掉所有空格,再转为迭代器
it = iter(oper.replace(" ", ""))
# 先调用一次next,想着让后续循环里的next能取到当前字符的下一个
next(it)

# 遍历处理后的无空格字符串
for x in oper.replace(" ", ""):
    try:
        if x not in operators:  # 当前字符是数字
            if next(it) in operators:
                # 如果下一个字符是运算符,给当前数字加空格
                new_oper += f"{x} "
            else:
                new_oper += x
        else:  # 当前字符是运算符
            if x == "*":
                if next(it) == "*":
                    # 下一个也是*,说明是**运算符,不加空格
                    new_oper += x
                else:
                    new_oper += f"{x} "
            elif x == "/":
                if next(it) == "/":
                    # 下一个也是/,说明是//运算符,不加空格
                    new_oper += x
                else:
                    new_oper += f"{x} "
            else:
                # 其他单字符运算符,直接加空格
                new_oper += f"{x} "
    except RuntimeError:
        # 处理最后一个字符,直接追加
        new_oper += x

# 输出格式化后的结果
print(new_oper)

遇到的问题

我测试了几个不同的输入,结果并不理想:

  1. 当输入oper = "20 *2"时,代码直接抛出StopIteration异常,而我期望的输出是20 * 2
  2. 当输入oper = "10+ 3 *2"时,代码输出10 + 3*2,但我期望的是10 + 3 * 2
  3. 只有部分简单情况(比如oper = "20 +2")能得到正确输出20 + 2

我感觉问题可能出在next()的使用上,每次调用next(it)都会移动迭代器的位置,导致循环的遍历和迭代器的进度不同步,但我不太清楚具体怎么修复。不管是帮我修正现有代码的问题,还是给我一个新的实现思路,我都非常感激!

备注:内容来源于stack exchange,提问作者Dariiu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.22 11:17:58