所以我目前正在尝试编写一个基本上知道如何处理数学表达式的代码,它还有一些其他的小功能,例如计算平均值、从 2 中获取最小数、从 2 中获取最大数等等。 问题是,它目前缺少支持括号的能力。我需要它来处理多个括号,或者括号内的括号。您建议如何以“简单”且易于理解的方式实现它?
注意:我是一个初学者,正在努力向上:) 这是我的代码:
def parse_expression(expr):
elements = list(expr.replace(" ", ""))
exercise = []
operators = ('+', '-', '*', '/', '$', '&', '@') #### @ = Average, & = Min, $ = Max
i = 0
while i < len(elements):
if elements[i].isdigit() or (elements[i] == '-' and (i == 0 or elements[i - 1] in operators)):
num = elements[i]
while i + 1 < len(elements) and (elements[i + 1].isdigit() or elements[i + 1] == '.'):
i += 1
num += elements[i]
exercise.append(float(num))
elif elements[i] in operators:
exercise.append(elements[i])
i += 1
return exercise
def calculate_result(exercise):
k = 0
while k < len(exercise):
if exercise[k] == '$' or exercise[k] == '&' or exercise[k] == '@':
operator = exercise[k]
left_num = exercise[k - 1]
right_num = exercise[k + 1]
if operator == '$':
result = max(left_num, right_num)
elif operator == '&':
result = min(left_num, right_num)
elif operator == '@':
result = (left_num + right_num) / (2)
exercise[k] = result
exercise.pop(k + 1)
exercise.pop(k - 1)
else:
k += 1
k = 0
while k < len(exercise):
if exercise[k] == '*' or exercise[k] == '/':
operator = exercise[k]
left_num = exercise[k - 1]
right_num = exercise[k + 1]
if operator == '*':
result = left_num * right_num
elif operator == '/':
try:
result = left_num / right_num
except ZeroDivisionError:
print("ERROR: Can't divide by zero. ")
return None
exercise[k] = result
exercise.pop(k + 1)
exercise.pop(k - 1)
k -= 1
k += 1
k = 0
while k < len(exercise):
if exercise[k] == '+' or exercise[k] == '-':
operator = exercise[k]
left_num = exercise[k - 1]
right_num = exercise[k + 1]
if operator == '+':
result = left_num + right_num
elif operator == '-':
result = left_num - right_num
exercise[k] = result
exercise.pop(k + 1)
exercise.pop(k - 1)
else:
k += 1
return round(exercise[0], 2)
while True:
expr = input("calc> ")
if expr in ('EXIT', 'Exit', 'exit'):
print("Bye")
break
exercise = parse_expression(expr)
if len([s for s in exercise if isinstance(s, float)]) == 0:
print("Invalid input.")
else:
result = calculate_result(exercise)
if result is not None:
print(f"{expr} = {result}")
在
parse_expression()
中,每当您看到左括号时就开始一个新表达式,然后当您看到右括号时发送然后将其发送到 parse_expression()
expression = '2 + 3 * (4 + 5)'
new_expression = '4 + 5'
我假设你这样做是为了好玩,因为 python 可以用
eval(exp)
解释数学字符串
so
eval('2 + 3 * (4 + 5)')
输出 29,但不确定它能解析多复杂。
编辑:
对于更高级的方法,您可以阅读Shunting Yard算法,一种解析算术或逻辑表达式或两者组合的方法,以中缀表示法指定。