在Python中如何压缩这个if语句?

在Python中如何压缩这个if语句?,python,if-statement,Python,If Statement,我目前正在用Python创建一个计算器,遇到了一个小问题:if-else语句中有28个条件: if operation0 == "+" and operation1 == "+" and operation2 == "+": # First operation is addition print(number0 + number1 + number2 + number3) elif operation0 == "+&q

我目前正在用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是不合理的,任何数量的减少都是值得赞赏的。

您可以使用操作符库并尝试类似的操作

from operator import pow, truediv, mul, add, sub  

operators = {
  '+': add,
  '-': sub,
  '*': mul,
  '/': truediv
}

def calculate(s):
    if s.isdigit():
        return float(s)
    for c in operators.keys():
        left, operator, right = s.partition(c)
        if operator in operators:
            return operators[operator](calculate(left), calculate(right))

calc = input("Type calculation:\n")
print("Answer: " + str(calculate(calc)))

其他一些解决方案也可以在

操作顺序中找到,这很困难,但并非不可能:

#执行操作的辅助函数
def doop(num1、op、num2):
如果op==“^”:
返回num1**num2
如果op==“+”:
返回num1+num2
如果op==“-”:
返回num1-num2
如果op==“*”:
返回num1*num2
如果op==“/”:
返回num1/num2
#如果我们无法识别该操作,则会出现错误
引发异常(“无效操作”)
#具有运算符优先级的集合列表
优先权=[
{"^"},
{"*", "/"},
{"+", "-"}
]
#测试用硬编码值
nums=[1,2,3,4]
ops=[“+”、“-”、“*”]
#这表示1+2-3*4
#从最高到最低优先级开始
对于优先的prec:
#我们必须使用while循环来手动控制'i'`
i=0
而我
免责声明:解决方案可能会使用各种相关概念,但这些概念与此处的解释不太相关

要获得优先级,必须正确解析输入。有几种方法可以做到这一点;一个常见的是Dijkstra算法。
由于这只是一个示例,我们将放弃良好实践(错误处理、类)以获得更简洁的代码

首先,我们需要列出先例。更高的优先级意味着操作符具有更高的优先级,因此它执行得更早

先例={
'^': 3,
'*': 2, '/': 2,
'+': 1, '-': 1
}
然后,我们需要将操作与每个操作符关联起来。为此,我们可以使用
操作员
模块中的功能:

从操作员导入pow、truediv、mul、add、sub
do={
"(二):战俘,,
“*”:mul“/”:truediv,
“+”:添加“-”:子
}
最后,我们需要实现决定何时计算表达式的逻辑。首先,我们比操作多了一个数字,所以我们将其放在堆栈上:

def分流(编号、操作):
堆栈=[numbers.pop(0)]
运算符=[]
然后,我们处理每个运算符对

while len(数字):
运算符=operations.pop(0)
优先级=优先级[运算符]
当一个操作的优先级(执行时间早于当前操作)高于当前操作时(使用
do
dictionary)对其进行求值。我们从堆栈中删除左操作数和右操作数,并从
do
中查找适当的函数以计算结果:

while运算符和优先级[运算符[-1]]>=优先级:
[左,右],堆栈[-2:]=堆栈[-2:],[]
stack.append(do[operators.pop()](左、右))
然后,我们将当前运算符和编号附加到堆栈:

operators.append(运算符)
stack.append(numbers.pop(0))
所有数字和运算符用完后,我们评估其余的运算符,直到只剩下一个数字,然后返回:

而len(stack)>1:
[左,右],堆栈[-2:]=堆栈[-2:],[]
stack.append(do[operators.pop()](左、右))
返回堆栈[0]
把它们放在一起():

从操作员导入pow、truediv、mul、add、sub
先例={
'^': 3,
'*': 2, '/': 2,
'+': 1, '-': 1
}
do={
"(二):战俘,,
“*”:mul“/”:truediv,
“+”:添加“-”:子
}
def分流(数量、操作):
堆栈=[numbers.pop(0)]
运算符=[]
而len(数字):
运算符=operations.pop(0)
优先级=优先级[运算符]
而运算符和优先级[运算符[-1]]>=优先级:
[左,右],堆栈[-2:]=堆栈[-2:],[]
stack.append(do[operators.pop()](左、右))
运算符。追加(运算符)
stack.append(numbers.pop(0))
而len(stack)>1:
[左,右],堆栈[-2:]=堆栈[-2:],[]
stack.append(do[operators.pop()](左、右))
返回堆栈[0]

对多个值执行公共处理时,应使用列表而不是单个变量。这允许您将通用逻辑应用于元素,并基于可存储在变量中的索引对其进行操作:

def compute(*operNums):
    operNums   = list(operNums)
    numbers    = operNums[::2]  # [number0,number1,number2,number3]
    operations = operNums[1::2] # [operation0,operation1,operation2]
    while operations:           # process list until all operations performed
        for op in ("^","**","*","+"):          # find highest priority operation
            if op not in operations: continue
            i = operations.index(op)           # index of operation
            operations.pop(i)                  # remove completed operation
            if   op in ["^","**"]: numbers[i] **= numbers.pop(i+1) # remove right side
            elif op == "*":        numbers[i]  *= numbers.pop(i+1) # left side number
            elif op == "+":        numbers[i]  += numbers.pop(i+1) # is replaced by result   
            else: return "ERROR"
    return numbers[0]

print(compute(1,"+",2,"**",3,"*",5)) # 41

就像karl的回答一样,不处理先例我认为最好的是实现.aplet的解释在哪里我认为更专业的异常会更好,例如,
算术错误