python 简易计算器(只能计算加减乘除和括号)
2019-03-10 11:56:07来源:博客园 阅读 ()
import re # 格式化字符串函数(消除一些错误的格式) def format_string(string): # 一系列的替换语句 string = string.replace("--", "-") string = string.replace("-+", "-") string = string.replace("++", "+") string = string.replace("*+", "*") string = string.replace("/+", "/") string = string.replace(" ", "-") return string # 检查函数(检查输入的表达式是否合法) def chek_expression(string): check_result = True # 标志位 if not string.count("(") == string.count(")"): # 检查括号是否完整 print("输入错误,未匹配到完整括号!") check_result = False if re.findall('[a-pr-z]+', string.lower()): # 检查是否包含字母 print("输入错误,包含非法字符!") check_result = False return check_result # 加减法函数 def add_minus(string): add_regular = r'[\-]?\d+\.?\d*\+[\-]?\d+\.?\d*' # 定义一个匹配的规则 sub_regular = r'[\-]?\d+\.?\d*\-[\-]?\d+\.?\d*' # 同上 # 注解:[\-]? 如果有负号,匹配负号; \d+ 匹配最少一个数字; \.? 是否有小数点,有就匹配;\d* 是否有数字有就匹配 # \+ 匹配一个加号; [\-]?\d+\.?\d* 这几个同上 # 加法 while re.findall(add_regular, string): # 按照regular规则获取一个表达式,用while循环,把所有加法都算完 add_list = re.findall(add_regular, string) for add_stars in add_list: x, y = add_stars.split('+') # 获取两个做加法的数(以+号作为分割对象),分别赋给x和y add_result = '+' + str(float(x) + float(y)) string = string.replace(add_stars, add_result) # 替换 string = format_string(string) # 减法 while re.findall(sub_regular, string): # 用while循环,把所有减法都算完 sub_list = re.findall(sub_regular, string) for sub_stars in sub_list: x, y = sub_stars.split('-') # 获取两个做减法的数(以-号作为分割对象),分别赋给x和y sub_result = '+' + str(float(x) + float(y)) string = string.replace(sub_stars, sub_result) # 替换 string = format_string(string) return string # 乘、除法函数 def multiply_divide(string): regular = r'[\-]?\d+\.?\d*[*/][\-]?\d+\.?\d*' # 定义一个匹配的规则regular while re.findall(regular, string): expression = re.search(regular, string).group() # 按照regular规则获取一个表达式 # 如果是乘法 if expression.count('*') == 1: x, y = expression.spilt('*') mul_result = str(float(x) * float(y)) string = string.replace(expression, mul_result) # 计算结果替换原表达式 string = format_string(string) # 格式化 # 如果是除法 if expression.count('/') == 1: x, y = expression.spilt('/') div_result = str(float(x) / float(y)) string = string.replace(expression, div_result) string = format_string(string) # 格式化 # 如果是阶乘 if expression.count('**') == 1: x, y = expression.spilt('**') pow_result = 1 for i in range(int(y)): pow_result *= int(x) string = string.replace(expression, str(pow_result)) string = format_string(string) # 格式化 return string # 主程序 while True: source = input("请输入表达式:") # 输入要计算的式子 if source == "Q": # 该判断语句只能写在前面,写后面会报错 exit() # 如果输入是Q,退出 elif chek_expression(source): print("eval result: ", eval(source)) # eval() 是把其他类型转换为字符串 sourse = format_string(source) if source.count("(") > 0: stars = re.search(r'\([^()]*\)', source).group() # 去括号,得到括号里的字符串 replace_stars = multiply_divide(stars) # 将括号的表达式进行乘除运算 replace_stars = add_minus(stars) # 将乘除的结果进行加减运算 source = format_string(source.replace(stars, replace_stars)) # 用计算结果替换括号字符串 # 没有括号直接进行运算 else: replace_stars = multiply_divide(source) # 乘除运算 replace_stars = add_minus(source) # 加减运算 source = source.replace(source, replace_stars)
原文链接:https://www.cnblogs.com/ss-long/p/10500515.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:9,K-近邻算法(KNN)
下一篇:#5 Python面向对象(四)
- python3基础之“术语表(2)” 2019-08-13
- python3 之 字符串编码小结(Unicode、utf-8、gbk、gb2312等 2019-08-13
- Python3安装impala 2019-08-13
- 小白如何入门 Python 爬虫? 2019-08-13
- python_字符串方法 2019-08-13
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash