# ------------------------------------------------------------------------------------- # @文件: 计算器.py # @工程: blog # @时间: 2018/3/17 20:14 # @作者: liu yang # @博客: www.liuyang1.club # @邮箱: liuyang0001@outlook.com # ------------------------------------------------------------------------------------ # 编码格式 # -*- coding: utf-8 -*- # Python版本 # #!/usr/bin/python3 import re exprs = ‘‘ # 表达式 sum = 0 # 结果 flag = ‘new‘ # 计算标志位 def License(): print(" **********控制台计算器***********\n ·支持+-×/运算,指数运算(^),\n ·支持包含括号的长表达式输入\n ·欢迎访问博客:www.liuyang1.club \n ********CopyRight(c) 2018 ********\n ") def BracketUnbalanceCheck(str_in): num = 0 for i in str_in: if i == ‘(‘: num += 1 elif i == ‘)‘: num -= 1 if num != 0: # 括号不平衡 print("错误:输入的括号不平衡,请重新输入\n") return 1 else: # 括号平衡 return -1 def CharErrorCheck(str_in): if re.findall(r‘[&a-zA-Z<>,?~!@#$%";:]‘, str_in): # 正则表达式校验输入字符串的合法性 print(‘错误:表达式包含非法字符,请重新输入\n‘) return 1 else: return -1 def InputExpression(): global exprs while not (CharErrorCheck(exprs) == -1 and BracketUnbalanceCheck(exprs) == -1): # 直到得到一个合法的表达式 exprs = input("继续输入表达式:\n") m = re.match(r‘^[\^/\*+\-\\]\w*‘, exprs) # 匹配输入字符串的第一个字符是否是运算符,判断继续运算还是开始新计算 if m: return ‘continue‘ else: return ‘new‘ def Compute(flag): global exprs global sum exprs = exprs.replace(‘^‘, ‘**‘) # 将^替换为** if flag == ‘continue‘: exprs = str(sum) + exprs try: sum = eval(exprs) print("计算式:", exprs) print(exprs, "= " + str(sum)) except SyntaxError: print("错误:继续计算时出现语法错误,程序返回\n") except ZeroDivisionError: print("错误:除数不能为0,程序返回\n") def main(): global exprs, flag License() while True: exprs = input("输入表达式:") flag = InputExpression() Compute(flag) if __name__ == ‘__main__‘: main()