广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python语言实现科学计算器
  • 161
分享到

Python语言实现科学计算器

2024-04-02 19:04:59 161人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

本文实例为大家分享了python语言实现科学计算器的具体代码,供大家参考,具体内容如下 自学Python语言一个月,还是小白,发一个科学计算器的代码,希望大家批评指正,共勉嘛。 c

本文实例为大家分享了python语言实现科学计算器的具体代码,供大家参考,具体内容如下

自学Python语言一个月,还是小白,发一个科学计算器的代码,希望大家批评指正,共勉嘛。

calculator.py

from tkinter import *
from functools import partial
from calculate import *


# 生成计算器主界面
def buju(root):
    menu = Menu(root)  # 菜单
    submenu1 = Menu(menu, tearoff=0)  # 分窗,0为在原窗,1为点击分为两个窗口
    menu.add_cascade(label='编辑', menu=submenu1)  # 添加子选项(label参数为显示内容)
    submenu1.add_command(label='复制', command=lambda: bianji(entry, 'copy'))  # 添加命令
    submenu1.add_command(label='剪切', command=lambda: bianji(entry, 'cut'))
    submenu1.add_command(label='粘贴', command=lambda: bianji(entry, 'paste'))
    submenu2 = Menu(menu, tearoff=0)
    menu.add_cascade(label='查看', menu=submenu2)
    submenu2.add_command(label='帮助', command=lambda: chakan(entry, 'help'))
    submenu2.add_command(label='作者', command=lambda: chakan(entry, 'author'))
    root.config(menu=menu)  # 重新配置,添加菜单

    label = Label(root, width=29, height=1, bd=5, bg='#FFFACD', anchor='se',
                  textvariable=label_text)  # 标签,可以显示文字或图片
    label.grid(row=0, columnspan=5)  # 布局器,向窗口注册并显示控件; rowspan:设置单元格纵向跨越的列数

    entry = Entry(root, width=23, bd=5, bg='#FFFACD', justify="right", font=('微软雅黑', 12))  # 文本框(单行)
    entry.grid(row=1, column=0, columnspan=5, sticky=N + W + S + E, padx=5, pady=5)  # 设置控件周围x、y方向空白区域保留大小

    myButton = partial(Button, root, width=5, cursor='hand2', activebackground='#90EE90')  # 偏函数:带有固定参数的函数
    button_sin = myButton(text='sin', command=lambda: get_input(entry, 'sin('))  # 按钮
    button_arcsin = myButton(text='arcsin', command=lambda: get_input(entry, 'arcsin('))
    button_exp = myButton(text='e', command=lambda: get_input(entry, 'e'))
    button_ln = myButton(text='ln', command=lambda: get_input(entry, 'ln('))
    button_xy = myButton(text='x^y', command=lambda: get_input(entry, '^'))
    button_sin.grid(row=2, column=0)
    button_arcsin.grid(row=2, column=1)
    button_exp.grid(row=2, column=2)
    button_ln.grid(row=2, column=3)
    button_xy.grid(row=2, column=4)

    button_shanyige = myButton(text='←', command=lambda: backspace(entry))  # command指定按钮消息的回调函数
    button_shanquanbu = myButton(text=' C ', command=lambda: clear(entry))
    button_zuokuohao = myButton(text='(', command=lambda: get_input(entry, '('))
    button_youkuohao = myButton(text=')', command=lambda: get_input(entry, ')'))
    button_genhao = myButton(text='√x', command=lambda: get_input(entry, '√('))
    button_shanyige.grid(row=3, column=0)
    button_shanquanbu.grid(row=3, column=1)
    button_zuokuohao.grid(row=3, column=2)
    button_youkuohao.grid(row=3, column=3)
    button_genhao.grid(row=3, column=4)

    button_7 = myButton(text=' 7 ', command=lambda: get_input(entry, '7'))
    button_8 = myButton(text=' 8 ', command=lambda: get_input(entry, '8'))
    button_9 = myButton(text=' 9 ', command=lambda: get_input(entry, '9'))
    button_chu = myButton(text=' / ', command=lambda: get_input(entry, '/'))
    button_yu = myButton(text='%', command=lambda: get_input(entry, '%'))
    button_7.grid(row=4, column=0)
    button_8.grid(row=4, column=1)
    button_9.grid(row=4, column=2)
    button_chu.grid(row=4, column=3)
    button_yu.grid(row=4, column=4)

    button_4 = myButton(text=' 4 ', command=lambda: get_input(entry, '4'))
    button_5 = myButton(text=' 5 ', command=lambda: get_input(entry, '5'))
    button_6 = myButton(text=' 6 ', command=lambda: get_input(entry, '6'))
    button_cheng = myButton(text=' * ', command=lambda: get_input(entry, '*'))
    button_jiecheng = myButton(text='二进制', command=lambda: jinzhi(entry))
    button_4.grid(row=5, column=0)
    button_5.grid(row=5, column=1)
    button_6.grid(row=5, column=2)
    button_cheng.grid(row=5, column=3)
    button_jiecheng.grid(row=5, column=4)

    button_1 = myButton(text=' 1 ', command=lambda: get_input(entry, '1'))
    button_2 = myButton(text=' 2 ', command=lambda: get_input(entry, '2'))
    button_3 = myButton(text=' 3 ', command=lambda: get_input(entry, '3'))
    button_jian = myButton(text=' - ', command=lambda: get_input(entry, '-'))
    button_dengyu = myButton(text=' \n = \n ', command=lambda: calculator(entry))
    button_1.grid(row=6, column=0)
    button_2.grid(row=6, column=1)
    button_3.grid(row=6, column=2)
    button_jian.grid(row=6, column=3)
    button_dengyu.grid(row=6, column=4, rowspan=2)  # rowspan:设置单元格横向跨越的行数

    button_pai = myButton(text=' π ', command=lambda: get_input(entry, 'π'))
    button_0 = myButton(text=' 0 ', command=lambda: get_input(entry, '0'))
    button_xiaoshudian = myButton(text=' . ', command=lambda: get_input(entry, '.'))
    button_jia = myButton(text=' + ', command=lambda: get_input(entry, '+'))
    button_pai.grid(row=7, column=0)
    button_0.grid(row=7, column=1)
    button_xiaoshudian.grid(row=7, column=2)
    button_jia.grid(row=7, column=3)


# 对文本框中的算式或答案进行复制、剪切或粘贴
def bianji(entry, argu):
    """
    :param entry: 文本框
    :param argu: 按钮对应的值
    """
    if argu == 'copy':
        entry.event_generate("<<Copy>>")
    elif argu == 'cut':
        entry.event_generate("<<Cut>>")
        clear(entry)
    elif argu == 'paste':
        entry.event_generate("<<Paste>>")


# 查看使用帮助和作者信息
def chakan(entry, argu):
    root = Tk()
    root.resizable(0, 0)
    text = Text(root, width=20, height=2, bd=5, bg='#FFFACD', font=('微软雅黑', 12))
    text.grid(padx=5, pady=5)
    if argu == 'help':
        root.title('帮助')
        text.insert(INSERT, '这个计算器多简单!\n')
        text.insert(INSERT, '就别跟我要帮助了!')
    elif argu == 'author':
        root.title('作者')
        text.insert(INSERT, 'Author:冀梁栋\n')
        text.insert(INSERT, 'Time:2019-07-08')


# 删除最后一次输入内容
def backspace(entry):
    entry.delete(len(entry.get()) - 1)  # 删除文本框的最后一个输入值


# 删除所有输入内容和显示内容
def clear(entry):
    entry.delete(0, END)  # 删除文本框的所有内容
    label_text.set('')


# 点击计算器输入按钮后向文本框中添加内容
def get_input(entry, argu):
    fORMula = entry.get()
    for char in formula:
        if '\u4e00' <= char <= '\u9fa5':
            clear(entry)  # 删除文本框中的汉字显示,减少手动删除操作
    entry.insert(INSERT, argu)  # 使用END时,键盘敲入和按键输入组合操作会出错


# 十进制整数转换为二进制整数
def jinzhi(entry):
    try:
        formula = entry.get()
        if re.match('\d+$', formula):
            number = int(formula)
            cunchu = []  # 放置每次除以2后的余数
            result = ''
            while number:
                cunchu.append(number % 2)
                number //= 2  # 整数除法,返回商
            while cunchu:
                result += str(cunchu.pop())  # 将所有余数倒置得到结果
            clear(entry)
            entry.insert(END, result)
            label_text.set(''.join(formula + '='))
        else:
            clear(entry)
            entry.insert(END, '请输入十进制整数')
    except:
        clear(entry)
        entry.insert(END, '出错')


# 点击“=”后进行计算
def calculator(entry):
    try:
        formula = entry.get()
        # 输入内容只是数字或π或e时,仍显示该内容
        if re.match('-?[\d+,π,e]\.?\d*$', formula):
            label_text.set(''.join(formula + '='))
            return
        # 输入内容是算式时,显示其计算结果
        result = final_calc(formula_format(formula))
        clear(entry)
        entry.insert(END, result)  # 将结果输出到文本框中
        label_text.set(''.join(formula + '='))
    except:
        clear(entry)
        entry.insert(END, '出错')


if __name__ == '__main__':
    root = Tk()  # 生成窗口
    root.title('理正计算器')  # 窗口的名字
    root.resizable(0, 0)  # 窗口大小可调性,分别表示x,y方向的可变性
    global label_text  # 定义全局变量
    label_text = StringVar()
    buju(root)
    root.mainloop()  # 进入消息循环(必需组件),否则生成的窗口一闪而过

calculate.py

import re
from math import *


# 将算式从字符串处理成列表,解决横杠是负号还是减号的问题
def formula_format(formula):
    """
    :param formula: str
    """
    formula = re.sub(' ', '', formula)  # 去掉算式中的空格s
    # 以 '横杠数字' 分割, 其中正则表达式:(\-\d+\.?\d*) 括号内:
    # \- 表示匹配横杠开头;\d+ 表示匹配数字1次或多次;\.?表示匹配小数点0次或1次;\d*表示匹配数字0次或多次。
    formula_list = [i for i in re.split('(-[\d+,π,e]\.?\d*)', formula) if i]
    final_formula = []  # 最终的算式列表
    for item in formula_list:
        # 算式以横杠开头,则第一个数字为负数,横杠为负号
        if len(final_formula) == 0 and re.match('-[\d+,π,e]\.?\d*$', item):
            final_formula.append(item)
            continue
        # 如果当前的算式列表最后一个元素是运算符['+', '-', '*', '/', '(', '%', '^'], 则横杠为减号
        if len(final_formula) > 0:
            if re.match('[\+\-\*\/\(\%\^]$', final_formula[-1]):
                final_formula.append(item)
                continue
        # 按照运算符分割开
        item_split = [i for i in re.split('([\+\-\*\/\(\)\%\^\√])', item) if i]
        final_formula += item_split
    return final_formula


# 判断是否是运算符,如果是返回True
def is_operator(e):
    """
    :param e: str
    :return: bool
    """
    opers = ['+', '-', '*', '/', '(', ')', '%', '^', '√', 'sin', 'arcsin', 'ln']
    return True if e in opers else False  # 在for循环中嵌套使用if和else语句


# 比较连续两个运算符来判断是压栈还是弹栈
def decision(tail_op, now_op):
    """
    :param tail_op: 运算符栈的最后一个运算符
    :param now_op: 从算式列表取出的当前运算符
    :return: 1代表弹栈运算,0代表弹出运算符栈最后一个元素'(',-1表示压栈
    """
    # 定义4种运算符级别
    rate1 = ['+', '-']
    rate2 = ['*', '/', '%']
    rate3 = ['^', '√', 'sin', 'arcsin', 'ln']
    rate4 = ['(']
    rate5 = [')']

    if tail_op in rate1:
        if now_op in rate2 or now_op in rate3 or now_op in rate4:
            return -1  # 说明当前运算符优先级高于运算符栈的最后一个运算符,需要压栈
        else:
            return 1  # 说明当前运算符优先级等于运算符栈的最后一个运算符,需要弹栈运算

    elif tail_op in rate2:
        if now_op in rate3 or now_op in rate4:
            return -1
        else:
            return 1

    elif tail_op in rate3:
        if now_op in rate4:
            return -1
        else:
            return 1

    elif tail_op in rate4:
        if now_op in rate5:
            return 0  # '('遇上')',需要弹出'('并丢掉')',表明该括号内的算式已计算完成并将结果压入数字栈中
        else:
            return -1  # 只要栈顶元素为'('且当前元素不是')',都应压入栈中


# 传入两个数字,一个运算符,根据运算符不同返回相应结果
def calculate(n1, n2, operator):
    """
    :param n1: float
    :param n2: float
    :param operator: + - * / % ^
    :return: float
    """
    result = 0
    if operator == '+':
        result = n1 + n2
    if operator == '-':
        result = n1 - n2
    if operator == '*':
        result = n1 * n2
    if operator == '/':
        result = n1 / n2
    if operator == '%':
        result = n1 % n2
    if operator == '^':
        result = n1 ** n2
    return result


# 括号内的算式求出计算结果后,计算√()、sin()或arcsin()
def gaojie(op_stack, num_stack):
    if op_stack[-1] == '√':
        op = op_stack.pop()
        num2 = num_stack.pop()
        num_stack.append(sqrt(num2))
    elif op_stack[-1] == 'sin':
        op = op_stack.pop()
        num2 = num_stack.pop()
        num_stack.append(sin(num2))
    elif op_stack[-1] == 'arcsin':
        op = op_stack.pop()
        num2 = num_stack.pop()
        num_stack.append(asin(num2))
    elif op_stack[-1] == 'ln':
        op = op_stack.pop()
        num2 = num_stack.pop()
        num_stack.append(log(num2))


# 负责遍历算式列表中的字符,决定压入数字栈中或压入运算符栈中或弹栈运算
def final_calc(formula_list):
    """
    :param formula_list: 算式列表
    :return: 计算结果
    """
    num_stack = []  # 数字栈
    op_stack = []  # 运算符栈
    for item in formula_list:
        operator = is_operator(item)
        # 压入数字栈
        if not operator:
            # π和e转换成可用于计算的值
            if item == 'π':
                num_stack.append(pi)
            elif item == '-π':
                num_stack.append(-pi)
            elif item == 'e':
                num_stack.append(e)
            elif item == '-e':
                num_stack.append(-e)
            else:
                num_stack.append(float(item))  # 字符串转换为浮点数
        # 如果是运算符
        else:
            while True:
                # 如果运算符栈为空,则无条件入栈
                if len(op_stack) == 0:
                    op_stack.append(item)
                    break
                # 决定压栈或弹栈
                tag = decision(op_stack[-1], item)
                # 如果是-1,则压入运算符栈并进入下一次循环
                if tag == -1:
                    op_stack.append(item)
                    break
                # 如果是0,则弹出运算符栈内最后一个'('并丢掉当前')',进入下一次循环
                elif tag == 0:
                    op_stack.pop()
                    gaojie(op_stack, num_stack)  # '('前是'√'、'sin'或'arcsin'时,对括号内算式的计算结果作相应的运算
                    break
                # 如果是1,则弹出运算符栈内最后一个元素和数字栈内最后两个元素
                elif tag == 1:
                    if item in ['√', 'sin', 'arcsin']:
                        op_stack.append(item)
                        break
                    op = op_stack.pop()
                    num2 = num_stack.pop()
                    num1 = num_stack.pop()
                    # 将计算结果压入数字栈并接着循环,直到遇到break跳出循环
                    num_stack.append(calculate(num1, num2, op))
    # 大循环结束后,数字栈和运算符栈中可能还有元素的情况
    while len(op_stack) != 0:
        op = op_stack.pop()
        num2 = num_stack.pop()
        num1 = num_stack.pop()
        num_stack.append(calculate(num1, num2, op))
    result = str(num_stack[0])
    # 去掉无效的0和小数点,例:1.0转换为1
    if result[len(result) - 1] == '0' and result[len(result) - 2] == '.':
        result = result[0:-2]
    return result


if __name__ == '__main__':
    # formula = "2 * ( 3 - 5 * ( - 6 + 3 * 2 / 2 ) )"
    formula = "arcsin ( 0 )"
    formula_list = formula_format(formula)
    result = final_calc(formula_list)
    print("算式:", formula)
    print("计算结果:", result)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: Python语言实现科学计算器

本文链接: https://www.lsjlt.com/news/138008.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python语言实现科学计算器
    本文实例为大家分享了Python语言实现科学计算器的具体代码,供大家参考,具体内容如下 自学Python语言一个月,还是小白,发一个科学计算器的代码,希望大家批评指正,共勉嘛。 c...
    99+
    2022-11-13
  • R语言科学计算RcppArmadillo简明手册
    目录1. 常用数据类型2. 数学运算3. 向量、矩阵和域的创建基本创建用函数创建4. 初始化,元素访问,属性和成员函数4.1. 元素初始化 Element initializatio...
    99+
    2022-11-12
  • java如何实现科学计算器
    这篇文章主要介绍了java如何实现科学计算器的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇java如何实现科学计算器文章都会有所收获,下面我们一起来看看吧。实现思路通过点击按钮可以得到一个算术表达式,并且它是一...
    99+
    2023-07-02
  • Android实现横屏切换科学计算器
    本文实例为大家分享了Android实现横屏切换科学计算器的具体代码,供大家参考,具体内容如下 简单计算器设计,实现以下功能: 1、竖屏时能实现基本的加减乘除运算、回退和清空输入。 2...
    99+
    2022-11-12
  • java实现科学计算器的全过程与代码
    目录介绍实现思路实现过程和代码1.界面设计2.栈,中缀转后缀3.判断错误4.计算后缀表达式5.事件监听器完整代码总结介绍 本次设计的是一个有33个按钮的科学计算器。可以进行加,减,乘...
    99+
    2022-11-13
  • C语言实现简单计算器
    本文实例为大家分享了C语言实现简单计算器的具体代码,供大家参考,具体内容如下 实现效果如图: 实现代码如下: #include<stdio.h> #include...
    99+
    2022-11-12
  • C语言实现个税计算器
    最近在学C语言基础,在导师的指导下,先准备写个个税薪资计算器。这是一个简单的C语言小demo。主要用到了C语言的函数,if选择语句。 程序的主要代码如下(可运行): #inclu...
    99+
    2022-11-12
  • 计算机语言&Python解释器
    [TOC] 1.1机器语言 由于计算机内部只能接受二进制代码,因此,用二进制代码0和1描述的指令称为机器指令,全部机器指令的集合构成计算的机器语言机器语言属于低级语言 1.2汇编语言 汇编语言的实质和机器语言是相同的,都是直接对硬件操作...
    99+
    2023-01-31
    计算机语言 Python
  • 用C语言实现计算器功能
    本文实例为大家分享了用C语言实现计算器功能的具体代码,供大家参考,具体内容如下 代码如下: #include<stdio.h> //C语言编写计算器程序 ^_^ v...
    99+
    2022-11-12
  • Android中怎么实现一个横屏切换科学计算器
    这篇文章给大家介绍Android中怎么实现一个横屏切换科学计算器,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。简单计算器设计,实现以下功能:竖屏时能实现基本的加减乘除运算、回退和清空输入。2、横屏时变为科学计算器,实现...
    99+
    2023-06-15
  • C语言实现简易计算器功能
    本文实例为大家分享了C语言实现简易计算器功能的具体代码,供大家参考,具体内容如下 表达式求值项目(多功能计算器)。该项目主要包含了10个模块,10项功能: 1:加法运算:主要进行两个...
    99+
    2022-11-13
  • Python语言实现SIFT算法
    目录一、什么是SIFT算法二、准备工作2.1 实验设备2.2 OpenCV安装三、实验工作3.1 图像选择3.2 程序实现3.3 程序结果本文侧重于如何使用Python语言实现SIF...
    99+
    2022-11-12
  • C语言实现计算器的两种方法
    本文实例为大家分享了C语言实现计算器的具体代码,供大家参考,具体内容如下 C语言计算器两种方法 //一般做法 #include<stdio.h> #include<...
    99+
    2022-11-13
  • Android Studio实现简易计算器App (Java语言版)
    本文实例为大家分享了Android Studio实现简易计算器App的具体代码,供大家参考,具体内容如下 效果演示 布局文件 <xml version="1.0" enc...
    99+
    2022-06-07
    java语言 studio JAVA app Android
  • 用C语言实现简单的计算器功能
    本文实例为大家分享了C语言实现简单的计算器功能的具体代码,供大家参考,具体内容如下 简单计算器,实现简单的加减乘除功能,选择对应的运算符输出运算符对应的编号,然后输入我们要计算的两个...
    99+
    2022-11-13
  • C语言运用回调函数实现计算器
    本文实例为大家分享了C语言运用回调函数实现计算器的具体代码,供大家参考,具体内容如下 回调函数概念: 回调函数是一个通过函数指针调用的函数,也就是将函数的地址作为参数传递给另一个函数...
    99+
    2022-11-12
  • C语言实现计算器的代码怎么写
    这篇文章主要介绍了C语言实现计算器的代码怎么写的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C语言实现计算器的代码怎么写文章都会有所收获,下面我们一起来看看吧。C语言计算器两种方法//一般做法#include&...
    99+
    2023-06-29
  • C语言怎么实现24点游戏计算器
    要实现24点游戏计算器,可以使用递归的方法来进行计算。以下是一个简单的C语言实现:```c#include #include #de...
    99+
    2023-08-18
    C语言
  • C语言实现数学表达式运算
    本文实例为大家分享了C语言实现数学表达式运算的具体代码,供大家参考,具体内容如下 1、开发思路: (假设有表达式 2 * 3 * ( 1 + 2) ) 数字要一个一个取出放在内存中,...
    99+
    2022-11-12
  • 如何使用Java中的NumPy库实现高效的科学计算?
    如何使用Java中的NumPy库实现高效的科学计算? NumPy是Python中用于科学计算的一个开源库,它提供了高效的数值运算和矩阵操作功能。而Java作为另一个流行的编程语言,也可以使用NumPy库来实现高效的科学计算。在本文中,我们将...
    99+
    2023-08-28
    numy shell 并发
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作