Python 个性计算器(可不断加挂功能模块实现个性化)


Python 官网 https://www.python.org/


  这里,才 python 前沿。可惜是英文原版。所以,我要练习英文阅读。🧐🧐


  自学并不是什么神秘的东西,一个人一辈子自学的时间总是比在学校学习的时间长,没有老师的时候总是比有老师的时候多。

            —— 华罗庚



练习:个性计算器


  1. 计算器主界面
  2. 菜单显示
  3. 退出菜单
  4. 菜单确认
  5. 简单计算器
  6. 加挂其她功用
  7. 完整代码

  看到大佬博文《【C语言】计算器》,诱发我也想 py 一个。
  设想:我还不会 gui 界面编码,就只能码个程序 print Menus 的了。
  鉴于 python 有 eval() 内置函数,她可以把字符串转化为代码语句并执行,所以“计算器”的简单计算直接输入四则混合运算的式子(数学表达式)就可以了。input() 接收输入字符串,直接调用 eval() 计算输出结果,实现简单的“四则混合运算”。
  对于乘方开方对数三角函数等高级计算,就需加载 python 的 math 的相应方法。还可以做一些个性计算,比如圆周长面积、长方体表面积体积(正方体是特殊的长方体,可以不单列)……可以尽情释放您的思绪。🤪🤪
  对于写代码样式,我更喜欢函数式编程。当然采用自定义函数编写功能模块了。

  通过一天的“业余”调试,我炼的 python 版“计算器”,基本可以上“笔记”了。🤗🤗

回首页


计算器主界面

在这里插入图片描述
代码

def main():
    '''计算器主执行代码块'''    
    while True: # 菜单列印和确认死循环,不主动退出就一直执行循环。
        clear() 
        menu_show() # 屏幕打印菜单。
        is_menu() # 菜单选择。

回首页


菜单列印

  这次不象以前练习,设计为动态菜单列表。如需添加菜单项,只需把菜单项字符串放在列表相应位置就好。
(注意:增加菜单后,记得到“菜单确认”模块修改 range() 合法菜单选择范围,不然无法选中新增菜单序号。并增添相应的 elif 选项。)

代码

def menu_show():
    '''菜单打印模块,无需参数传递'''
    menus = ('简单计算', '素数查找', '退出') # 这次不象以前练习,设计为动态菜单列表。如需添加菜单项,只需把菜单项字符串放在列表相应位置就好。(注意:增加菜单后,记得到“菜单确认”模块修改 range() 合法菜单选择范围,不然无法选中新增菜单序号。并增添相应的 elif 选项。)
    print(f"\n\n{color(1, 'f_green')}{'':*^41}\n{'星月计算器':^36}\n{'(Stars&Moon Calculator)':^42}\n{'【':>10}{localtime_show()}】\n{'':-^41}{color(0)}")
    for k,i in enumerate(menus): # 遍历枚举函数 enumerate() ,方便列印菜单序号。
        if i != '退出':
            print(f"\n{k+1:>16}. {i}")
        else:
            exit_s = f" {0}. {i} "
            print(f"\n{'':>13}{exit_s:=^13}")
    print(f"\n{color(1, 'f_green')}{'':-^41}\n{'Author:Dream-elf_cq':^41}{'(梦幻精灵_cq)':^37}\n{'':*^41}{color(0)}")

回首页


退出菜单

在这里插入图片描述

代码

if menu == 0: # 0. 退出
        clear() 
        print(f"{cut_line()}{color(' 欢迎下次使用“星月计算器” ', 'f_purple'):=^39}{cut_line()}")
        exit() 

回首页


菜单确认

def is_menu():
    '''菜单确认'''
    while True:
        try: # 菜单选择错误捕获。
            menu = int(input(f"\n\n{'菜单选择:':>12}"))
            if menu not in range(3): # 合法菜单选择序号范围设定。
                error_show()
                input(f"\n{'错误类型:没有此项菜单!':-^29}")
            break
        except Exception as error:
            error_show() 
            input(f"\n错误类型:{error}")
    # 菜单项增加后,就得增加一个 elif 。
    if menu == 0: # 0. 退出
        exit() 
    elif menu == 1: # 1. 简单计算器
        less_count()
    elif menu == 2: # 2. 素数查找
        find_primes()

回首页


简单计算器

  虽言简单计算器,但只要是符合 python 规范的表达式,都能有结果输出。
  这,足见 eval() 之强了吧。🤪🤪

在这里插入图片描述

注意:由于 {}、[ ] 在python 中另有定义,所以在本“计算器”中输入计算表达式, {}、[ ] 皆用成对的 () 替代,不影响结果输出(这也符合 python 规范)。所以,我规定了“计算器”的“计算表达式”字符集,超出范围报错重输。

如:

------简单计算器(数学四则混合运算)-------

计算表达式输入:(2*(6-(2+2)))

    结果:4.0000

另:本“计算器”从 python “脱模”而来,所以“计算表达式”“无视”空格的存在(英文空格)。
如:

在这里插入图片描述

  虽然三种写法一样,但我建议第一种( python 风格的“标准”写法);千万别写成第三种,虽然也能得相同结果,但看着“别扭”不是。😜
  还可以完成乘方开方等“高级”一点儿的操作。😜😜

在这里插入图片描述

  计算 3 的平方、16 的平方根、81 的四次方根。(求 n 次方根,不要写成 “16 ** 1/2”、“81 ** 1/4”,那样就成了“16 的一次方除以 2 ”、“81 的一次方除以 4 ”。)

代码

def less_count(): # 虽言简单计算器,但只要是符合 python 规范的表达式,都能有结果输出。这,足见 eval() 之强了吧。🤪🤪
    s = '''简单计算器(数学四则混合运算)'''
    
    def in_rules():
        '''解析计算表达式合规符号集群'''
        rules = [] # 计算表达式字符规则列表
        rules.extend([str(i) for i in range(10)]) # 10 个数字。
        rules.extend(list(' +-*/()')) # 运算符号。
        rules.extend([chr(i) for i in range(65,91)]) # 英文大写字母。
        rules.extend([chr(i) for i in range(97,123)]) # 英文小写字母。
        return tuple(rules)
        
    #print(f"\n\n计算表达式合法字符集:\n")
    #print(*in_rules()) # * 号打破“容器”(tuple)元素列印。(打印 in_rules 后注释掉了。)
    while True:
        in_s = input(f"\n\n{s:-^28}\n\n\n{'计算表达式输入:'}")
        if in_s == '':
            return 
        for i in list(in_s):
            if i not in in_rules():
                error_show()
                input(f"\n{'错误类型:输入非法字符!':-^29}")
        else:
            break          
    input(f"\n\n{'结果:':>12}{eval(in_s):.4f}\n\n{'':*^41}") # 我设定 eval() 函数计算数学表达式结果为四位小数({:.4f}),可自行更改。
    less_count() # 自调用,“另类”替代循环。

回首页

加载更多功用



素数查找


菜单

在这里插入图片描述
效果

在这里插入图片描述

代码

def find_primes():
    s = '''素数查找'''

    clear() 
    gui_head()
    
    def isprime(n): # 内层函数
        '''素数判定'''
        for i in range(2, n):
            if n%i == 0:
                return # 非素数,返回 None 。
        return n # 是素数,返回该数。
            
    while True:
        try: # 输入素数限定范围错误捕获。
            in_s = input(f"\n\n{s:-^37}\n\n\n{'输入范围(10~500):':>12}")
            if in_s == '':
                return 
            in_num = int(in_s)
            if in_num not in range(10, 501):
                error_show()
                input(f"\n{'错误类型:输入超出范围!':-^29}")
            else:
                break
        except Exception as error:
            error_show() 
            input(f"\n错误类型:{error}")
    primes = [str(i) for i in range(2, in_num+1) if isprime(i)] # 用内层函数解析给定范围的素数。
    input(f"\n\n从 2 到 {in_num}的素数有:\n\n{','.join(primes)}\n\n{'':*^41}")
    return in_s

回首页


长方体计算


菜单
在这里插入图片描述
效果

在这里插入图片描述

代码

def cuboid():
    s = '''长方体相关计算'''
    clear() # 清屏调用。
    gui_head() # 计算器界面头调用。
    while True:
        try: # 输入素数限定范围错误捕获。
            in_s = input(f"\n\n{s:-^34}\n\n\n{'输入棱长(a b c):':>12}").strip()
            if in_s == '':
                return 
            abc_list = [float(i) for i in in_s.split(' ')]            
            flag = False # 输入错误循环标识。
            for i in abc_list:
                if i <= 0:
                    error_show()
                    input(f"\n{'错误类型:棱长为 Zero or Negative !':^31}")
                    flag = True
                    break
            if flag is True:
                continue
            a, b, c = abc_list
            break
        except Exception as error:
            error_show() 
            input(f"\n错误类型:{error}")

    c12 = round(4 * (a + b + c), 2) # 棱长和。
    s6 = round(2 * (a*b + a*c + b*c), 2) #表面积。
    v = round(a * b * c, 2) #体积。
    input(f"{cut_line()}{'长方体:':>12}{a:>6}×{b}×{c}\
\n\n{'棱长和:':>12}{color(str(c12), 'f_green'):>22}\
\n\n{'表面积:':>12}{color(str(s6), 'f_green'):>22}\
\n\n{'体积:':>13}{color(str(v), 'f_green'):>22}{cut_line()}")
    return in_s

回首页


圆计算

  圆计算模块,可以根据输入的半径,输出直径和面积。面积所用π,是取的math模块中的常数pi,用于普通计算,已足够精确,结果保留两位小数(用round()取约)。

在这里插入图片描述

在命令行模式下试炼,看到 math.pi 取值,已有15位小数,对于普通计算已然“精益求精”。😀😀

菜单

在这里插入图片描述

效果

在这里插入图片描述

代码

def circle():
    s = '''圆计算'''
    clear() # 清屏调用。
    gui_head() # 计算器界面头调用。
    while True:
        try: # 输入素数限定范围错误捕获。
            in_s = input(f"\n\n{s:-^38}\n\n\n{'输入半径:':>12}").strip()
            if in_s == '':
                return
            r = float(in_s)
            if r <= 0:
                error_show()
                input(f"\n{'错误类型:半径为 Zero or Negative !':^31}")
                continue
            break
        except Exception as error:
            error_show() 
            input(f"\n错误类型:{error}")
    input(f"{cut_line()}{'圆:':>16}{'R  = ':>9}{r:>4}\
\n\n{'直径:':>16}{color(str(2*r), 'f_green'):>22}\
\n\n{'半径:':>16}{color(str(r), 'f_green'):>22}\
\n\n{'面积:':>16}{color(str(round(math.pi * r**2, 2)), 'f_green'):>22}{cut_line()}")
    return in_s

回首页


其她功用

  py计算器,还可以加挂其她功用模块,只需将功用模块加入 calculator_py.py 文件,前在 menu_show() 中menus列表加入菜单显示字符 ,在ismenu() 中加入功用模块的调用语句就好。😋

    elif menu == 4: # 4. 圆
        while True: # 功能模块循环。
            clear() # 清屏。
            if not circle(): # 功能模块函数返回''为真。
                break # 输入'',退出功能模块。

回首页

完整 Python 代码


  我的解题思路,已融入代码注释,博文中就不再赘述。

(如果从语句注释不能清楚作用,请评论区留言指教和探讨。🤝)

#!/sur/bin/env python 
# coding: utf-8 

'''
filename = calculator_py.py
author = '梦幻精灵_cq'
'''

# 看到大佬博文看到大佬博文《【C语言】计算器》,诱发我也想 py 一个。设想:我还不会 gui 界面编码,就只能码个程序 print Menus 的了。
# 鉴于 python 有 eval() 内置函数,她可以把字符串转化为代码语句并执行,所以“计算器”的简单计算直接输入四则混合运算的式子(数学表达式)就可以了。input() 接收输入字符串,直接调用 eval() 计算输出结果,实现简单的“四则混合运算”。
# 对于乘方开方对数三角函数等高级计算,就需加载 python 的 math 的相应方法。还可以做一些个性计算,比如圆周长面积、长方体表面积体积(正方体是特殊的长方体,可以不单列)……可以尽情释放您的思绪。
# 对于写代码样式,我更喜欢函数式编程。当然采用自定义函数编写功能模块了。

import math # 加载数学模块。
from time import localtime # 从 time 模块加载当前时间数组获取函数 localtime()。
from mypythontools import color, cut_line, wait, clear # 从自码工具模块中载入颜色输出控制工具 color


def main():
    '''计算器主执行代码块'''    
    while True: # 菜单列印和确认死循环,不主动退出就一直执行循环。
        clear() 
        menu_show() # 屏幕打印菜单。
        is_menu() # 菜单选择。


def localtime_show():
    '''当前时间列印'''
    t = localtime() # 获取当前时间数组。
    return f"{t[3]:2d}:{t[4]:2d} {t[0]}年{t[1]:2d}月{t[2]:2d}日" # 为了齐整,我设置了当前时间格式化字符串中,时、分、月、日分别用两个英文字符位。


def error_show():
    '''错误提示打印'''
    print(f"\n\n{'输入错误!':=^36}")


def gui_head():
    '''计算器界面头'''
    print(f"\n\n{color(1, 'f_green')}{'':*^41}\n{'星月计算器':^36}\n{'(Stars&Moon Calculator)':^42}\n{'【':>10}{localtime_show()}】\n{'':-^41}{color(0)}")


def gui_tail():
    '''计算器界面尾'''
    print(f"\n{color(1, 'f_green')}{'':-^41}\n{'Author:Dream-elf_cq':^41}{'(梦幻精灵_cq)':^37}\n{'':*^41}{color(0)}")


def menu_show():
    '''菜单打印模块,无需参数传递'''
    menus = ('简单计算', '素数查找', '长方体计算', '圆计算', '退出') # 这次不象以前练习,设计为动态菜单列表。如需添加菜单项,只需把菜单项字符串放在列表相应位置就好。(注意:增加菜单后,记得到“菜单确认”模块修改 range() 合法菜单选择范围,不然无法选中新增菜单序号。并增添相应的 elif 选项。)
    clear() # 清屏。
    gui_head() # 界面头调用。
    for k,i in enumerate(menus): # 遍历枚举函数 enumerate() ,方便列印菜单序号。
        if i != '退出':
            print(f"\n{k+1:>16}. {i}")
        else:
            exit_s = f" {0}. {i} "
            print(f"\n{'':>13}{exit_s:=^13}")
    gui_tail() # 界面尾调用。


def is_menu():
    '''菜单确认'''
    while True:
        try: # 菜单选择错误捕获。
            menu = int(input(f"\n\n{'菜单选择:':>12}"))
            if menu not in range(5): # 合法菜单选择序号范围设定。
                error_show()
                input(f"\n{'错误类型:没有此项菜单!':-^29}")
            break
        except Exception as error:
            error_show() 
            input(f"\n错误类型:{error}")
    # 菜单项增加后,就得增加一个 elif 。
    if menu == 0: # 0. 退出
        clear()
        print(f"{cut_line()}{color(' 欢迎下次使用“星月计算器” ', 'f_purple'):=^39}{cut_line()}")
        exit() 
    elif menu == 1: # 1. 简单计算器
        while True:
            clear() 
            if not less_count():
                break 

    elif menu == 2: # 2. 素数查找
        while True:
            clear() 
            if not find_primes():
                break 
 
    elif menu == 3: # 3. 长方体
        while True:
            clear() 
            if not cuboid():
                break 

    elif menu == 4: # 4. 圆
        while True:
            clear() 
            if not circle():
                break 


# ---======== 下面是,计算器功能函数 ========---

def less_count(): # 虽言简单计算器,但只要是符合 python 规范的表达式,都能有结果输出。这,足见 eval() 之强了吧。🤪🤪
    s = '''简单计算器(数学四则混合运算)'''

    clear() 
    gui_head()

    def in_rules():
        '''解析计算表达式合规符号集群'''
        rules = [] # 计算表达式字符规则列表
        rules.extend([str(i) for i in range(10)]) # 10 个数字。
        rules.extend(list(' +.-*/()')) # 运算符号。
        rules.extend([chr(i) for i in range(65,91)]) # 英文大写字母。
        rules.extend([chr(i) for i in range(97,123)]) # 英文小写字母。
        return tuple(rules)
        
    #print(f"\n\n计算表达式合法字符集:\n")
    #print(*in_rules()) # * 号打破“容器”(tuple)元素列印。(打印 in_rules ,只需去除前面的注释标识符。)
    while True:
        in_s = input(f"\n\n{s:-^28}\n\n\n{'计算表达式输入:'}")
        if in_s == '':
            return 
        for i in list(in_s):
            if i not in in_rules():
                error_show()
                input(f"\n{'错误类型:输入非法字符!':-^29}")
        else:
            break

    try:
        input(f"\n\n{'结果:':>12}{eval(in_s):.4f}\n\n{'':*^41}") # 我设定 eval() 函数计算数学表达式结果为四位小数({:.4f}),可自行更改。
    except Exception as error:
        error_show() 
        input(f"\n错误类型:{error}")
    return in_s


def find_primes():
    s = '''素数查找'''

    clear() 
    gui_head()
    
    def isprime(n): # 内层函数
        '''素数判定'''
        for i in range(2, n):
            if n%i == 0:
                return # 非素数,返回 None 。
        return n # 是素数,返回该数。
            
    while True:
        try: # 输入素数限定范围错误捕获。
            in_s = input(f"\n\n{s:-^37}\n\n\n{'输入范围(10~500):':>12}")
            if in_s == '':
                return 
            in_num = int(in_s)
            if in_num not in range(10, 501):
                error_show()
                input(f"\n{'错误类型:输入超出范围!':-^29}")
            else:
                break
        except Exception as error:
            error_show() 
            input(f"\n错误类型:{error}")
    primes = [str(i) for i in range(2, in_num+1) if isprime(i)] # 用内层函数解析给定范围的素数。
    input(f"\n\n从 2 到 {in_num}的素数有:\n\n{','.join(primes)}\n\n{'':*^41}")
    return in_s


def cuboid():
    s = '''长方体相关计算'''
    clear() # 清屏调用。
    gui_head() # 计算器界面头调用。
    while True:
        try: # 输入素数限定范围错误捕获。
            in_s = input(f"\n\n{s:-^34}\n\n\n{'输入棱长(a b c):':>12}").strip()
            if in_s == '':
                return 
            abc_list = [float(i) for i in in_s.split(' ')]            
            flag = False # 输入错误循环标识。
            for i in abc_list:
                if i <= 0:
                    error_show()
                    input(f"\n{'错误类型:棱长为 Zero or Negative !':^31}")
                    flag = True
                    break
            if flag is True:
                continue
            a, b, c = abc_list
            break
        except Exception as error:
            error_show() 
            input(f"\n错误类型:{error}")

    c12 = round(4 * (a + b + c), 2) # 棱长和。
    s6 = round(2 * (a*b + a*c + b*c), 2) #表面积。
    v = round(a * b * c, 2) #体积。
    input(f"{cut_line()}{'长方体:':>12}{a:>6}×{b}×{c}\
\n\n{'棱长和:':>12}{color(str(c12), 'f_green'):>22}\
\n\n{'表面积:':>12}{color(str(s6), 'f_green'):>22}\
\n\n{'体积:':>13}{color(str(v), 'f_green'):>22}{cut_line()}")
    return in_s


def circle():
    s = '''圆计算'''
    clear() # 清屏调用。
    gui_head() # 计算器界面头调用。
    while True:
        try: # 输入素数限定范围错误捕获。
            in_s = input(f"\n\n{s:-^38}\n\n\n{'输入半径:':>12}").strip()
            if in_s == '':
                return
            r = float(in_s)
            if r <= 0:
                error_show()
                input(f"\n{'错误类型:半径为 Zero or Negative !':^31}")
                continue
            break
        except Exception as error:
            error_show() 
            input(f"\n错误类型:{error}")
    input(f"{cut_line()}{'圆:':>16}{'R  = ':>9}{r:>4}\
\n\n{'直径:':>16}{color(str(2*r), 'f_green'):>22}\
\n\n{'半径:':>16}{color(str(r), 'f_green'):>22}\
\n\n{'面积:':>16}{color(str(round(math.pi * r**2, 2)), 'f_green'):>22}{cut_line()}")
    return in_s



# Stars&Moon Calculayor 主执行代码:
if __name__ == '__main__': # 本 *.py 文档作为模块调用,不执行后续语句。
    main() # 调用 calculator_py 主程序代码块。
  本 *.py 文件,可以在其他代码中作为模块调用。



回首页

上一篇:求偶数和、阈值分割和求差( list 对象的两个基础小题 )

下一篇:练习:班里有人和我同生日难吗?(概率probability、蒙特卡洛随机模拟法)


我的HOT博:
推荐条件 点阅破千

回首页


老齐漫画头像

精品文章:

来源:老齐教室


回首页

Python 入门指南【Python 3.6.3】

好文力荐:

CSDN实用技巧博文:


  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦幻精灵_cq

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值