1 Star 0 Fork 0

Python程序设计/20181221_zengyutao

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
计算器.py 4.25 KB
一键复制 编辑 原始数据 按行查看 历史
曾宇涛 提交于 2020-04-13 10:42 +08:00 . 封装继承多态
import re
def is_operator(operator): #判断是否为运算符
operators = ['+', '-', '*', '/', '(', ')']
if operator in operators:
return True
else:
return False
def calculate(n1, n2, operator): #对参数进行运算
result = 0
if operator == "+":
result = n1 + n2
if operator == "-":
result = n1 - n2
if operator == "*":
result = n1 * n2
if operator == "/":
result = n1 / n2
return result
def formula_format(formula):
formula = re.sub(' ', '', formula) # 去掉表达式式中的空格
formula_list = [i for i in re.split('(\-\d+\.?\d*)', formula) if i] # 以 '-' + '数字' 分割表达式
final_formula = [] # 创建最终的表达式列表
for item in formula_list:
if len(final_formula) == 0 and re.search('^\-\d+\.?\d*$', item): # 判断第一个是以横杠开头的数字是不是负数。
final_formula.append(item)
elif len(final_formula) > 0:
if re.search('[\+\-\*\/\(]$', final_formula[-1]): # 判断表达式列表中最后一个是不是运算符号
final_formula.append(item)
else: #分割表达式并写入表达式列表
item_split = [i for i in re.split('([\+\-\*\/\(\)])', item) if i]
final_formula += item_split
else: #分割表达式并写入表达式列表
item_split = [i for i in re.split('([\+\-\*\/\(\)])', item) if i]
final_formula += item_split
return final_formula #返回最终的表达式列表
def decision(tail, now): #tail是栈顶元素,now是当前元素
# 定义4种运算符优先度
rank1 = ['+', '-']
rank2 = ['*', '/']
rank3 = ['(']
rank4 = [')']
if tail in rank1:
if now in rank2 or now in rank3: # 说明连续两个运算优先级不一样,需要入栈
return -1
else:
return 1
elif tail in rank2:
if now in rank3:
return -1
else:
return 1
elif tail in rank3:
if now in rank4:
return 0 # 如果'(' 遇上 ')' 需要出栈 '('
else:
return -1 # 只要栈顶元素为'(',当前元素不是')',都应入栈。
else:
return -1
def final_calc(formula_list):
num = [] # 定义数字栈
operators = [] # 定义运算符栈
for x in formula_list:
operator = is_operator(x) # 调用函数判断,具体函数比较简单不详细介绍,在下面会给出
if not operator: # 判断是否为运算符,否则压入数字栈
num.append(float(x)) # 将字符串转换为浮点数进行运算,防止数值类型在运算中出现错误
else: # 运算符处理
while True:
if len(operators) == 0: # 如果运算符栈等于0无条件入栈
operators.append(x)
break
tag = decision(operators[-1], x) # 调用 decision 函数判断运算符优先级
if tag == -1:
operators.append(x) # 如果是-1压入运算符栈进入下一次循环
break
elif tag == 0:
operators.pop() # 如果是0弹出运算符栈内最后一个'(', 丢掉当前')',进入下一次循环
break
elif tag == 1:
op = operators.pop() # 如果是1弹出运算符栈内最后两个元素,弹出数字栈最后两位元素。
num2 = num.pop()
num1 = num.pop()
num.append(calculate(num1, num2, op)) # 将运算之后的结果压入数字栈中
while len(operators) != 0: # 判断是否还有未处理的元素
op = operators.pop()
num2 = num.pop()
num1 = num.pop()
num.append(calculate(num1, num2, op))
return num , operators
x=1 #主函数,写了一个循环
while(x):
try:
print("请输入您的计算式")
formula = input()
formula_list = formula_format(formula)
result ,_= final_calc(formula_list)
print("计算结果:", result[0])
x=int(input("是否继续运算? Yes for 1 / No for 0\n"))
except ValueError:
print("请正确输入计算式")
print("谢谢使用,再见!")
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/python_programming/zengyutao20181221.git
git@gitee.com:python_programming/zengyutao20181221.git
python_programming
zengyutao20181221
20181221_zengyutao
master

搜索帮助

371d5123 14472233 46e8bd33 14472233