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

Python编写算术测试题时如何随机选取运算操作符并参与计算?

问题修正方案

原有代码存在以下核心错误:

  • random.choice 是函数,需要用小括号()调用而非方括号[],且运算符号不能直接作为语法元素写在列表里,需要包裹为字符串格式
  • 运算符仅作为字符串无法直接参与算术计算,需要建立字符串运算符到实际运算逻辑的映射
  • 多处在语法层面缺少闭合括号、字符串引号,语法不合法
  • 结果判断逻辑顺序错误,尚未判断答案对错就提前写入了"passed"结果
  • 文件操作未做关闭处理,存在资源泄漏风险
修正后的完整代码
import random
import operator

def arithmetictest():
    name = input("whats your name?: ")
    # 建立运算符字符串到运算函数的映射
    op_map = {
        '+': operator.add,
        '-': operator.sub,
        '*': operator.mul,
        '/': operator.truediv
    }
    # 随机抽取运算符
    op = random.choice(list(op_map.keys()))
    a = random.randint(1, 100)
    b = random.randint(1, 100)
    # 计算对应运算的正确结果
    correct_answer = op_map[op](a, b)
    # 获取用户输入,兼容小数输入场景
    user_answer = float(input(f"whats {a} {op} {b}? "))
    
    # 用with上下文管理器自动处理文件关闭,避免资源泄漏
    with open("feedback.txt", "a", encoding="utf-8") as f:
        # 浮点数判断相等增加精度容错,避免除法精度误差导致误判
        if abs(user_answer - correct_answer) < 1e-6:
            print("correct")
            f.write(f"{name} passed\n")
        else:
            print("incorrect")
            f.write(f"{name} failed\n")

if __name__ == "__main__":
    arithmetictest()
关键修改说明
  • 引入内置operator模块封装基础算术运算,用字典建立运算符字符串和运算逻辑的映射,既规避了eval的安全风险,也能实现随机运算符的正常计算
  • 调整了结果判断逻辑,先验证答案对错再写入对应结果到txt文件,避免原有逻辑无论对错都先写入passed的问题
  • 浮点数相等判断增加了精度容错,避免除法运算出现的精度误差导致正确答案被误判
  • 如果你不需要小数结果,可将除法替换为整数除法operator.floordiv,同时将用户输入转为int类型即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 23:45:03