Python新手必备练习4---开发一个计算器程序

总是有朋友问我,在听我讲的课时感觉都能听懂,我讲的例子照着写也能做出来,但一到自己想不照抄而是自己写的时候,就发现完全没有思路,不知如何下手。对此我只能说,还是因为练习的少,平常从来不写代码,学了点语法就想啪啪啪实现复杂的功能是不现实的,学习语言是一个循序渐近的过程,不经过几万行代码的洗礼,是很难成为一个优秀的程序员的,为了帮助初学者找一些好的练习基本功的例子,我近期会整理我讲课一来的一些Python练习程序分享给大家,想学好Python的同学可以照着例子一一去做,我敢保证,把我列出的练习程序列表都做完了,你基本上就能做一个合格的Pythoner啦!

有兴趣的同学也可加入技术交流群一起学习:29215534

今天做列一个题目是:开发一个简单的计算器

功能需求:

  • 用户输入 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. 常用数据类型列表的操作

答案示例:

同学们请一定先自己做,不要看我下面的代码,自己憋出来或实在憋不出来的时候再来对比。

代码逻辑:

详细代码:

为了方便同学们明白整个逻辑过程,代码中的好多调试信息没有去掉。

#_*_coding:utf-8_*_
__author__ = ‘jieli‘
import re
import sys

def remove_space(data_list):
    ‘‘‘去除列表中的空格元素‘‘‘
    for i in data_list:
        if type(i) is not int:
            if len(i.strip()) == 0:
                data_list.remove(i)
    return  data_list

def fetch_data_from_bracket(data_list,first_right_bracket_pos):
    ‘‘‘用递归的形式取出每一对括号里的数据并进行运算且得出结果‘‘‘
    print ‘data list:‘,data_list

    left_bracket_pos,right_bracket_pos = data_list.index(‘(‘),data_list.index(‘)‘) +1
    print ‘\033[31;1mleft bracket pos:%s right_bracket_pos: %s\033[0m‘ %(left_bracket_pos,first_right_bracket_pos)
    data_after_strip = data_list[left_bracket_pos:right_bracket_pos]

    if data_after_strip.count("(") > 1:
        print ‘fetch_data_from_bracket:%s \033[31;1m%s\033[0m left pos:%s‘  %(data_after_strip,data_after_strip[1:] , left_bracket_pos)
        #return fetch_data_from_bracket(data_after_strip[left_bracket_pos+1:],first_right_bracket_pos)
        return fetch_data_from_bracket(data_after_strip[1:],first_right_bracket_pos)

    else:
        print ‘last:‘,len(data_after_strip),data_after_strip
        bracket_start_pos = first_right_bracket_pos - len(data_after_strip) +1  # (takes two position
        calc_res = parse_operator(data_after_strip)
        return calc_res, bracket_start_pos,first_right_bracket_pos +1 #‘) takes one position‘
def parse_bracket(formula):  #解析空格中的公式
    ‘‘‘解析空格中的公式,并运算出结果‘‘‘
    pattern = r"\(.+\)"
    m = re.search(pattern,formula) #匹配出所有的括号 ‘3 / 1      - 2 * ( (60-30 * (4-2)) - 4*3/ (6-3*2) )’ 匹配完之后是‘( (60-30 * (4-2)) - 4*3/ (6-3*2) )‘
    if m:
        data_with_brackets = m.group()
        #print list(data_with_brackets)
        data_with_brackets = remove_space(list(data_with_brackets))
        #print data_with_brackets
        calc_res = fetch_data_from_bracket(data_with_brackets,data_with_brackets.index(‘)‘))
        print ‘\033[32;1mResult:\033[0m‘, calc_res
        print calc_res[1],calc_res[2]
        print  data_with_brackets[calc_res[1]:calc_res[2]]
        del data_with_brackets[calc_res[1]:calc_res[2]]
        data_with_brackets.insert(calc_res[1], str(calc_res[0])) #replace formula string with caculation result 4
        return parse_bracket(‘‘.join(data_with_brackets)) #继续处理其它的括号
    else: #no bracket in formula anymore
        print ‘\033[42;1mCaculation result:\033[0m‘ ,formula

def caculate_1(formula): # for multiplication and division
    result = int(formula[0])  # e.g [‘4‘, ‘/‘, ‘2‘, ‘*‘, ‘5‘], loop start from ‘/‘
    last_operator = None
    formula = list(formula)
    nagative_mark = False
    for index,i in enumerate(formula[1:]):
        if i.isdigit():
            if nagative_mark:
                i = int(‘-‘+i)
                nagative_mark = False
            else:
                i = int(i)
            #print ‘+++>‘,result,last_operator,i
            if last_operator == ‘*‘:
                result  *= i
            elif last_operator == ‘/‘:
                try:
                    result /= i
                except ZeroDivisionError,e:
                    print "\033[31;1mError:%s\033[0m" % e
                    sys.exit()
        elif i == ‘-‘:
            nagative_mark = True
        else:
            last_operator = i

    print ‘乘除运算结果:‘ , result
    return result
def caculate_2(data_list,operator_list):
    ‘‘‘eg. data_list:[‘4‘, 3, 1372, ‘1‘]  operator_list:[‘-‘, ‘+‘, ‘-‘]‘‘‘
    data_list = remove_space(data_list)
    print ‘caculater_2:‘,data_list,operator_list
    result = int(data_list[0])
    for i in data_list[1:]:
        if operator_list[0] == ‘+‘:
            result += int(i)
        elif operator_list[0] == ‘-‘:
            result -= int(i)
        del operator_list[0]

    print ‘caculate_2 result:‘, result
    return  result
def parse_operator(formula):
    print ‘开始运算公式:‘,formula
    formula = formula[1:-1] #remove bracket

    low_priorities = re.findall(‘[+,-]‘,‘‘.join(formula))
    data_after_removed_low_priorities = re.split(‘[+,-]‘, ‘‘.join(formula))
    print ‘去掉加减后的公式列表,先算乘除:‘,data_after_removed_low_priorities

    for index,i in enumerate(data_after_removed_low_priorities):
        if i.endswith("*") or i.endswith("/") :
            data_after_removed_low_priorities[index] += ‘-‘ + data_after_removed_low_priorities[index+1]
            del data_after_removed_low_priorities[index+1]
    print ‘---------->handle nagative num:‘,data_after_removed_low_priorities
    #计算乘除运算
    nagative_mark = False

    for index,i in enumerate(data_after_removed_low_priorities):
        if not i.isdigit():
            if len(i.strip()) == 0:
                nagative_mark = True
            else:#remove space

                string_to_list = []
                if nagative_mark:
                    prior_l = ‘-‘ + i[0]  #
                    nagative_mark = False
                else:
                    prior_l = i[0]
                for l in i[1:] :
                    if l.isdigit():

                        if prior_l.isdigit() or len(prior_l) >1: # two letter should be combined
                            prior_l += l
                        else:
                            prior_l = l
                    else: # an operator * or /

                        string_to_list.append(prior_l)
                        string_to_list.append(l)
                        prior_l = l  #reset prior_l
                else:
                    string_to_list.append(prior_l)

                print ‘--->::‘, string_to_list
                calc_res = caculate_1(string_to_list) #乘除运算结果
                data_after_removed_low_priorities[index] = calc_res
                #print ‘--->string to list:‘,string_to_list
                #print ‘+>‘,index, re.split(‘[*,/]‘,i)
                ‘‘‘operators = re.findall(‘[*,/]‘,i)
                data = re.split(‘[*,/]‘,i)
                combine_to_one_list = map(None,data,operators)
                combine_to_one_list =re.split("[\[,\],\(,),‘‘,None]", str(combine_to_one_list))
                combine_to_one_list = ‘‘.join(combine_to_one_list).split()
                print ‘-->‘,combine_to_one_list
                #print operators,data‘‘‘
            #caculate_1(combine_to_one_list)
        else :
            if nagative_mark:
                data_after_removed_low_priorities[index] = ‘-‘ + i
    print ‘去掉* 和 /后开始运算加减:‘, data_after_removed_low_priorities,low_priorities
    #计算加减运算
    return caculate_2(data_after_removed_low_priorities,low_priorities)
    #print formula
def main():
    while True:
        user_input = raw_input(">>>:").strip()
        if len(user_input) == 0:continue
        #parse_bracket(user_input)
        user_input = ‘(‘ + user_input + ‘)‘
        #parse_bracket(‘ 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) ) ‘)
        parse_bracket(user_input)

        print ‘\033[43;1mpython计算器运算结果:\033[0m‘,eval(user_input)
if __name__ == ‘__main__‘:
    main()
时间: 2024-11-05 11:24:16

Python新手必备练习4---开发一个计算器程序的相关文章

《中小学生Python编程入门指南》2.1 设计开发一个计算器

第二章 设计自己的第一个Python应用 1.1 设计开发一个计算器 这一节我们来尝试实现完成一个计算器的应用.毕竟我们是初学者,不可能做得那么完美,也不是真的需要实现,只是想借这一个应用的理解,我们带入一些python的教学和其他的计算机相关知识. 我们先想想,计算器我们需要什么功能?先不想象多么只能的计算器,我们要先实现简单的会加减乘除的就可以了.那么我们就知道了,计算器是要有会加减乘除计算的功能的.那除此之外呢?我们想一下计算的流程,其实就是三个部分组成:①输入.②计算.③输出.好,那我们

用GTK开发一个画图程序(windows)

GTK是一个功能强大的开发平台,跨系统,提供了丰富的庞大的代码库,应用开发者可以用之快速做出自己的产品. 这个月用他开发了一个GUI程序,是个画图工具,功能包括:图片导入导出.线型编辑.拖拽.删除.调整粗细.颜色.虚实.阴影,亮点是实现了一种自定义的线型:尖灭线(项目后续会加入更多线型).尖灭线是石油勘探资料处理中常用的绘图线型.GUI的使用流程是先导入一个底图,然后在底图之上画线或插入其他图片.文字,最后把整体导出为一个图片.上样例: 如图:企鹅图是背景图,蓝线是尖灭线,还有其他一些线和菜单.

开发一个小程序点餐系统多少钱?

餐饮行业开发一个类似美团的点餐外卖小程序,属于自己的平台,不需要缴纳各种费用,而且背靠微信,有充足的流量为后盾,可谓一举多得.那么小程序点餐系统多少钱?开发小程序+点餐系统价格多少? 微信点餐外卖小程序优势: 1.开放的用户体系:点餐小程序无需登录,直接采用微信账号体系,极大降低用户首次使用门槛,同时方便用户信息收集. 2.分享红利:小程序可方便分享到微信个人和群聊窗口,会话中点击即用,非常方便传播. 3.线上线下打通:小程序最佳入口是扫描二维码,线下用户只需简单扫码,即可转换为小程序用户. 4

自己开发一个小程序需要多少钱?有哪些费用?

本文读完仅需3分钟:1.自主开发费用:2.第三方模板费用:3.定制开发费用. ?随着小程序的普及,越来越多的商家产生了开发需求,今天的文章就来给大家分享下不同小程序开发方式的费用,自主开发还是购买模板划算一目了然: 一.自主开发费用多 (1)认证费 首先要知道,注册小程序是不要钱的,但审核认证需要300的认证费,不过这是针对直接注册小程序的,如果你拥有经过认证的公众号,再注册小程序是不需要支付认证费的,需要注意的是认证费是需要每年续费的. (2)人工费 除了基本的技术开发人员外,制作一个小程序还

利用Python的几行代码开发一个QQ机器人!小白也能快速上手的案例

本篇教大家如何用Python来实现QQ机器人,如有不足欢迎在评论方指出! 简单介绍 安装方法 可在 Python个版本下使用,用 pip 安装: pip install qqbot 使用方法 一.启动 QQBot 二.操作 QQBot QQBot 启动后,在另一个控制台窗口使用 qq 命令来操作 QQBot ,目前提供以下命令: list 命令提供强大的联系人查询功能,例如: 如: qq list group 机器人测试 例如: 实现我们自己的 QQ 机器人 要实现咱们自己的QQ 机器人超级简单

python学习备忘之编写一个信用卡程序

需求分析如下图所示:这里难点就是现金的替换.我这里的思路是每当使用现金的时候.把用户文件的行变成一个列表,在转换成int类型相加减:得到结果之后用fileinput模块进行替换.下面的步骤流水账还在思考当中.当然提现手续费换算很简单,我这里也没有列出,大致已经完成了.取现.充值.购物等三个功能:(由于是运维所以代码很粗糙) #!/usr/bin/pythonimport fileinputwhile True:        name=raw_input("please input name:&

struts 配置过程 -一个计算器程序

1.新建一个java web项目 2.引入jar包.jar包路径:struts-1.2.9-bin\lib 3.配置web.xml文件 <?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/

yii开发一个web程序的基本流程

1. 创建目录结构.在前面的章节Creating First Yii Application写的yiic工具可以帮助我们快速完成这步. 2. 配置 application.就是修改application配置文件.这步有可能会写一些application部件(例如:用户部件) 3. 每种类型的数据都创建一个 model 类来管理. 同样,yiic可以为我们需要的数据库表自动生成active record active record 类. 4. 每种类型的用户请求都创建一个 controller 类

【物联网(IoT)开发】使用 Arduino 和 Python在 Bluemix 上开发一个 IoT 应用程序之控制LED灯开关

上篇"[物联网(IoT)开发]Arduino 入门 Hello World(LED闪烁)"只是通过将一段程序烧录到Arduino开发板上控制LEC闪烁,没有任何连网动作,也就是说断开网络提供电源依然还可以工作.本文将介绍如何开发一个应用程序,以便使用适用于物联网 (Internet of Things, IoT) 的技术.我们的应用程序通过串口收集数据,将其存储在一个 Web 服务器上,然后在网页上实时显式结果,并可以在网页上控制LED的开关. 构建一个类似的应用程序的前提条件 对于第