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

Python后缀表达式多位数解析器实现及TypeError报错问题求助

后缀表达式计算问题修复及多位数支持方案

报错修复

你遇到的类型错误由两个错误逻辑共同导致:

  1. 你定义的parser函数设计为接收单个字符作为入参,但调用时直接传入了完整的表达式字符串,同时函数内部依赖全局变量token存储数字缓冲,状态完全不受控。
  2. 你将parser返回的生成器对象直接覆盖了原本存储表达式字符串的data变量,后续代码执行xxx in data判断时,左侧是字符串、右侧是生成器,直接触发类型错误。

修复后的Token解析实现

不需要写复杂的BNF解析器,以下实现即可同时解决报错和多位数支持需求:

def tokenize(expr: str):
    num_buffer = []
    # 遍历表达式所有字符
    for c in expr:
        # 数字存入缓冲
        if c.isdigit():
            num_buffer.append(c)
        else:
            # 遇到非数字先输出缓冲中的完整数字
            if num_buffer:
                yield int(''.join(num_buffer))
                num_buffer.clear()
            # 运算符直接作为单独Token输出
            if c in "+-*":
                yield c
    # 遍历结束后输出最后一段数字缓冲
    if num_buffer:
        yield int(''.join(num_buffer))

调用代码调整

stack = Stack()
# 传入原始表达式字符串获取Token流,不要覆盖原data变量
tokens = tokenize(data)
for token in tokens:
    if isinstance(token, int):
        stack.push(token)
    # 此处保留你原有运算符计算逻辑即可

多位数支持说明

上述实现默认支持多位数解析:

  • 连续出现的数字会被全部收集到缓冲中,直到遇到运算符、表达式结束才会拼接为整数输出
  • 兼容带/不带空格的后缀表达式格式,比如123 456 +、123+456都可以正确解析为对应Token

可选优化

  • 增加空格兼容逻辑:遍历字符时如果遇到空格直接跳过,不做任何处理即可
  • 如果需要支持小数,只需要在数字判断逻辑中增加对.的识别和特殊处理
  • 所有缓冲逻辑都放在函数内部,不会出现多次调用状态残留的问题

内容的提问来源于stack exchange,提问作者TheUselessProgrammer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 12:24:03