如何编写可持续接收用户输入并对所有输入内容进行求值的程序
实现思路
- 第一步:搭建持续输入监听逻辑:通过无限循环接收用户输入,预设退出关键词,用户输入对应内容即可终止程序。
- 第二步:输入合法性校验:直接调用系统自带的求值函数存在代码注入风险,需先设置合法字符白名单,只允许数字、四则运算符、括号这类运算相关的字符输入,过滤敏感内容。
- 第三步:运算与异常捕获:对校验通过的表达式执行求值操作,同步捕获运算过程中可能出现的语法错误、除零错误等异常,给用户返回明确的报错提示,避免程序直接崩溃。
- 第四步:结果回显:输出运算结果后回到输入监听状态,等待下一次用户输入。
可参考Python实现代码
# 合法字符白名单,仅支持四则运算和括号 ALLOWED_CHARS = set('0123456789+-*/(). ') def calculate_expression(expr): # 先校验输入是否包含非法字符 for char in expr: if char not in ALLOWED_CHARS: raise ValueError("输入包含非法字符,仅支持数字、+-*/运算符和括号") # 禁用eval内置函数上下文,降低注入风险 return eval(expr, {"__builtins__": None}, {}) if __name__ == "__main__": print("四则运算计算器已启动,输入exit/quit/q即可退出") while True: user_input = input(">>> ").strip() # 触发退出逻辑 if user_input.lower() in ['exit', 'quit', 'q']: print("程序已退出") break # 空输入直接跳过 if not user_input: continue # 运算和异常处理 try: result = calculate_expression(user_input) print(f"运算结果:{result}") except ZeroDivisionError: print("错误:除数不能为0") except SyntaxError: print("错误:表达式语法不正确") except ValueError as e: print(f"错误:{e}") except Exception as e: print(f"运算失败:{str(e)}")
代码说明
- 上述实现通过白名单校验+禁用
eval内置函数的方式降低了代码注入风险,如果是生产环境使用,建议替换eval为专门的表达式解析库(如asteval),安全性更高。 - 覆盖了常规的运算异常场景,用户输入不合法时不会导致程序崩溃。
- 支持加减乘除四则运算、括号调整运算优先级,符合常规数学运算规则。
内容的提问来源于stack exchange,提问作者Yuzuki Yuki
相关产品推荐
相关产品推荐

