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) )等类似公式后,必须自己解析里面的(),+,-,*,/符号和公式,运算后得出结果,结果必须与真实的计算器所得出的结果一致

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

import re

import functools

def minus_operator_handler(formula):

    ‘‘‘处理一些特殊的减号运算‘‘‘

    minus_operators = re.split("-",formula)

    calc_list= re.findall("[0-9]",formula)

    if minus_operators[0== ‘‘: #第一值肯定是负号

        calc_list[0= ‘-%s‘ % calc_list[0]

    res = functools.reduce(lambda x,y:float(x) - float(y), calc_list)

    print("\033[33;1m减号[%s]处理结果:\033[0m" % formula, res )

    return res

def remove_duplicates(formula):

    formula = formula.replace("++","+")

    formula = formula.replace("+-","-")

    formula = formula.replace("-+","-")

    formula = formula.replace("--","+")

    formula = formula.replace("- -","+")

    return formula

def compute_mutiply_and_dividend(formula):

    ‘‘‘算乘除,传进来的是字符串噢‘‘‘

    operators = re.findall("[*/]", formula )

    calc_list = re.split("[*/]", formula )

    res = None

    for index,i in enumerate(calc_list):

        if res:

            if operators[index-1== "*":

                res *= float(i)

            elif operators[index-1== "/":

                res /= float(i)

        else:

            res = float(i)

    print("\033[31;1m[%s]运算结果=\033[0m" %formula, res  )

    return res

def handle_minus_in_list(operator_list,calc_list):

    ‘‘‘有的时候把算术符和值分开后,会出现这种情况  [‘-‘, ‘-‘, ‘-‘] [‘ ‘, ‘14969037.996825399 ‘, ‘ ‘, ‘12.0/ 10.0 ‘]

       这需要把第2个列表中的空格都变成负号并与其后面的值拼起来,恶心死了

    ‘‘‘

    for index,i in enumerate(calc_list):

        if == ‘‘: #它其实是代表负号,改成负号

            calc_list[index+1= + calc_list[index+1].strip()

def handle_special_occactions(plus_and_minus_operators,multiply_and_dividend):

    ‘‘‘有时会出现这种情况 , [‘-‘, ‘-‘] [‘1 ‘, ‘ 2 * ‘, ‘14969036.7968254‘],2*...后面这段实际是 2*-14969036.7968254,需要特别处理下,太恶心了‘‘‘

    for index,i in enumerate(multiply_and_dividend):

        = i.strip()

        if i.endswith("*"or i.endswith("/"):

            multiply_and_dividend[index] = multiply_and_dividend[index] + plus_and_minus_operators[index] + multiply_and_dividend[index+1]

            del multiply_and_dividend[index+1]

            del plus_and_minus_operators[index]

    return plus_and_minus_operators,multiply_and_dividend

def compute(formula):

    ‘‘‘这里计算是的不带括号的公式‘‘‘

    formula = formula.strip("()"#去除外面包的拓号

    formula = remove_duplicates(formula) #去除外重复的+-号

    plus_and_minus_operators = re.findall("[+-]", formula)

    multiply_and_dividend = re.split("[+-]", formula) #取出乘除公式

    if len(multiply_and_dividend[0].strip()) == 0:#代表这肯定是个减号

        multiply_and_dividend[1= plus_and_minus_operators[0+ multiply_and_dividend[1]

        del multiply_and_dividend[0]

        del plus_and_minus_operators[0]

    plus_and_minus_operators,multiply_and_dividend=handle_special_occactions(plus_and_minus_operators,multiply_and_dividend)

    for index,i in enumerate(multiply_and_dividend):

        if re.search("[*/]" ,i):

            sub_res = compute_mutiply_and_dividend(i)

            multiply_and_dividend[index] = sub_res

    #开始运算+,-

    print(multiply_and_dividend, plus_and_minus_operators)

    total_res = None

    for index,item in enumerate(multiply_and_dividend):

        if total_res: #代表不是第一次循环

            if plus_and_minus_operators[index-1== ‘+‘:

                total_res += float(item)

            elif plus_and_minus_operators[index-1== ‘-‘:

                total_res -= float(item)

        else:

            total_res = float(item)

    print("\033[32;1m[%s]运算结果:\033[0m" %formula,total_res)

    return total_res

def calc(formula):

    ‘‘‘计算程序主入口, 主要逻辑是先计算拓号里的值,算出来后再算乘除,再算加减‘‘‘

    parenthesise_flag = True

    calc_res = None #初始化运算结果为None,还没开始运算呢,当然为None啦

    while parenthesise_flag:

        = re.search("\([^()]*\)", formula) #找到最里层的拓号

        if m:

            #print("先算拓号里的值:",m.group())

            sub_res = compute(m.group())

            formula = formula.replace(m.group(),str(sub_res))

        else:

            print(‘\033[41;1m----没拓号了...---\033[0m‘)

            print(‘\n\n\033[42;1m最终结果:\033[0m‘,compute(formula))

            parenthesise_flag = False #代表公式里的拓号已经都被剥除啦

if __name__ == ‘__main__‘:

    #res = calc("1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )")

    res = calc("1 - 2 * ( (60-30 +(-9-2-5-2*3-5/3-40*4/2-3/5+6*3) * (-9-2-5-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )")

  

分类: Python自动化开发之路

时间: 2024-11-03 03:37:08

python学习之第五天补充的相关文章

python学习记录第五篇--遍历目录

#coding=utf-8'''@author: 简单遍历目录删除文件的小程序'''import os#查找文件操作def findFile(path): fileList=[] for rootPath,subRoot,fileName in os.walk(path): for sub in fileName: if os.path.isfile(os.path.join(rootPath,sub)): k=os.path.splitext(sub)[1].lower() if k in (

python学习笔记(五岁以下儿童)深深浅浅的副本复印件,文件和文件夹

python学习笔记(五岁以下儿童) 深拷贝-浅拷贝 浅拷贝就是对引用的拷贝(仅仅拷贝父对象) 深拷贝就是对对象的资源拷贝 普通的复制,仅仅是添加了一个指向同一个地址空间的"标签",东西都是一样的.改变或者添加,复制出来的变量也会改变 样例: >>> a=[1,2,3] >>> b=a >>> a [1, 2, 3] >>> b [1, 2, 3] >>> a[1]=0 >>>

Python学习系列(五)(文件操作及其字典)

Python学习系列(五)(文件操作及其字典) Python学习系列(四)(列表及其函数) 一.文件操作 1,读文件 在以'r'读模式打开文件以后可以调用read函数一次性将文件内容全部读出,也可以指定每次read读多少字节,例如: 1 #coding:utf-8 2 fn='test1.py' 3 fp=open(fn,'r') #以读的方式打开文件,文件必须首先存在和,.文件在同一目录下py 4 print 'reading pos:',fp.tell() 5 r=fp.read(20) #

python学习笔记(五)之字典2

python学习笔记(五)之字典2编程实战中经常用到实例1:copy >> ad = {"name":"wtf","hig":"180"}>> bd = ad>> bd{'name': 'wtf', 'hig': '180'}>> id (ad)4539954352>> id (bd)4539954352说明:一个对象贴上两个标签,使用赋值,实现了所谓的"假

《Python学习手册 第五版》 -第11章 赋值、表达式和打印

上一章对Python的语句和语法已经进行了基本的说明,接下来就是每个章节的详细说明,本章的主要内容就是标题中涵盖的三点:赋值语句.表达式语句.打印语句 本章重点内容如下: 1.赋值语句 1)赋值语句的特点(注意事项) 2)赋值语句的形式:基本形式.元组及列表解包赋值.序列赋值.扩展的序列解包.多目标赋值.增量赋值 3)变量命名规则 2.表达式语句 1)常见的表达式语句 2)表达式语句和原位置修改 3.打印操作 1)调用形式 2)应用示例 以下是针对以上重点内容的详细说明 1.赋值语句 1)赋值语

《Python学习手册 第五版》 -第12章 if测试和语法规则

本章节的内容,主要讲解if语句,if语句是三大复合语句之一(其他两个是while和for),能处理编程中大多数逻辑运算 本章的重点内容如下: 1.if语句的基本形式(多路分支) 2.布尔表达式 3.if三元表达式 以下是针对重点内容的详细说明 1.if语句的基本形式 if语句是根据测试结果,从一些备选的操作中做出选择的语句,也就是说要先计算测试结果,再选择做什么,基本形式如下: if test1: statements1 elif test2: statements2 else: stateme

《Python学习手册 第五版》 -第16章 函数基础

前面的章节讲解的是一些基础数据类型.基本语句使用和一些文档查看的内容,这些都是一些基础,其实还谈不上入门,只有了解了函数,才算入门 函数是编程里面使用最多的也是最基本的程序结构, 本章重点内容 1.函数 1)什么是函数? 2)为什么使用函数? 2.编写函数 1)函数的基本格式 2)定义和调用函数 3)函数的多态.局部变量 接下来针对本章重点,展开详细的说明 1.函数 1)什么是函数? 这里没有严格的定义,用通俗易懂的方式来说: 函数就是将一些语句集合在一起的组件,从而让他们能够不止一次的在程序中

Python 学习日记第五篇 -- collections系列

一.计数器(counter) 计数器(counter)以字典的形式返回序列中各个字符出现的次数,值为key,次数为value #!/usr/bin/env python #-*- coding:utf-8 -*- #导入collections模块 import collections counter_test = collections.Counter("asfafjhadgkhjkgfjhgfjhaghdg") print(counter_test) #返回值 C:\Python27

python学习之第四天补充

本节大纲 迭代器&生成器 装饰器  基本装饰器 多参数装饰器 递归 算法基础:二分查找.二维数组转换 正则表达式 常用模块学习 作业:计算器开发 实现加减乘除及拓号优先级解析 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )等类似公式后,必须自己解析里面的(),+,-,*,/符号和公式,运算后得出结果,结果必须与真实的计算器所得出的结果一致 迭代器&