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
相关产品推荐
相关产品推荐

