文档章节

用python写个简单计算器

码上有春天
 码上有春天
发布于 2016/10/23 21:51
字数 624
阅读 258
收藏 0

总体思路就是先用正则找出计算式最里层的括号,拿计算结果替换括号所在位置后,对新的计算式进行反复迭代,最终算出结果。


import re


def jia(*args):
    '''
    加法解析
    :param args:
    :return:
    '''
    print('jia:', args)
    res = 0
    for i in args:
        #解决*-和/-的情况
        #i = i.replace('*-','#').replace('/-','@')

        jian_list = i.split('-')
        # 减号的拆分要解决负号的情况:把负号拆分后列表中所有为空字符串的元素替换成'0'
        # 还要把*-和/-替换回来
        for id,j in enumerate(jian_list):
            if j=='':
                jian_list[id] = '0'
            else:
                jian_list[id] = j.replace('#','*-').replace('@','/-')

        res += jian(*jian_list)
    return res
def jian(*args):
    '''
    减法解析
    :param args:
    :return:
    '''
    print('jian:', args)
    #减法需要先算出第一个式子,拿第一个式子去减后面的式子
    res = args[0:1]

    res = chen(*res[0].split('*'))

    for i in args[1:]:
        chen_list = i.split('*')
        res -= chen(*chen_list)
    return res
def chen(*args):
    '''
    乘法解析
    :param args:
    :return:
    '''
    print('chen:',args)
    res = 1
    for i in args:
        chu_list = i.split('/')
        res *= chu(*chu_list)
    return res
def chu(*args):
    '''
    除法解析
    :param args:
    :return:
    '''
    print('chu:', args)
    #除法需要先取出第一个,拿第一个除以后面的
    res = args[0:1]

    res = float(res[0])

    for i in args[1:]:
        i = float(i)
        res /= i
    return res

def simpleCalc(input_str):
    '''
    不带括号的表达式解析
    :param input_str:
    :return:
    '''
    # 去掉最外层的括号
    input_str = input_str.strip('()')
    # 处理 --、+- 的情况,还有 *-、/- 的情况没处理
    input_str = input_str.replace(' ','').replace('--','+').replace('+-','-').replace('*-','#').replace('/-','@')
    #print(input_str)

    #计算加减乘除
    jia_list = input_str.split('+')
    res = jia(*jia_list)
    return res
    #return str(eval(input_str))

def calc(input_str):
    '''
    计算器入口
    :param input_str:
    :return:
    '''
    if len(input_str) == 0:
        print('Wrong input')
        exit(0)
    #print(input_str)
    #查找是否还有括号
    m = re.search('\([^()]+\)', input_str)
    brackets_exists = False
    #print(m)
    if m == None:#不再有括号了,就直接计算
        simple_calc_str = input_str#需要计算的值的字符串就是传入的表达式
    else:#还有括号,就把找到的括号中的表达式计算的值替换括号所在位置
        brackets_exists = True
        simple_calc_str = m.group()#需要计算值的字符串是找到的括号中的表达式

    simple_res = str(simpleCalc(simple_calc_str))
    if brackets_exists:#还有括号,就把找到的括号中的表达式计算的值替换括号所在位置,进入迭代
        return calc(input_str.replace(simple_calc_str,simple_res,1))
    else:#没有括号就直接把计算结果返回
        return simple_res

if __name__ == '__main__':
    # input_str = '3 * 4 + (-4 / 2 - 8 - 3 * 2 + ( 4 - 5 / 2 + 11 - ( 2 * 3 - 9 ) - 12 )) + 20 - 3 * 2 - ( 5 + 8 / 4)'
    # input_str = '3/(-1) - (4*-2)/(1+1)/(1+1)'
    input_str = '1-2*((60-30+(-40/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))'

    result = calc(input_str)
    print(result)

 

© 著作权归作者所有

码上有春天
粉丝 5
博文 82
码字总数 55905
作品 0
广州
程序员
私信 提问
python Tkinter学习笔记 简单的计算器 03

这个是用python 写的简单计算器 。代码从‘Python与Tkinter编程’书中的例子中写下来的 '''Created on 2013-9-27 @author: liangqianwu ''' coding:utf-8* from Tkinter import *def frame(......

梁大帅
2013/09/27
0
2
rpCalc 0.7.0 发布,简单的 RPN 计算器

rpCalc 0.7.0 发布,此版本从 Python 2 移植到了 Python 3,同时还有一些代码清理he系统调整。 简单的RPN计算器;

oschina
2014/01/26
288
0
python3测试工具开发快速入门教程2数据结构1变量与赋值

语法基础 解释器像简单的计算器:可以输入表达式,它会返回值。表达式语法很简单:运算符 + , - , * 和 / 与其它语言一样(例如Pascal或C);括号用于分组。例如: 整数(例如2、4、20 )的类型...

人工智能python自动化测试
2018/08/30
0
0
The Python Tutorial 之 Whetting Your Appetite

如果你经常性的需要用计算机去做一些事情,这些事情中大部分情况可能是经常重复性的或者是枯燥的,最终(eventually)你会想让这些任务(task)实现自动化(automate)。例如,你可能希望在一...

Koma
2015/02/28
0
2
《Python3.6官方文档》– 第一章

1. 开胃小菜 如果你有许多在电脑上的工作要做,并发现其中的任务一些是可以自动化的。 例如,你可能希望执行一个能够搜索并替换大量的文本文件程序,或者是有需要以一种复杂的方式去重命名和...

jowu
2018/01/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

【AI实战】手把手教你深度学习文字识别(文字检测篇:基于MSER, CTPN, SegLink, EAST等方法)

文字检测是文字识别过程中的一个非常重要的环节,文字检测的主要目标是将图片中的文字区域位置检测出来,以便于进行后面的文字识别,只有找到了文本所在区域,才能对其内容进行识别。 文字检...

雪饼
今天
15
0
思维导图XMind 8 Pro 绿化方法(附序列号)

按部就班: Step 1 -全新下载最新版本的 Xmind 8(注必须是英文官方的版本,中文代{过}{滤}理网站的版本修改过,无法使用pj); Step 2 -安装完毕后,点击文末的下载按钮下载pj补丁文件包,将...

一只小青蛙
今天
10
0
数据结构(ER数据库)设计规范

表命名规范 表命名的规则分为3个层级,层级之间通过_分割,例如b_r_identity、d_l_identity。规约为: [leavel]_[type]_[name] [leavel] 表示数据库表的层级和功能,分为: s:业务无关的系统...

随风溜达的向日葵
今天
10
0
阿里Sentinel控制台源码修改-对接Apollo规则持久化

https://github.com/alibaba/Sentinel/wiki/%E5%9C%A8%E7%94%9F%E4%BA%A7%E7%8E%AF%E5%A2%83%E4%B8%AD%E4%BD%BF%E7%94%A8-Sentinel 动态规则扩展 https://github.com/alibaba/Sentinel/wiki......

jxlgzwh
昨天
14
0
在Linux系统中创建SSH服务器别名

如果你经常通过 SSH 访问许多不同的远程系统,这个技巧将为你节省一些时间。你可以通过 SSH 为频繁访问的系统创建 SSH 别名,这样你就不必记住所有不同的用户名、主机名、SSH 端口号和 IP 地...

老孟的Linux私房菜
昨天
14
1

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部