使用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)
遇到的问题
我测试了几个不同的输入,结果并不理想:
- 当输入
oper = "20 *2"时,代码直接抛出StopIteration异常,而我期望的输出是20 * 2 - 当输入
oper = "10+ 3 *2"时,代码输出10 + 3*2,但我期望的是10 + 3 * 2 - 只有部分简单情况(比如
oper = "20 +2")能得到正确输出20 + 2
我感觉问题可能出在next()的使用上,每次调用next(it)都会移动迭代器的位置,导致循环的遍历和迭代器的进度不同步,但我不太清楚具体怎么修复。不管是帮我修正现有代码的问题,还是给我一个新的实现思路,我都非常感激!
备注:内容来源于stack exchange,提问作者Dariiu
相关产品推荐
相关产品推荐

