为计算器编写计算函数的Python方法Python

2024-05-31 23:52:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在创建一个文本计算器,它不能完全按照常规工作。它是这样工作的:

  • 运算输入:用户输入计算器将处理的运算(+表示加法,-表示减法,*表示乘法,或{}表示除法)
  • 操作数输入:用户在计算的每个操作数中输入,按操作数之间的回车键。一旦用户输入了所需的所有操作数,按三次回车键开始计算。在

计算:

当用户输入两个以上的操作数时,而不是:

operand1 plus/minus/times/divided by operand2

它确实:

operand1 plus/minus/times/divided by operand2 plus/minus/times/divided by operand3

对于所有输入的操作数,依此类推。在

此代码只需循环输入操作数列表operandList,并使用所选操作operation(而{}是计算的结果):

def Calculate():
    global operation, operandList, result
    operateCount = 0
    result = 0
    while operateCount < len(operandList):
        if operation == '+':
            result += operandList[operateCount]
        elif operation == '-':
            result -= operandList[operateCount]
        elif operation == '*':
            result *= operandList[operateCount]
        elif operation == '/':
            result /= operandList[operateCount]        
        operateCount += 1

    if operation == '+':
        resultName = 'Sum'    
    elif operation == '-':
        resultName = 'Difference'
    elif operation == '*':
        resultName = 'Product'
    elif operation == '/':
        resultName = 'Quotient'

    if result.is_integer():
        print(int(result), '=', resultName)
    else:
        print(result, '=', resultName)
    print()

这是超低效的,因为它检查操作两次,一次在while循环中,这更糟糕。在

显然,如果我为每个操作编写一个while循环块,并以if语句开始每个循环块,以检查是否有更糟糕的操作。在

如果我这么做了,你会发现每一个代码块之间的唯一区别是操作sign-in result +,-,*,/= operandList[operateCount]。在

我怎样才能:

  • 删除检查操作并执行相应循环的冗余代码,以及
  • 减少/更改在显示result时检查操作的冗余代码?在

非常感谢任何帮助。如有必要,请索取规格。如果你投反对票,请说明你这样做的原因,这样我就可以做出改变。在


Tags: 代码用户byifplusresultoperationtimes
1条回答
网友
1楼 · 发布于 2024-05-31 23:52:40

关键思想是,构建一个dict

import operator

ops = {
    '+': (operator.add, 'Sum', 0),
    '-': (operator.sub, 'Difference', 0),
    '*': (operator.mul, 'Product', 1),
    '/': (operator.truediv, 'Quotient', 1),
}

我将三个项与每个运算符符号相关联:要使用的函数、要使用的名称、(你似乎忽略了!)“中立”的起点。总是从0开始,因为你做的是使乘积和商可以乘或除任何东西,这没关系,如果它从0开始,它就永远保持在0处,你知道吗!-)在

现在事情变得简单了…:

^{pr2}$

我不知道为什么你那么喜欢global并且毫无必要地乱编索引。is_number显然是floats的一个方法,而您正在将result初始化为int,因此它可能会使我用一个合理的检查替换它的代码崩溃。在

不需要global来命名你只使用的名字,没有分配,当然,在结尾丢失global result而改为{}是有意义的;但是我把它放在这里,以防有任何合理的理由将其全局化(我想不出任何理由)。在

但其核心思想是:在Python中,出于调度目的,首先要考虑dict!在

补充:OP在评论中提出了一些特殊的问题,例如“import语句的功能到底是什么?”显然,答案是“使另一个模块可用”(在本例中,是Python标准库中的模块operator,以获得执行加法、乘法等操作的函数)。显然,“中性起点是什么”的答案是“在开始加法、乘法等之前,result的初始值”。在

在Q中OP的原始代码中,result被无条件地初始化为零。如果你从零开始,再乘以任何一个数,它会一直保持在零,这不是一系列乘法的“中性”起点,它更像是一个“固定”点,某种意义上的“黑洞”。所以,我根据操作使用了不同的初始值。在

相关问题 更多 >