Pythonic的方式来计算计算器的函数 - Python

时间:2015-01-22 03:25:40

标签: python if-statement while-loop

我正在创建一个不能完全按常规工作的文本计算器。它的工作原理如下:

  • 操作输入:用户输入计算器将处理的操作(+用于添加,-用于减法,*用于乘法,或{{ 1}}用于分裂)
  • 操作数输入:用户在计算的每个操作数中输入,按操作数之间的Return键。一旦用户输入了所有他想要的操作数,击中Return三次就会启动计算。

计算:

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

/

它确实:

operand1 plus/minus/times/divided by operand2

依此类推所有输入的操作数。

此代码只是循环输入操作数列表operand1 plus/minus/times/divided by operand2 plus/minus/times/divided by operand3,并使用所选操作operandListoperation是计算结果):

result

这是非常低效的,因为它检查操作两次,一次在while循环内,这甚至更糟。

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

如果我这样做,你会发现每个代码块之间的唯一区别是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() 中的操作符号。

我怎么能:

  • 删除检查操作的冗余代码并执行相应的循环,
  • 在显示result +,-,*,/= operandList[operateCount]
  • 时,减少/更改检查操作的冗余代码

非常感谢任何帮助。如有必要,请询问规格。如果您投票,请评论您这样做的原因,以便我可以进行更改。

1 个答案:

答案 0 :(得分:8)

关键的想法是,建立一个dict

import operator

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

我正在关联每个运算符符号三个项目:要使用的函数,要使用的名称,(您似乎忽略了它们)!“中立的“起点。总是在0开始,因为你做的产品和商品是可行的 - 乘以和除以任何,无关紧要,如果它从0开始,保持 at永远0,你知道! - )

现在事情变得更简单......:

def Calculate():
    global result
    op, resultName, result = ops[operation]
    for item in operandList:
        result = op(result, item)
    if result == int(result):
        print(int(result), '=', resultName)
    else:
        print(result, '=', resultName)
    print()

没有想法为什么你非常喜欢global并且在没有必要的情况下搞乱索引。 is_number显然仅是float的一种方法,而您正在将result初始化为int,因此可能会导致代码崩溃 - 我已将其替换为明智的检查。

对于您仅使用的名称和分配,不需要global - 当然,丢失global result而不是{{1}是有意义的}} 在末尾;但我已经离开了,以防万一有任何理智让它全球化(我想不出任何事情)。

但核心思想是:在Python中,出于调度的目的,首先考虑return result

补充:OP在评论中提出了一些特殊问题,例如“导入声明的功能究竟是什么?” - 显然,答案是“使另一个模块可用”(在本例中,来自Python标准库的模块dict,以使其函数执行加法,乘法等)。另外“什么是'中性起点'” - 显然,答案是“operator的初始值,然后才开始添加,乘法等等。

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