# -------------------------------------------------------------------------------------
# @文件: 计算器.py
# @工程: blog
# @时间: 2018/3/17 20:14
# @作者: liu yang
# @博客: www.liuyang1.club
# @邮箱: liuyang0001@outlook.com
# ------------------------------------------------------------------------------------
# 编码格式
# -*- coding: utf-8 -*-
# Python版本
# #!/usr/bin/python3
import re

exprs = ''    # 表达式
sum = 0       # 结果
flag = 'new'  # 计算标志位

def License():
    print("\
             **********控制台计算器***********\n \
            ·支持+-×/运算,指数运算(^),\n \
            ·支持包含括号的长表达式输入\n \
            ·欢迎访问博客:www.liuyang1.club \n \
             ********CopyRight(c) 2018 ********\n \
            ")

def BracketUnbalanceCheck(str_in):
    num = 0
    for i in str_in:
        if i == '(':
            num += 1
        elif i == ')':
            num -= 1
    if num != 0:  # 括号不平衡
        print("错误:输入的括号不平衡,请重新输入\n")
        return 1
    else:  # 括号平衡
        return -1

def CharErrorCheck(str_in):
    if re.findall(r'[&a-zA-Z<>,?~!@#$%";:]', str_in):  # 正则表达式校验输入字符串的合法性
        print('错误:表达式包含非法字符,请重新输入\n')
        return 1
    else:
        return -1

def InputExpression():
    global exprs
    while not (CharErrorCheck(exprs) == -1 and BracketUnbalanceCheck(exprs) == -1):  # 直到得到一个合法的表达式
        exprs = input("继续输入表达式:\n")
    m = re.match(r'^[\^/\*+\-\\]\w*', exprs)  # 匹配输入字符串的第一个字符是否是运算符,判断继续运算还是开始新计算
    if m:
        return 'continue'
    else:
        return 'new'

def Compute(flag):
    global exprs
    global sum
    exprs = exprs.replace('^', '**')  # 将^替换为**
    if flag == 'continue':
        exprs = str(sum) + exprs
    try:
        sum = eval(exprs)
        print("计算式:", exprs)
        print(exprs, "= " + str(sum))
    except SyntaxError:
        print("错误:继续计算时出现语法错误,程序返回\n")
    except ZeroDivisionError:
        print("错误:除数不能为0,程序返回\n")

def main():
    global exprs, flag
    License()
    while True:
        exprs = input("输入表达式:")
        flag = InputExpression()
        Compute(flag)

if __name__ == '__main__':
    main()

[Python Study Notes]计算器的更多相关文章

  1. [Python Study Notes]匿名函数

    Python 使用 lambda 来创建匿名函数. lambda这个名称来自于LISP,而LISP则是从lambda calculus(一种符号逻辑形式)取这个名称的.在Python中,lambda作 ...

  2. [Python Study Notes]字符串处理技巧(持续更新)

    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ...

  3. [Python Study Notes]with的使用

    在 Python 2.5 中, with 关键字被加入.它将常用的 try ... except ... finally ... 模式很方便的被复用.看一个最经典的例子: with open('fil ...

  4. [Python Study Notes]实现对键盘控制与监控

    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ...

  5. [Python Study Notes]实现对鼠标控制

    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ...

  6. [Python Study Notes]批量将wold转换为pdf

    本文代码,由原ppt2pdf.py进行改写 '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ...

  7. [Python Study Notes]批量将ppt转换为pdf v1.0

    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ...

  8. [Python Study Notes]CS架构远程访问获取信息--SERVER端v2.0

    更新内容: 1.增加内存信息获取 2.增加电池信息获取 3.增加磁盘信息获取 4.重新布局窗体 5.增加窗体名称 6.增加连接成功之前,不可按压 ''''''''''''''''''''''''''' ...

  9. [Python Study Notes]CS架构远程访问获取信息--Client端v2.0

    更新内容: 1.增加内存信息获取 2.增加电池信息获取 3.增加磁盘信息获取 4.重新布局窗体 5.增加窗体名称 6.增加连接成功之前,不可按压 效果图: '''''''''''''''''''''' ...

随机推荐

  1. Spinner使用一

    Spinner使用一 一.使用方法 1.在layout中创建Spinner控件 <Spinner android:id="@+id/spinner1" android:lay ...

  2. MySQL 基础知识(基本架构、存储引擎差异)

    前言: // MySQL 并发.异步IO.进程劫持 最近在看高性能 MySQL,记录写学习笔记: 高性能 MySQL 学习笔记(一) 架构与历史 笔记核心内容:MySQL 服务器基础架构.各种存储引擎 ...

  3. TCP/IP详解学习笔记(2)-数据链路层【转】

    转自:http://blog.csdn.net/goodboy1881/article/details/665061 数据链路层有三个目的: 为IP模块发送和 接收IP数据报. 为ARP模块发送ARP ...

  4. 04-THREE.JS 添加、删除物体,批量操作

    <!DOCTYPE html> <html> <head> <title></title> <script src="htt ...

  5. BZOJ - 2243 染色 (树链剖分+线段树+区间合并)

    题目链接 线段树维护区间连续段个数即可.设lc为区间左端点颜色,rc为区间右端点颜色,则合并两区间的时候,如果左区间右端点和右区间左端点颜色相同,则连续段个数-1. 在树链上的区间合并可以定义一个结构 ...

  6. 畅通工程再续 (kruskal算法的延续)

    个人心得:这题其实跟上一题没什么区别,自己想办法把坐标啥的都给转换为对应的图形模样就好了 相信大家都听说一个“百岛湖”的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实 ...

  7. 洛谷 P1062 数列

    题目描述 给定一个正整数k(3≤k≤15),把所有k的方幂及所有有限个互不相等的k的方幂之和构成一个递增的序列,例如,当k=3时,这个序列是: 1,3,4,9,10,12,13,… (该序列实际上就是 ...

  8. 基于JQ的简单左右轮播图

    // 轮播图 主要实现思想: a.第一层div,设置overflow为hidden. b.里面是一个ul,每个li里面有个img或者为每个li设置背景图片也可以. c.li设置为左浮动,排成一行,还有 ...

  9. Linux之时间、地点、人物、事件、情节

    时间 date 显示当前时间 time cmd 显示 cmd的运行时间 地点 locate 根据文件名,迅速找到文件.基于系统构建的索引 find 根据各种规则找到文件,更强大,但比较慢 wherei ...

  10. SQLite连接C#笔记

    不得不吐槽,实在是太坑了.以下几点一定要注意: 要下载两个东西,都要上官网.一个是SQLite for Windows,一个是System.Data.SQLite. 下载下来的DLL里面有个test, ...