Python 3中实现基础数学运算(禁用eval/exec等语句执行函数)
手动实现基础数学运算的完整方案
看起来你已经开始手动实现基础数学运算了,这比用eval()安全多了!我来帮你把代码补全,还会加一些实用的异常处理和优化~
首先先把你写的部分代码放出来(看起来你写到乘法的时候中断了):
solutionlist = list(basicoperationslist) for i in range(0, len(solutionlist)): if '+' in solutionlist[i]: y = solutionlist[i].split('+') solutionlist[i] = str(int(y[0]) + int(y[1])) elif '*' in solutionlist[i]: # 你还没写完这里的逻辑 pass
完整实现代码
下面是补全后的版本,支持+、-、*、/四种基础运算,还处理了空格、非整数输入、除零错误等情况:
def calculate_basic_operations(basicoperationslist): # 复制输入列表,避免修改原数据 solutionlist = list(basicoperationslist) # 定义支持的运算符,按顺序查找(单个表达式只支持一个运算符) supported_ops = ['+', '-', '*', '/'] for idx in range(len(solutionlist)): expr = solutionlist[idx] current_op = None # 找到表达式中的运算符 for op in supported_ops: if op in expr: current_op = op break # 如果没有找到运算符,跳过当前元素 if not current_op: continue try: # 分割数字,strip()处理可能的空格(比如" 10 - 5 ") num1_str, num2_str = expr.split(current_op) num1 = int(num1_str.strip()) num2 = int(num2_str.strip()) # 根据运算符计算结果 if current_op == '+': result = num1 + num2 elif current_op == '-': result = num1 - num2 elif current_op == '*': result = num1 * num2 elif current_op == '/': if num2 == 0: raise ZeroDivisionError("除数不能为0") # 这里可以选整数除法//或者浮点数除法/,按需修改 result = num1 / num2 # 把结果转成字符串替换原位置 solutionlist[idx] = str(result) except ValueError: # 处理非整数输入的情况 solutionlist[idx] = "错误:输入不是有效的整数" except ZeroDivisionError as e: # 处理除零错误 solutionlist[idx] = f"错误:{str(e)}" return solutionlist
测试示例
你可以用下面的测试用例验证功能:
test_cases = ["3+5", "10 - 2", "4*6", "15/3", "8/0", "abc+12", "7"] print(calculate_basic_operations(test_cases))
输出结果:
['8', '8', '24', '5.0', '错误:除数不能为0', '错误:输入不是有效的整数', '7']
额外优化建议
- 如果需要支持先乘除后加减的运算顺序,那就要做更复杂的表达式解析,比如将中缀表达式转成后缀表达式(逆波兰表达式)再计算,这部分可以单独扩展
- 如果需要支持更多运算符(比如取模
%、幂运算**),只需要在supported_ops里添加,再补充对应的计算分支 - 如果要支持浮点数输入,把
int()改成float()即可
内容的提问来源于stack exchange,提问作者enon97
相关产品推荐
相关产品推荐

