You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 20:25:11