我正在创建一个文本计算器,它不能完全按照常规工作。它是这样工作的:
+
表示加法,-
表示减法,*
表示乘法,或{计算:
当用户输入两个以上的操作数时,而不是:
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
时检查操作的冗余代码?在非常感谢任何帮助。如有必要,请索取规格。如果你投反对票,请说明你这样做的原因,这样我就可以做出改变。在
关键思想是,构建一个
dict
:我将三个项与每个运算符符号相关联:要使用的函数、要使用的名称、和(你似乎忽略了!)“中立”的起点。总是从
0
开始,因为你做的是使乘积和商可以乘或除任何东西,这没关系,如果它从0
开始,它就永远保持在0
处,你知道吗!-)在现在事情变得简单了…:
^{pr2}$我不知道为什么你那么喜欢
global
并且毫无必要地乱编索引。is_number
显然是float
s的一个方法,而您正在将result
初始化为int
,因此它可能会使我用一个合理的检查替换它的代码崩溃。在不需要}是有意义的;但是我把它放在这里,以防有任何合理的理由将其全局化(我想不出任何理由)。在
global
来命名你只使用的名字,没有分配,当然,在结尾丢失global result
而改为{但其核心思想是:在Python中,出于调度目的,首先要考虑
dict
!在补充:OP在评论中提出了一些特殊的问题,例如“import语句的功能到底是什么?”显然,答案是“使另一个模块可用”(在本例中,是Python标准库中的模块
operator
,以获得执行加法、乘法等操作的函数)。显然,“中性起点是什么”的答案是“在开始加法、乘法等之前,result
的初始值”。在在Q中OP的原始代码中,
result
被无条件地初始化为零。如果你从零开始,再乘以任何一个数,它会一直保持在零,这不是一系列乘法的“中性”起点,它更像是一个“固定”点,某种意义上的“黑洞”。所以,我根据操作使用了不同的初始值。在相关问题 更多 >
编程相关推荐