我正在创建一个不能完全按常规工作的文本计算器。它的工作原理如下:
+
用于添加,-
用于减法,*
用于乘法,或{{ 1}}用于分裂)计算:
当用户输入两个以上的操作数时,而不是:
/
,
它确实:
operand1 plus/minus/times/divided by operand2
,
依此类推所有输入的操作数。
此代码只是循环输入操作数列表operand1 plus/minus/times/divided by operand2 plus/minus/times/divided by operand3
,并使用所选操作operandList
(operation
是计算结果):
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]
?非常感谢任何帮助。如有必要,请询问规格。如果您投票,请评论您这样做的原因,以便我可以进行更改。
答案 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
被无条件初始化为零。如果你从零开始并乘以任何数字,它保持零 - 它不是一系列乘法的“中性”起点,它更像是一个“固定”点,从某种意义上说是一个“黑洞”。因此,我根据操作使用了不同的初始值。