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. common-io 文件监听例子

    package com.junge.spring.demo.commonio; import org.apache.commons.io.monitor.FileAlterationListenerA ...

  2. WPF PrismDialog PopupWindowAction使用MetroWindow

    本示例必须在prism5.0版本以上 PopupWindowAction如何使用MetroWindow?   public class Window1ViewModel:BindableBase,II ...

  3. Thinking in Java Chapter 14

    From Thinking in Java 4th Edition RTTI(Run-Time Type Information),运行时类型信息,使得你可以在程序运行时发现和使用类型信息.对RTTI ...

  4. 常用的评价指标:accuracy、precision、recall、F1-score、ROC-AUC、PR-AUC

  5. LeetCode:146_LRU cache | LRU缓存设计 | Hard

    题目:LRU cache Design and implement a data structure for Least Recently Used (LRU) cache. It should su ...

  6. mysql常用function

    前言: 本文主要是参考mysql官方文档,并加上自己的测试用例,来加深自己对mysql函数的理解,也借此平台与大家分享,如有不妥和错误之处欢迎读者评论,我会及时改正,愿与大家一起学习进步. 概述: 所 ...

  7. hdu 5972---Regular Number(字符串匹配)

    题目链接 Problem Description Using regular expression to define a numeric string is a very common thing. ...

  8. Tensflow的targmax函数

    一.函数: argmax( input, axis=None, name=None, dimension=None, output_type=tf.int64 ) 简单的说,tf.argmax就是返回 ...

  9. Android 系统服务

    模拟器版本 Android 4.1.2 - API Level 16 CMD 下输入:adb shell service list   服务名 对象 0 phone com.android.inter ...

  10. 全网最详细的IDEA、Eclipse和MyEclipse之间于Java web项目发布到Tomcat上运行成功的对比事宜【博主强烈推荐】【适合普通的还是Maven方式创建的】(图文详解)

    不多说,直接上干货! IDEA [适合公司业务]全网最详细的IDEA里如何正确新建[普通或者Maven]的Java web项目并发布到Tomcat上运行成功[博主强烈推荐](类似eclipse里同一个 ...