# -------------------------------------------------------------------------------------
# @文件: 计算器.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. iOS学习笔记之正则表达式

    前言 基本上每个 App 都有登录注册功能,在登录注册时需要验证用户所输入的内容是否符合规定:有时要在字符串中查找并截取符合要求的字符串,这时就需要用到正则表达式.正则表达式看起来晦涩难懂,没有什么规 ...

  2. dom 兼容性问题 2 offset

        offsetParent : 离当前节点最近的具有定位属性的祖先节点. 如果所有祖先节点都没有定位属性: 对于一个有定位属性的元素: ie6.7 : offsetParent 是 html 节 ...

  3. 偶尔出现button不能点击的情况

    原因: 1.没有加点击事件 2.从别的项目或者别的场景导入的预制体,要更换canvas才能点击,不然没反应

  4. 选择排序的php实现 Selection Sort

    选择排序Selection Sort的PHP实现,安全按照算法所写. 同一排序算法下,需要趟数最多的数列是什么数列呢?思考中. 每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序 ...

  5. VSCode使用正则表达式进行内容替换

    首先描述一下我要达到的目的: 1.源数据: 2.目标数据: 3.使用的正则表达式如下: (id: (\d+),) id: $2, \n order: $2,

  6. [Unity3D]EZGUI 操作简单介绍

    官方的GUI根本无法跟EZGUI比,无论是资源还是易用性还是速度.EZGUI基于Mesh不占DrawCall.EZGUI是自动合并Mesh成为一个物体,并且贴图自动制作Atlas.所以效率高,CPU消 ...

  7. group by 和 聚合函数

    1.在oracle中 select * from Table group by id 会报错. 会报不是group by 表达式.为什么一定不能是 * ,而必须是分组的列或者某个列的聚合函数. 在my ...

  8. BZOJ5336: [TJOI2018]party

    BZOJ5336: [TJOI2018]party https://lydsy.com/JudgeOnline/problem.php?id=5336 分析: 好题. 正常的思路是设\(f[i][j] ...

  9. 【JVM】java的内存泄露问题

    一.GC可回收的对象 二:什么是内存泄露--->Java的一个最显著的优势是内存管理.你只需要简单的创建对象而不需要负责释放空间,因为Java的垃圾回收器会负责内存的回收.然而,情况并不是这样简 ...

  10. java实现sendemail

    <dependency> <groupId>com.sun.mail</groupId> <artifactId>javax.mail</arti ...