我目前正在用Python创建一个计算器,遇到了一个小问题:if-else语句中有28个条件:
if operation0 == "+" and operation1 == "+" and operation2 == "+": # First operation is addition
print(number0 + number1 + number2 + number3)
elif operation0 == "+" and operation1 == "+" and operation2 == "*":
print(number0 + number1 + number2 * number3)
elif operation0 == "+" and operation1 == "+" and operation2 == "^":
print(number0 + number1 + number2 ** number3)
elif operation0 == "+" and operation1 == "*" and operation2 == "+":
print(number0 + number1 * number2 + number3)
elif operation0 == "+" and operation1 == "*" and operation2 == "*":
print(number0 + number1 * number2 * number3)
elif operation0 == "+" and operation1 == "*" and operation2 == "^":
print(number0 + number1 * number2 ** number3)
elif operation0 == "+" and operation1 == "^" and operation2 == "+":
print(number0 + number1 ** number2 + number3)
elif operation0 == "+" and operation1 == "^" and operation2 == "*":
print(number0 + number1 ** number2 * number3)
elif operation0 == "+" and operation1 == "^" and operation2 == "^":
print(number0 + number1 ** number2 ** number3)
elif operation0 == "*" and operation1 == "+" and operation2 == "+": # First operation is multiplication
print(number0 * number1 + number2 + number3)
elif operation0 == "*" and operation1 == "+" and operation2 == "*":
print(number0 * number1 + number2 * number3)
elif operation0 == "*" and operation1 == "+" and operation2 == "^":
print(number0 * number1 + number2 ** number3)
elif operation0 == "*" and operation1 == "*" and operation2 == "+":
print(number0 * number1 * number2 + number3)
elif operation0 == "*" and operation1 == "*" and operation2 == "*":
print(number0 * number1 * number2 * number3)
elif operation0 == "*" and operation1 == "*" and operation2 == "^":
print(number0 * number1 * number2 ** number3)
elif operation0 == "*" and operation1 == "^" and operation2 == "+":
print(number0 * number1 ** number2 + number3)
elif operation0 == "*" and operation1 == "^" and operation2 == "*":
print(number0 * number1 ** number2 * number3)
elif operation0 == "*" and operation1 == "^" and operation2 == "^":
print(number0 * number1 ** number2 ** number3)
elif operation0 == "^" and operation1 == "+" and operation2 == "+": # First operation is exponentiation
print(number0 ** number1 + number2 + number3)
elif operation0 == "^" and operation1 == "+" and operation2 == "*":
print(number0 ** number1 + number2 * number3)
elif operation0 == "^" and operation1 == "+" and operation2 == "^":
print(number0 ** number1 + number2 ** number3)
elif operation0 == "^" and operation1 == "*" and operation2 == "+":
print(number0 ** number1 * number2 + number3)
elif operation0 == "^" and operation1 == "*" and operation2 == "*":
print(number0 ** number1 * number2 * number3)
elif operation0 == "^" and operation1 == "*" and operation2 == "^":
print(number0 ** number1 * number2 ** number3)
elif operation0 == "^" and operation1 == "^" and operation2 == "+":
print(number0 ** number1 ** number2 + number3)
elif operation0 == "^" and operation1 == "^" and operation2 == "*":
print(number0 ** number1 ** number2 * number3)
elif operation0 == "^" and operation1 == "^" and operation2 == "^":
print(number0 ** number1 ** number2 ** number3)
else:
print("Error")
我试过的东西都不管用,我在这个网站上也找不到任何东西来帮助我压缩代码。如此多的重复ELIF是不合理的,任何数量的减少都将被感激
免责声明:解决方案可能会使用各种不相关的概念,无法在此处进行解释
要获得优先级,必须正确解析输入。有几种方法可以做到这一点;一个常见的是Dijkstra的shunting yard算法。
由于这只是一个示例,我们将放弃良好实践(错误处理、类)以获得更简洁的代码
首先,我们需要列出先例。更高的优先级意味着操作符具有更高的优先级,因此它执行得更早
然后,我们需要将操作与每个操作符关联起来。为此,我们可以使用
operator
模块中的函数:最后,我们需要实现决定何时计算表达式的逻辑。首先,我们比操作多了一个数字,所以我们将其放在堆栈上:
然后,我们处理每个运算符对
当一个操作的优先级(执行时间早于当前操作)高于当前操作时(使用
do
字典)对其求值。我们从堆栈中删除左操作数和右操作数,并从do
中查找适当的函数以计算结果:然后,我们将当前运算符和编号附加到堆栈:
所有数字和运算符用完后,我们评估其余的运算符,直到只剩下一个数字,然后返回:
把它们放在一起(Try it online!):
在对多个值执行公共处理时,应使用列表而不是单个变量。这允许您将通用逻辑应用于元素,并基于可存储在变量中的索引对其进行操作:
操作顺序使这变得困难,但并非不可能:
相关问题 更多 >
编程相关推荐