Python学习之路-python基础课 (day6)

作业:

开发一个简单的python计算器

  1. 实现加减乘除及拓号优先级解析
  2. 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )等类似公式后,必须自己解析里面的(),+,-,*,/符号和公式(不能调用eval等类似功能偷懒实现),运算后得出结果,结果必须与真实的计算器所得出的结果一致

计算器源码:

#!/usr/bin/env python
# _*_ coding:utf-8 _*_
# Author: Mo

import re

def compute_multipy_divide(arg):
    value = arg[0]
    mch = re.search(‘\d+\.*\d*[\*\/]+[\+\-]?\d+\.*\d*‘,value)
    if not mch:
        return
    content = re.search(‘\d+\.*\d*[\*\/]+[\+\-]?\d+\.*\d*‘,value).group()
    if len(content.split(‘*‘)) > 1:
        v1,v2 = content.split(‘*‘)
        get_value = float(v1) * float(v2)
    else:
        v1,v2 = content.split(‘/‘)
        get_value = float(v1) / float(v2)
    left,right = re.split(‘\d+\.*\d*[\*\/]+[\+\-]?\d+\.*\d*‘,value,1)
    new_value = ‘%s%s%s‘ %(left,get_value,right)
    arg[0] = new_value
    compute_multipy_divide(arg)

def compute_add_substract(arg):
    while True:
        if ‘--‘ in arg[0] or ‘++‘ in arg[0] or ‘-+‘ in arg[0] or ‘+-‘ in arg[0]:
            arg[0] = arg[0].replace(‘--‘,‘+‘)
            arg[0] = arg[0].replace(‘++‘,‘+‘)
            arg[0] = arg[0].replace(‘-+‘,‘-‘)
            arg[0] = arg[0].replace(‘+-‘,‘-‘)
        else:
            break
    if arg[0].startswith(‘-‘):
        arg[1] += 1
        arg[0] = arg[0].replace(‘-‘,‘&‘)
        arg[0] = arg[0].replace(‘+‘,‘-‘)
        arg[0] = arg[0].replace(‘&‘,‘+‘)
        arg[0] = arg[0][1:]
    value = arg[0]
    mch = re.search(‘\d+\.*\d*[\+\-]{1}\d+\.*\d*‘,value)
    if not mch:
        return
    content = re.search(‘\d+\.*\d*[\+\-]{1}\d+\.*\d*‘,value).group()
    if len(content.split(‘+‘)) >1:
        v1,v2 = content.split(‘+‘)
        get_value = float(v1) + float(v2)
    else:
        v1,v2 = content.split(‘-‘)
        get_value = float(v1) - float(v2)
    left,right = re.split(‘\d+\.*\d*[\+\-]{1}\d+\.*\d*‘,str(value),1)
    new_value = ‘%s%s%s‘ %(left,get_value,right)
    arg[0] = new_value
    compute_add_substract(arg)

def compute(expression):
    inp = [expression,0]
    compute_multipy_divide(inp)
    compute_add_substract(inp)
    count = divmod(inp[1],2)
    result = float(inp[0])
    if count[1] == 1:
        result = result * (-1)
    return result

def excute(expression):
    if not re.search(‘\(([\+\-\*\/]*\d+\.*\d*){2,}\)‘,expression):
        result = compute(expression)
        return result
    content = re.search(‘\(([\+\-\*\/]*\d+\.*\d*){2,}\)‘,expression).group()
    new_content = content[1:len(content)-1]
    new_list = re.split(‘\(([\+\-\*\/]*\d+\.*\d*){2,}\)‘,expression,1)
    print(‘计算前:‘,expression)
    left = new_list[0]
    right = new_list[2]
    final = compute(new_content)
    print(‘计算:%s=%s‘ % (new_content, final))
    new_expression = ‘%s%s%s‘ %(left,final,right)
    print(‘计算后:‘, new_expression)
    print(‘上次计算结束‘.center(50,‘*‘))
    return excute(new_expression)

def run():
    while True:
        print(‘ Oldboy Calc ‘.center(50, ‘*‘))
        str_input = input(‘(quit=q)>>:‘).strip()
        if str_input == ‘q‘: exit()
        if len(str_input) == 0 : continue
        if len(str_input) >0 :
            no_space_str = re.sub(‘\s*‘,‘‘,str_input)
        final = excute(no_space_str)
        print(final)

if __name__ == ‘__main__‘:
    run()

计算结果:

****************** Oldboy Calc *******************
(quit=q)>>:1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )
计算前: 1-2*((60-30+(-40/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))
计算:-40/5=-8.0
计算后: 1-2*((60-30+-8.0*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))
**********************上次计算结束**********************
计算前: 1-2*((60-30+-8.0*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))
计算:9-2*5/3+7/3*99/4*2998+10*568/14=173545.88095238098
计算后: 1-2*((60-30+-8.0*173545.88095238098)-(-4*3)/(16-3*2))
**********************上次计算结束**********************
计算前: 1-2*((60-30+-8.0*173545.88095238098)-(-4*3)/(16-3*2))
计算:60-30+-8.0*173545.88095238098=-1388337.0476190478
计算后: 1-2*(-1388337.0476190478-(-4*3)/(16-3*2))
**********************上次计算结束**********************
计算前: 1-2*(-1388337.0476190478-(-4*3)/(16-3*2))
计算:-4*3=-12.0
计算后: 1-2*(-1388337.0476190478--12.0/(16-3*2))
**********************上次计算结束**********************
计算前: 1-2*(-1388337.0476190478--12.0/(16-3*2))
计算:16-3*2=10.0
计算后: 1-2*(-1388337.0476190478--12.0/10.0)
**********************上次计算结束**********************
计算前: 1-2*(-1388337.0476190478--12.0/10.0)
计算:-1388337.0476190478--12.0/10.0=-1388335.8476190479
计算后: 1-2*-1388335.8476190479
**********************上次计算结束**********************
2776672.6952380957
****************** Oldboy Calc *******************
(quit=q)>>:q

时间: 2024-10-12 21:28:49

Python学习之路-python基础课 (day6)的相关文章

Python 学习之路 - Python 基础 - One

一.安装Python34 Windows 在Python官网(https://www.python.org/downloads/)下载安装包并安装. Python的默认安装路径是:C:\Python34 配置环境变量:[右键计算机]-->[属性]-->[高级系统设置]-->[高级]-->[环境变量]-->[在第二个内容框中找到 变量名为Path 的一行,双击] --> [Python安装目录追加到变值值中,用 : 分割] 二.第一个Python程序  1. 在交互器中执

Python学习之路 — Python基础1

本节内容 Python介绍 发展史 Python 2 or 3? 安装 Hello World程序 变量 用户输入 模块初识 .pyc是个什么鬼? 数据类型初识 数据运算 表达式if ...else语句 表达式for 循环 break and continue 表达式while 循环 作业需求

《Python学习之路 -- Python基础之迭代器及for循环工作原理》

提到迭代器不得不说迭代器协议,迭代器协议是指:对象必须提供一个__next__()方法,执行该方法要么返回迭代中的下一项,要么就抛出一个StopIteration异常(相当于报错的意思)以终止迭代.然而遵循这个协议的对象就称为可迭代对象,又称为迭代器.在Python中,for循环操作的对象就是可迭代对象.说到这里可能会引起一些误会,原因就是我们都知道for循环可以直接遍历列表.元组或字符串等等集合,但是这些数据类型并没有上面提到的__next__()方法,也就是说这些数据类型根本就不遵循迭代器协

Python学习之路——Python基础之基本数据类型(列表、元组和字典)

基本数据类型 数字 字符串 列表 list 元组 tuple 字典 dict 布尔值 bool 列表和元组 列表:有序,元素可以被修改元组: 书写格式:元组的一级元素不可被修改,不能被增加或者删除,一般写元租的时候,推荐在最后加入',' 索引:v = tu[0] 切片:v = tu[0:2] 可以被for循环,可迭代对象: for item in tu 转换:str <--> list <--> tupleTips:元组中嵌套的列表的元素可以被修改 字典 dict: info =

Python学习之路——Python基础之运算符

算术运算 先and 后 or 先计算括号内 执行顺序: 从前到后 结果 True OR ==> True True And ==> 继续走 False Or ==> 继续走 False And ==> False 原文地址:http://blog.51cto.com/14052013/2314409

Python学习之路——Python基础之基本数据类型

基本数据类型 数字 字符串 列表 list 元祖 tuple 字典 dict 布尔值 bool ×××的魔法 数字 将字符串转换为数字:int a = "123" print(type(a),a) b = int(a) print(type(b),b) num = "0011" v = int(num,base=2) print(v) bit_length age = 10 r = age.bit_length() print(r) 字符串 后面带等号的参数,可带可

Python学习之路-Day1-Python基础

Python学习之路第一天 学习内容: 1.Python简介 2.安装 3.第一个Python程序 4.变量 5.字符编码 6.用户输入 7.表达式if..else语句 8.表达式for语句 9.break和continue 10.while循环 11.字符串格式化 1.python简介 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承. 最新的TIOB

Python学习之路

Python学习之路 目录 Python学习之路[第一篇]:流程控制,用户交互,语法要求,变量,字符,注释,模块导入的使用 Python学习之路[第二篇]:文件,字符串,列表,元组,字典,集合的使用 更新中...

Python学习之路-装饰器&生成器&正则表达式

装饰器 通俗的讲,装饰器就是在不改变源代码基础上,给源代码增加新功能. 不改变函数的源代码.调用方式.返回值等,给函数增加新功能. 经典案例:登录装饰器, def login_decorator(func):     def inner():         if USER_TEMP["status"] == False:             print("\033[31;1m用户未登录,请先登录\033[0m")             login_atm()