教学项目之-通过Python实现简单的计算器

教学项目之-通过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自动化开发之路

好文要顶 关注我 收藏该文  

金角大王
关注 - 0
粉丝 - 639

+加关注

0

0

?上一篇:Python Select 解析

posted @ 2016-01-29 19:17 金角大王 阅读(1035) 评论(0)  编辑 收藏

刷新评论刷新页面返回顶部

时间: 2024-10-05 04:48:50

教学项目之-通过Python实现简单的计算器的相关文章

第一个python程序简单加法计算器

#-*- coding:utf-8 -*- # 获取用户输入内容 first_num = raw_input('plesea your first num : ') # 打印用户first num print "your first num is %r." % first_num # 获取用户输入内容 second_num = raw_input('plesea your second num : ') # 打印用户second num print "your second 

通过Python实现简单的计算器

计算器开发需求 实现加减乘除及拓号优先级解析 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )等类似公式后,必须自己解析里面的(),+,-,*,/符号和公式,运算后得出结果,结果必须与真实的计算器所得出的结果一致 #coding=utf-8 import re def sub_calc(formula): """ 计算一个加减乘除表达式

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 import re 2 import functools 3 4 5 def minus_operator_handler(formula): 6 '''处理一些特

在大型项目上,Python 是个烂语言吗

Robert Love, Google Software Engineer and Manager on Web Search. Upvoted by Kah Seng Tay, I was the Head TA for a class taught in Java at MIT. I used… Robert has 10+ answers in Google Engineering. Man, I cannot imagine writing let alone maintaining a

python scrapy简单爬虫记录(实现简单爬取知乎)

之前写了个scrapy的学习记录,只是简单的介绍了下scrapy的一些内容,并没有实际的例子,现在开始记录例子 使用的环境是python2.7, scrapy1.2.0 首先创建项目 在要建立项目的目录下执行命令scrapy startproject tutorial scrapy会帮你建立好项目,接着创建蜘蛛scrapy genspider zhuhuSpider zhihu.com 当前的文件结构是 --tutorial --spiders --__init__.py --zhihuSpid

Python实现简单的四则运算

GitHub 项目地址 https://github.com/745421831/-/tree/master PSP PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟) Planning 计划 10 20 · Estimate · 估计这个任务需要多少时间 10 10 Development 开发 360 600 · Analysis · 需求分析 (包括学习新技术) 30 40 · Design Spec · 生成设计文档 30

觉得 Python 太“简单了”,这些题你能答对几个?

前言 觉得 Python 太"简单了"?作为一个 Python 开发者,我必须要给你一点人生经验,不然你不知道天高地厚!)一份满分 100 分的题,这篇文章就是记录下做这套题所踩过的坑. 下面的代码会报错,为什么? class A(object): x = 1 gen = (x for _ in xrange(10)) # gen=(x for _ in range(10)) if __name__ == "__main__": print(list(A.gen))

python中简单文件的输入三种方式

最近在自学python,简单的总结了一下文件的输入的方式. 1. f=open("foo.txt") line=f.readline() while line: print(line,end='') line=f.readline() f.close() 2. for line in open("foo.txt"): print(line,end='') 3. f=open("foo.txt") lines=f.readlines() for l

Python实现简单的猜数字游戏

Python实现简单的猜数字游戏,具体如下: 随机生成一个1-10之间的数字,让用户来猜,当猜错时,会提示猜的数字是大还是小了,直到用户猜对为止. import random secret = random.randint(1,10) #print(secret) print('------猜数字游戏!-----') guess = 0 while guess != secret: temp = input('猜数字游戏开始,请输入数字:') guess = int(temp) if guess