Python简易计算器代码返回None问题求助:需实现常规计算逻辑
问题分析与修复
核心问题
你的代码返回None的原因主要有两个:
- 生成器耗尽:
variation是生成器对象,第一次调用calcul函数时,循环for x in variation会取走第一个运算符,之后生成器就空了。当reduce继续调用calcul处理后续数字时,这个循环不会执行,函数没有返回值,默认返回None。 reduce使用逻辑错误:reduce的回调函数应该每次根据当前的运算符处理两个数字,但你的函数试图遍历所有运算符,逻辑完全不匹配。
另外还有两个次要问题:
wayy函数实现冗余,完全可以用更简单的方式提取运算符。- 未处理运算符优先级(比如
7 - 2 * 3会被错误计算为15,而非正确结果1)。
基础修复版本(先解决返回None问题)
先修正核心逻辑,让代码能正常返回计算结果,同时简化代码结构:
from functools import reduce question = input("Enter your calcul : ") tokens = question.split() # 提取数字和运算符(简化原wayy函数的逻辑) numbers = [int(t) for t in tokens[0::2]] operators = [t for t in tokens[1::2]] # 用索引跟踪当前使用的运算符 op_index = 0 def calcul(num1, num2): global op_index op = operators[op_index] op_index += 1 if op == '+': return num1 + num2 elif op == '-': return num1 - num2 elif op == '*': return num1 * num2 elif op == '/': return num1 / num2 else: raise ValueError(f"不支持的运算符:{op}") # 验证输入格式是否合法 if len(numbers) == len(operators) + 1: result = reduce(calcul, numbers) print("计算结果:", result) else: print("输入格式错误,请按照「数字 运算符 数字 ...」的格式输入")
支持运算符优先级的优化版本
如果需要正确处理*//优先于+/-的逻辑,不能直接按顺序计算,需要先处理乘除再处理加减:
question = input("Enter your calcul : ") tokens = question.split() def calculate_expression(tokens): # 第一步:先处理所有乘除运算 temp = [] i = 0 while i < len(tokens): if tokens[i] in ('*', '/'): # 取出前一个数字、运算符、后一个数字计算 num1 = temp.pop() op = tokens[i] num2 = int(tokens[i+1]) if op == '*': temp.append(num1 * num2) elif op == '/': temp.append(num1 / num2) i += 2 else: temp.append(int(tokens[i])) i += 1 # 第二步:处理剩余的加减运算 result = temp[0] for i in range(1, len(temp)): # 对应原tokens中的运算符位置 op = tokens[(i-1)*2 + 1] num = temp[i] if op == '+': result += num elif op == '-': result -= num return result try: print("计算结果:", calculate_expression(tokens)) except (IndexError, ValueError): print("输入格式错误,请检查输入的表达式")
测试示例
- 输入
5 + 5,两个版本都会返回10 - 输入
7 - 2 * 3,基础版本返回15(顺序计算),优化版本返回1(符合运算符优先级)
内容的提问来源于stack exchange,提问作者mark robbin
相关产品推荐
相关产品推荐

