• 计算器程序编写_python


    一、计算一串字符串的最终值,相当于eval函数功能:

    #!/usr/bin/env python
    # _*_ coding:utf-8 _*_
    #Author:chenxz
    import re
    def check(s):  #检查字符串函数是否合法
        s=s.replace(' ','').strip() #去除空格
        if len(re.findall('(',s)) != len(re.findall(')',s)):#判断括号是否成对
            print("括号不匹配")
            exit()
        if re.search('(([*+/])|([*+-/]))',s): #判断是否含(*/+ 或+-*/) 这种不合法的
            print('格式不正确')
            exit()
        return s
    
    def count_last(sub_str):  #处理n[+-*/]mg格式计算值
        sub_str=re.sub('+-','-',sub_str)  #格式化
        sub_str=re.sub('--', '+', sub_str) #格式化
        if '*' in sub_str:  #计算乘
            sub_list=sub_str.split('*')
            res=str(float(sub_list[0])*float(sub_list[1]))
        elif '/' in sub_str: #计算除
            sub_list=sub_str.split('/')
            res=str(float(sub_list[0])/float(sub_list[1]))
        elif '+' in sub_str: #计算加
            sub_list=sub_str.split('+')
            res=str(float(sub_list[0])+float(sub_list[1]))
        elif '-' in sub_str: #计算减
            sub_list=sub_str.split('-')
            res=str(float(sub_list[0])-float(sub_list[1]))
        return res
    
    def count_mid(cal_str): #处理类似(1+3*5)的字符串中间函数
        cal_str = cal_str[1:-1]  #去除括号
        while re.search('d+.?d{0,}[*/]-?d+.?d{0,}',cal_str):  #循环匹配乘除
            sub_str=re.search('d+.?d{0,}[*/]-?d+.?d{0,}',cal_str).group()
            res=count_last(sub_str)#子函数计算n[*/]m返回对应值
            cal_str=cal_str.replace(sub_str,res)#对应值替代
        while re.search('d+.?d{0,}[+-]-?d+.?d{0,}',cal_str):#循环匹配加减
            sub_str=re.search('d+.?d{0,}[+-]-?d+.?d{0,}',cal_str).group()
            res=count_last(sub_str)#子函数计算n[+-]m返回对应值
            cal_str=cal_str.replace(sub_str,res) #对应值替代
        return cal_str
    
    s= '1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )'
    s=check(s) #检查输入的合法性
    while re.search('([^()]+)',s):  #循环将最里面的括号找出来
        cal_str=re.search('([^()]+)',s).group()
        res=count_mid(cal_str)  #最里面的括号和表达式,通过处理函数返回对应值
        s=s.replace(cal_str,res) #对应值替代
    s=count_mid('(%s)'%s)  #去除完括号之后的字符串,加上括号给count_mid函数能自动计算除结果
    print(s)  #2776677.4952380955
  • 相关阅读:
    Windows下Yarn安装与使用
    Node.js安装及环境配置之Windows篇
    sharding-jdbc—分片策略:Inline行表达式分片策略InlineShardingStrategy(2)
    sharding-jdbc—分片策略:标准分片策略StandardShardingStrategy(1)
    sharding-jdbc—分片策略(总)
    ShardingJdbc 数据脱敏
    ShardingJdbc 数据分布式事务
    Spring Boot整合Sharding-JDBC实现分库分表+读写分离org.apache.shardingsphere+mybatis-plus(4)
    jenkins docker
    nps 使用
  • 原文地址:https://www.cnblogs.com/chenxiaozan/p/12324003.html
Copyright © 2020-2023  润新知