Python 练习: 计算器
import re
def format_string(s): # 对表达式进行格式化
s = s.replace(' ', '')
s = s.replace("--", "+")
s = s.replace("++", "+")
s = s.replace("+-", "-")
s = s.replace("*+", "*")
s = s.replace("/+", "/")
return s
def check_expression(s): # 对表达式进行检测
flag = True
if not s.count("(") == s.count(")"):
print("括号没有闭合")
flag = False
if re.findall('[a-z]+', s.lower()):
print("有非法字符")
flag = False
return flag
def calc_mul_div(s):
regular = '[\-]?\d+\.?\d*[*/][\-]?\d+\.?\d*'
while re.findall(regular, s):
expression = re.search(regular, s).group()
if expression.count("*"): # 判断是否是乘法
x, y = expression.split("*")
mul_result = str(float(x) * float(y))
s = s.replace(expression, mul_result)
s = format_string(s)
if expression.count("/"): # 判断是否是除法
x, y = expression.split('/')
div_result = str(float(x) / float(y))
s = s.replace(expression, div_result)
s = format_string(s)
return s
def calc_add_sub(s): # 判断加减法
add_regular = '[\-]?\d+\.?\d*\+[\-]?\d+\.?\d*'
sub_regular = '[\-]?\d+\.?\d*\-[\-]?\d+\.?\d*'
while re.findall(add_regular, s):
add_list = re.findall(add_regular, s)
for add_str in add_list:
x, y = add_str.split("+")
add_result = "+" + str(float(x) + float(y))
s = s.replace(add_str, add_result)
s = format_string(s)
while re.findall(sub_regular, s):
sub_list = re.findall(sub_regular, s)
for sub_str in sub_list:
numbers = sub_str.split("-")
if len(numbers) == 3: # 如果表达式类似 -1-1,则 list 是 ['', '1', '1'] ,
# 如果表达式类似 8-2, 则 list 是 ['8', '2']
result = 0
for v in numbers:
if v:
result -= float(v)
else:
x, y = numbers
result = float(x) - float(y)
s = s.replace(sub_str, "+" + str(result))
s = format_string(s)
return s
if __name__ == "__main__":
s = '(( 2 /1 * 7 ) - ( 3 *4 ) )'
if check_expression(s):
s = format_string(s)
while s.count("(") > 0:
strs = re.search('\([^()]*\)', s).group()
replace_str = calc_mul_div(strs)
replace_str = calc_add_sub(replace_str)
s = format_string(s.replace(strs, replace_str[1:-1])) # 去掉多余的括号
else:
replace_str = calc_mul_div(s)
replace_str = calc_add_sub(replace_str)
s = s.replace(s, replace_str)
print("result: ", s.replace("+", ""))
运行结果:
result: 2.0
Python 练习: 计算器的更多相关文章
- 从零开始学习PYTHON3讲义(二)把Python当做计算器
<从零开始PYTHON3>第二讲 上一讲我们说过了如何启动Python IDLE集成开发学习环境,macOS/Linux都可以在命令行执行idle3.Windows则从开始菜单中去寻找ID ...
- python实现计算器
计算器功能 实现优先级解析,加减乘除四则运算 自定义小数位精度 实现思想: 先找到最里层括号,根据乘除,加减优先级,调用写好的乘除.加减运算函数算出括号内总值,再将原括号式用所得值替换,此过程循环进行 ...
- python之计算器(第四天)
作业: 使用正则表达式和递归实现计算器功能. 实现: 1.实现带括号的计算 2.实现指数.加减乘除求余等功能 一.实例说明: 本实例自己写了个版本,但依旧存在一点bug,例:-2-2等计算问题,故最后 ...
- 利用PYTHON设计计算器功能
通过利用PYTHON 设计处理计算器的功能如: 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 ))- (-4*3 ...
- Python科学计算器(计算器)
说明 该计算器主要是为了练习正则表达式以及python基础所写:代码比较low! 运行过程 请输入你的计算公式, 计算器会将计算结果输出到屏幕上(此处会打印步骤); 退出(exit/quit) MyC ...
- Python数学运算入门把Python当作计算器
让我们尝试一些简单的 Python 命令.启动解释器,等待界面中的提示符,>>> (这应该花不了多少时间). 3.1.1. 数字 解释器就像一个简单的计算器一样:你可以在里面输入一个 ...
- python之计算器
开发一个简单的python计算器 1.实现加减乘除及拓号优先级解析 2.用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * ...
- [IT学习]转载python 项目 计算器
这个是从网上搜到的Python小项目之计算器(原文地址:http://www.2cto.com/kf/201402/279637.html).但该段代码估计是Python 2 写的. 如果你使用的程序 ...
- python编写计算器
程序代码 # coding: utf-8# 将tkinter改为Tkinter兼容Python 2.xfrom tkinter import *class App: def __init__(self ...
- python写计算器
#!/usr/bin/env python # -*- coding:utf-8 -*- import re def chu(arg1): #定义加减 arg = arg1[0] #beacuse p ...
随机推荐
- Django基础和基本使用
Django基础 Django是Python下的一款著名的Web框架 框架 任何语言进入到高级部分时,会有认证.session.http.连接数据库等等功能操作,没有框架时需要自己实现 框架 是整个或 ...
- CUDA-存储器
1.类型(8种) register: GPU片内 device可读\写 shared memory:GPU片内 device可读\写 local memory:板载显存 device可读\写 cons ...
- Java RMI 使用例子
1.创建协议接口(UserService) /** * */ package com.junge.demo.rmi.protocol.service; import java.io.Serializa ...
- SQL Server 最大并行度
一.概念 1.关联掩码(affinitymask) 为了执行多任务,MicrosoftWindows2000和WindowsServer2003有时会在不同的处理器之间移动进程线程.虽然从操作系统方面 ...
- Centos7.x gnome 桌面美化
一.管理工具 gnome是通过gnome-tweak-tool(优化工具)来管理的,可以在左上角的应用程序->工具里找到. 也可以直接在终端输入gnome-tweak-tool来启动它.启动界面 ...
- Android Studio在项目中添加assets资源目录
第一步: 切换到"Project"视图,找到app --> src --> main目录 第二步: 右键点击main目录,New --> Directory -- ...
- Java 实现将其他类型数据转换成 JSON 字符串工具类
这是网上一个大神实现的,具体出处已找不到,在这做个记录,方便以后使用. package com.wb.test; import java.beans.IntrospectionException; i ...
- 从Redis生成数据表主键标识
对于MySql的全局ID(主键),我们一般采用自增整数列.程序生成GUID.单独的表作为ID生成器,这几种方案各有优劣,最终效率都不能说十分理想(尤其海量数据下),其实通过Redis的INCR可以很方 ...
- centos部署flask
1.先安装uwsgi pip install uwsgi 2.在你的项目根目录下创建一个配置文件uwsgiconfig.ini(uwsgi支持多种配置文件格式,xml,ini,json等) [uwsg ...
- linux下tar.bz2文件的 解压缩方法
一 使用bzip2解压缩命令进行解压缩: bzip2 -d gcc-4.1.0.tar.bz2 二 上面解压完之后执行下面的命令. tar -xvf gcc-4.1.0.tar 或 tar -xvf ...