在Python中如何压缩这个if语句?
我目前正在用Python创建一个计算器,遇到了一个小问题:if-else语句中有28个条件:在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
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的解释在哪里我认为更专业的异常会更好,例如,
算术错误
。