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 练习: 计算器的更多相关文章

  1. 从零开始学习PYTHON3讲义(二)把Python当做计算器

    <从零开始PYTHON3>第二讲 上一讲我们说过了如何启动Python IDLE集成开发学习环境,macOS/Linux都可以在命令行执行idle3.Windows则从开始菜单中去寻找ID ...

  2. python实现计算器

    计算器功能 实现优先级解析,加减乘除四则运算 自定义小数位精度 实现思想: 先找到最里层括号,根据乘除,加减优先级,调用写好的乘除.加减运算函数算出括号内总值,再将原括号式用所得值替换,此过程循环进行 ...

  3. python之计算器(第四天)

    作业: 使用正则表达式和递归实现计算器功能. 实现: 1.实现带括号的计算 2.实现指数.加减乘除求余等功能 一.实例说明: 本实例自己写了个版本,但依旧存在一点bug,例:-2-2等计算问题,故最后 ...

  4. 利用PYTHON设计计算器功能

    通过利用PYTHON 设计处理计算器的功能如: 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 ))- (-4*3 ...

  5. Python科学计算器(计算器)

    说明 该计算器主要是为了练习正则表达式以及python基础所写:代码比较low! 运行过程 请输入你的计算公式, 计算器会将计算结果输出到屏幕上(此处会打印步骤); 退出(exit/quit) MyC ...

  6. Python数学运算入门把Python当作计算器

    让我们尝试一些简单的 Python 命令.启动解释器,等待界面中的提示符,>>> (这应该花不了多少时间). 3.1.1. 数字 解释器就像一个简单的计算器一样:你可以在里面输入一个 ...

  7. python之计算器

    开发一个简单的python计算器 1.实现加减乘除及拓号优先级解析 2.用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * ...

  8. [IT学习]转载python 项目 计算器

    这个是从网上搜到的Python小项目之计算器(原文地址:http://www.2cto.com/kf/201402/279637.html).但该段代码估计是Python 2 写的. 如果你使用的程序 ...

  9. python编写计算器

    程序代码 # coding: utf-8# 将tkinter改为Tkinter兼容Python 2.xfrom tkinter import *class App: def __init__(self ...

  10. python写计算器

    #!/usr/bin/env python # -*- coding:utf-8 -*- import re def chu(arg1): #定义加减 arg = arg1[0] #beacuse p ...

随机推荐

  1. C# Autofac集成之Framework WebAPI

    Web API 2集成需要Autofac.WebApi2 NuGet包. Web API集成需要Autofac.WebApi NuGet包. Web API集成为控制器,模型绑定器和操作过滤器提供了依 ...

  2. WPF学习笔记(6):DataSet更新后台数据库个别列失败的问题

    WPF窗体中建有一个DataGrid,运行后修改各行数据,通过Update方法更新后台数据库.发现在数据库中,其中一列FAcctID(文本型)每次都会变为0,还有一列FDebit(货币型)不能更新,其 ...

  3. SpringDataSolr 过滤(或者叫筛选)查询

    // 被本类调用 private Map searchList(Map searchMap) { // 1.1关键字查询 SimpleHighlightQuery highlightQuery = n ...

  4. 安装过redis集群,重新做集群办法:

    二:找到问题:这个地方IP的问题,以上是正确的版本,以前有问题的版本的Ip是127.0.0.1, 原因是这个地方以前我没注释redis.conf文件中的bind 127.0.0.1 然后做集群时使用的 ...

  5. [CocoaPods]pod安装与pod更新

    简介 许多以CocoaPods开头的人似乎认为pod install只在第一次使用CocoaPods设置项目时使用,pod update之后才会使用.但事实并非如此. 本指南的目的是解释何时使用pod ...

  6. 安装 composer 并启动 yii2 项目

    环境 MacOS 10.12.6 PHP 5.6.30 yii2.0 一.composer (类似 node's npm) 1.安装 php -r "copy('https://getcom ...

  7. 撰写一篇博客要求讲述四则运算2的设计思想,源程序代码、运行结果截图、编程总结分析,并按照PSP0级的要求记录开发过程中的时间记录日志。

    一.撰写一篇博客要求讲述四则运算2的设计思想,源程序代码.运行结果截图.编程总结分析,并按照PSP0级的要求记录开发过程中的时间记录日志. 1.设计思想: ①创建test.jsp建立第一个前端界面,提 ...

  8. mysql之UPDATE,SELECT,INSERT语法

    一 :UPDATE语法   UPDATE 是一个修改表中行的DML语句. #单表语法(常用) UPDATE [LOW_PRIORITY] [IGNORE] table_reference SET as ...

  9. request和response简介

    Tomcat收到客户端的http请求,会针对每一次请求,分别创建一个代表请求的request对象.和代表响应的response对象. 既然request对象代表http请求,那么我们获取浏览器提交过来 ...

  10. Rpc简单入门

    RPC这个概念大家都应该很熟悉了,这里不在累述了:使用场景可以参考这篇,本篇主要分享下Thrift和Grpc在.Net Core环境下使用入门.Thirft或者Grps 都支持跨语言.跨平台的Rpc框 ...