如何让Python表达式计算器兼容带空格与无空格的输入?
问题分析
原代码的核心问题是强制依赖空格作为分隔符:
- 当输入无空格的表达式(如
1+1)时,x.split(" ")只会得到一个包含整个字符串的列表,执行num1, operator, num2 = x.split(" ")会直接抛出ValueError,因为无法将1个元素解包到3个变量中 - 另外只支持整数输入,若用户输入小数(如
2.5 + 3)也会报错
解决方案1:遍历识别运算符(符合你的思路)
遍历输入字符串,找到第一个出现的运算符(+、-、*、/),以此为分界点分割出左右两个数字部分,同时兼容混合空格的情况。代码如下:
def main(): user_input = input("Expression: \n") calculate(user_input) # 重命名函数避免和变量名冲突 def calculate(expr): operators = ['+', '-', '*', '/'] op_index = -1 # 遍历字符串定位运算符位置 for i, char in enumerate(expr): if char in operators: op_index = i break if op_index == -1: print("Invalid expression") return # 分割数字并去除可能的空格 num1_str = expr[:op_index].strip() operator = expr[op_index] num2_str = expr[op_index+1:].strip() # 支持整数和小数输入 try: num1 = float(num1_str) num2 = float(num2_str) except ValueError: print("Invalid number") return # 运算逻辑,增加除零判断 if operator == "+": res = num1 + num2 elif operator == "-": res = num1 - num2 elif operator == "*": res = num1 * num2 elif operator == "/": if num2 == 0: print("Cannot divide by zero") return res = num1 / num2 else: print("Invalid operator") return print(f"{res:.1f}") main()
解决方案2:正则表达式匹配(更简洁健壮)
用正则表达式可以一次性匹配出数字、运算符和数字,自动兼容有无空格的情况,代码更简洁:
import re def main(): user_input = input("Expression: \n") calculate(user_input) def calculate(expr): # 正则规则:匹配整数/小数 + 运算符(允许前后空格) + 整数/小数 pattern = r'^(\d+\.?\d*)\s*([+\-*/])\s*(\d+\.?\d*)$' match = re.match(pattern, expr) if not match: print("Invalid expression") return num1_str, operator, num2_str = match.groups() try: num1 = float(num1_str) num2 = float(num2_str) except ValueError: print("Invalid number") return if operator == "+": res = num1 + num2 elif operator == "-": res = num1 - num2 elif operator == "*": res = num1 * num2 elif operator == "/": if num2 == 0: print("Cannot divide by zero") return res = num1 / num2 else: print("Invalid operator") return print(f"{res:.1f}") main()
内容的提问来源于stack exchange,提问作者Austin
相关产品推荐
相关产品推荐

