zoukankan      html  css  js  c++  java
  • python实现简单的计算器功能

    如想实现一个计算器的功能,输入格式为字符串,不能运用python里面的内置方法,出去简单的加减乘除,设计一个相对高级的计算器:

    a = '1 - 2 * ( ( 6 0 -3 0  +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )'
    # 去掉所有的空格
    # 加减乘除 括号
    # 先算括号里的乘除,再算括号里的加减
    主要利用正则表达式来实现,具体代码如下:
    import re
    a = '1 - 2 * ( ( 6 0 -3 0  +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )'
    res_brackets = re.compile(r'([^()]*)') # 寻找带括号的(最内层的括号)
    express = a.replace(' ','')
    def dealwith(exp):
        '''
        deal with the formula
        :param exp: del_brackets data
        :return:
        '''
        exp = exp.replace('+-', '-')
        exp = exp.replace('--', '+')
        return exp
    def add(exp):
        data = re.findall('-?d+.?d*',exp)
        sum_data = 0
        for i in data:
            sum_data += float(i)
        return str(sum_data)
    def multi_divi(exp):
        '''
        calculate multiplication&division
        :param exp: res_multi_divi.search(del_brackets_data)
        :return:
        '''
        res_multi_divi = re.compile(r'-?d+.?d*[*/]-?d+.?d*')
        while res_multi_divi.search(exp):
            data = res_multi_divi.search(exp).group()
            if '*' in data:
                element = data.split('*')
                exp = exp.replace(data,str(float(element[0])*float(element[1])))
            if '/' in data:
                element = res_multi_divi.search(exp).group().split('/')
                exp = exp.replace(data, str(float(element[0]) / float(element[1])))
        else:
            return dealwith(exp)
    def del_brackets(exp):
        while res_brackets.search(exp):
            brackets_data = res_brackets.search(exp).group()
            del_brackets_data = add(multi_divi(re.sub('(|)', '', brackets_data)))
            exp = dealwith(exp.replace(brackets_data,del_brackets_data))
        else:
            return add(multi_divi(exp))
    print(del_brackets(express))
    

      当然,可以用更简单的代码来实现,但是思路基本一样。

  • 相关阅读:
    文件操作
    通过类型断言获取error类型,获得更详细的信息

    数组
    使用unsafe改善性能
    使用unsafe.Pointer将结构体转为[]byte
    (GoRails)链接link_to到当前页current Page 并使用参数 (类ActionController::Parameters)
    用ActionController::Renderer的render方法渲染模版
    innerHTML用法及错误:无法设置未定义或null引用的属性“innerHTML”解决
    ActionCable的部署(参考Gorails)
  • 原文地址:https://www.cnblogs.com/zz1314/p/10426442.html
Copyright © 2011-2022 走看看