# -------------------------------------------------------------------------------------
# @文件: 计算器.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()