如何在 Python 3 中制作一个计算器程序
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。
简介
Python 编程语言是处理数字和求解数学表达式的强大工具。这种特性可以用来制作有用的程序。
本教程介绍了如何在 Python 3 中制作一个命令行计算器程序的学习练习。这个计算器只能执行基本的算术运算,但本指南的最后一步可以作为改进代码以创建更强大计算器的起点。
我们将使用数学运算符、变量、条件语句、函数和处理用户输入来制作我们的计算器。
先决条件
在进行本教程之前,您应该在本地计算机上安装了 Python 3,并已在计算机上设置好编程环境。如果您需要安装 Python 或设置环境,可以按照适用于您操作系统的指南进行操作。
步骤 1 —— 提示用户输入
当人类提供方程式供计算机求解时,计算器的效果最佳。您将从用户输入数字的地方开始编写程序。
首先,您需要为程序创建一个文件。在本例中,我们将使用文本编辑器 nano 并将文件命名为 calculator.py:
nano calculator.py
接下来,您将向该文件添加内容以运行程序。对于这个程序,您将要求用户输入两个数字,因此指示程序提示用户输入两个数字。您可以使用 Python 的内置 input() 函数从键盘接受用户生成的输入。在 input() 函数的括号内,您可以传递一个字符串以提示用户,然后将用户的输入赋给一个变量。请记住,在请求输入时,在您的字符串末尾包含一个空格可能会有所帮助,这样用户的输入和提示字符串之间就会有一个空格:
number_1 = input('输入第一个数字:')
number_2 = input('输入第二个数字:')
在写完两行后,您应该在运行程序之前保存程序。如果您使用的是 nano,您可以按 CTRL + X 然后按 Y 和 ENTER 退出。
使用以下命令运行您的程序:
python calculator.py
这将开始您的程序的提示,您可以在终端窗口中进行响应:
输入第一个数字:5
输入第二个数字:7
如果您多次运行此程序并改变输入,您会注意到您可以在提示时输入任何内容,包括单词、符号、空格或回车键。这是因为 input() 将数据作为字符串接收,并不知道您要寻找数字。
您将希望在此程序中使用数字有两个原因:
- 使程序能够执行数学计算
- 验证用户的输入是否为数字字符串
根据计算器的需求,您可能希望将从 input() 函数得到的字符串转换为整数或浮点数。对于本教程,整数适合我们的目的,因此将 input() 函数包装在 int() 函数中以将输入转换为整数数据类型:
number_1 = int(input('输入第一个数字:'))
number_2 = int(input('输入第二个数字:'))
现在,如果您运行程序并输入两个整数,您将不会遇到错误:
输入第一个数字:23
输入第二个数字:674
但是,如果您输入字母、符号或任何其他非整数,您将遇到以下错误:
输入第一个数字:sammy
Traceback (most recent call last):File "testing.py", line 1, in <module>number_1 = int(input('输入第一个数字:'))
ValueError: invalid literal for int() with base 10: 'sammy'
到目前为止,您已经设置了两个变量以存储整数数据类型的用户输入。您还可以尝试将输入转换为浮点数。
步骤 2 —— 添加运算符
在程序完成之前,您将添加共计四个数学运算符:+ 用于加法、- 用于减法、* 用于乘法和 / 用于除法。
在构建程序时,您将希望确保每个部分都能正常运行,因此从设置加法开始。您将在一个打印函数中添加两个数字,以便使用计算器的人能够看到内容:
number_1 = int(input('输入第一个数字:'))
number_2 = int(input('输入第二个数字:'))print(number_1 + number_2)
运行程序并在提示时输入两个数字,以确保它按预期工作:
输入第一个数字:8
输入第二个数字:3
11
输出显示程序正在正确运行。现在,为用户提供更多上下文以便在程序运行时得到充分的信息。为此,使用字符串格式化来帮助正确格式化文本并提供反馈。您希望用户收到有关他们输入的数字和正在使用的运算符以及产生的结果的确认:
number_1 = int(input('输入第一个数字:'))
number_2 = int(input('输入第二个数字:'))print('{} + {} = '.format(number_1, number_2))
print(number_1 + number_2)
现在,当您运行程序时,将会有额外的输出,让用户确认程序正在执行的数学表达式:
输入第一个数字:90
输入第二个数字:717
90 + 717 =
807
使用字符串格式化为用户提供了更多的反馈。
此时,您可以使用与加法相同的格式向程序添加其余的运算符:
# 加法
print('{} + {} = '.format(number_1, number_2))
print(number_1 + number_2)# 减法
print('{} - {} = '.format(number_1, number_2))
print(number_1 - number_2)# 乘法
print('{} * {} = '.format(number_1, number_2))
print(number_1 * number_2)# 除法
print('{} / {} = '.format(number_1, number_2))
print(number_1 / number_2)
在上面的程序中,你正在将剩余的运算符 -、* 和 / 添加到程序中。如果此时运行程序,程序将执行上述所有操作。但是,你希望限制程序一次只执行一个操作。为此,你将使用条件语句。
步骤 3 —— 添加条件语句
calculator.py 程序的目标是让用户能够在不同的运算符中进行选择。首先在程序顶部添加一些信息以及一个选择,以便用户知道该怎么做。
通过使用三重引号在几行上写一个字符串:
'''
请输入您想要完成的数学运算:
+ 代表加法
- 代表减法
* 代表乘法
/ 代表除法
'''
该程序使用每个运算符符号供用户进行选择,因此如果用户想要执行除法,他们将输入 /。你可以选择任何你想要的符号,比如 1 代表加法 或 b 代表减法。
因为你要求用户输入,所以你需要使用 input() 函数。将字符串放入 input() 函数中,并将该输入的值传递给一个变量,你将其命名为 operation:
operation = input('''
请输入您想要完成的数学运算:
+ 代表加法
- 代表减法
* 代表乘法
/ 代表除法
''')number_1 = int(input('输入第一个数字:'))
number_2 = int(input('输入第二个数字:'))print('{} + {} = '.format(number_1, number_2))
print(number_1 + number_2)print('{} - {} = '.format(number_1, number_2))
print(number_1 - number_2)print('{} * {} = '.format(number_1, number_2))
print(number_1 * number_2)print('{} / {} = '.format(number_1, number_2))
print(number_1 / number_2)
此时,如果运行程序,无论在第一个提示处输入什么,都不会发生任何事情。为了纠正这一点,将一些条件语句添加到程序中。由于你已经构建了程序的结构,if 语句将执行加法,将有 3 个 elif 语句用于其他每个运算符,else 语句将用于处理用户未输入运算符符号的错误:
operation = input('''
请输入您想要完成的数学运算:
+ 代表加法
- 代表减法
* 代表乘法
/ 代表除法
''')number_1 = int(input('输入第一个数字:'))
number_2 = int(input('输入第二个数字:'))if operation == '+':print('{} + {} = '.format(number_1, number_2))print(number_1 + number_2)elif operation == '-':print('{} - {} = '.format(number_1, number_2))print(number_1 - number_2)elif operation == '*':print('{} * {} = '.format(number_1, number_2))print(number_1 * number_2)elif operation == '/':print('{} / {} = '.format(number_1, number_2))print(number_1 / number_2)else:print('您未输入有效的运算符,请重新运行程序。')
通过这个程序,首先提示用户输入一个运算符。例如,假设用户输入 * 来进行乘法。接下来,程序要求输入两个数字,用户输入 58 和 40。此时,程序显示执行的等式和乘积:
请输入您想要完成的数学运算:
+ 代表加法
- 代表减法
* 代表乘法
/ 代表除法
*
请输入第一个数字:58
请输入第二个数字:40
58 * 40 =
2320
由于你构建了程序的结构,如果用户在第一个提示处输入 %,他们直到输入数字后才会收到再次尝试的反馈。你可能需要考虑处理各种情况的其他可能选项。
此时,你已经有了一个完全功能的程序,但是无法执行第二或第三个操作,除非再次运行程序。下一步涉及定义一些函数,以将此功能添加到程序中。
## 第四步 —— 定义函数为了处理用户想要执行程序多次的能力,您需要定义一些函数。首先,将您现有的代码块放入一个函数中。将该函数命名为 `calculate()`,并在函数内部添加一个额外的缩进。为了确保程序运行,您还需要在文件底部调用该函数:```python
# 定义我们的函数
def calculate():operation = input('''
请输入您想要执行的数学运算:
+ 代表加法
- 代表减法
* 代表乘法
/ 代表除法
''')number_1 = int(input('请输入第一个数字:'))number_2 = int(input('请输入第二个数字:'))if operation == '+':print('{} + {} = '.format(number_1, number_2))print(number_1 + number_2)elif operation == '-':print('{} - {} = '.format(number_1, number_2))print(number_1 - number_2)elif operation == '*':print('{} * {} = '.format(number_1, number_2))print(number_1 * number_2)elif operation == '/':print('{} / {} = '.format(number_1, number_2))print(number_1 / number_2)else:print('您没有输入有效的运算符,请重新运行程序。')# 在函数外调用 calculate()
calculate()
接下来,创建第二个由更多条件语句组成的函数。在这段代码中,您希望让用户选择是否要再次计算。您可以基于计算器条件语句来实现这一点,但在这种情况下,您只需要一个 if、一个 elif 和一个 else 来处理错误。
将这个函数命名为 again(),并将其添加到 def calculate(): 代码块之后:
...
# 定义 again() 函数来询问用户是否要再次使用计算器
def again():# 从用户处获取输入calc_again = input('''
您想要再次计算吗?
请输入 Y 表示是,N 表示否。
''')# 如果用户输入 Y,则运行 calculate() 函数if calc_again == 'Y':calculate()# 如果用户输入 N,则向用户道别并结束程序elif calc_again == 'N':print('再见。')# 如果用户输入其他键,则再次运行该函数else:again()# 在函数外调用 calculate()
calculate()
虽然上面的 else 语句中有一些错误处理,但您可能希望更清楚地接受小写的 y 和 n,除了大写的 Y 和 N。为此,可以添加字符串函数 str.upper():
...
def again():calc_again = input('''
您想要再次计算吗?
请输入 Y 表示是,N 表示否。
''')# 通过添加 str.upper() 来接受 'y' 或 'Y'if calc_again.upper() == 'Y':calculate()# 通过添加 str.upper() 来接受 'n' 或 'N'elif calc_again.upper() == 'N':print('再见。')else:again()
...
此时,您应该将 again() 函数添加到 calculate() 函数的末尾,以触发询问用户是否继续的代码:
def calculate():operation = input('''
请输入您想要执行的数学运算:
+ 代表加法
- 代表减法
* 代表乘法
/ 代表除法
''')number_1 = int(input('请输入第一个数字:'))number_2 = int(input('请输入第二个数字:'))if operation == '+':print('{} + {} = '.format(number_1, number_2))print(number_1 + number_2)elif operation == '-':print('{} - {} = '.format(number_1, number_2))print(number_1 - number_2)elif operation == '*':print('{} * {} = '.format(number_1, number_2))print(number_1 * number_2)elif operation == '/':print('{} / {} = '.format(number_1, number_2))print(number_1 / number_2)else:print('您没有输入有效的运算符,请重新运行程序。')# 将 again() 函数添加到 calculate() 函数again()def again():calc_again = input('''
您想要再次计算吗?
请输入 Y 表示是,N 表示否。
''')if calc_again.upper() == 'Y':calculate()elif calc_again.upper() == 'N':print('再见。')else:again()calculate()
现在,您可以在终端窗口中使用 python calculator.py 运行您的程序,并且可以随意进行多次计算。
步骤 5 —— 改进代码
现在你有一个不错、完全功能的程序。然而,你可以做很多事情来改进这段代码。例如,你可以添加一个欢迎函数,在程序的顶部欢迎用户进入程序,就像这样:
def welcome():print('''
欢迎使用计算器
''')
...
# 别忘了调用这个函数
welcome()
calculate()
在整个程序中有很多机会引入更多的错误处理。首先,你可以确保即使用户在要求输入数字时输入 plankton,程序仍然可以继续运行。因为在当前程序中,如果 number_1 和 number_2 不是整数,用户将会收到一个错误并且程序将停止运行。另外,当用户选择除法运算符(/)并且在第二个数字(number_2)中输入 0 时,用户将收到一个 ZeroDivisionError: division by zero 错误。对于这一点,你可能想要使用 try ... except 语句进行异常处理。
这个练习限制了你只能使用四个运算符,但你可以添加额外的运算符,比如:
...operation = input('''
请输入您想要完成的数学运算:
+ 代表加法
- 代表减法
* 代表乘法
/ 代表除法
** 代表乘方
% 代表取模
''')
...
# 别忘了添加更多的条件语句来解决乘方和取模
另外,你可能想要使用循环语句重写部分程序。
处理错误、修改和改进每一个编码项目的方法有很多种。重要的是要记住,解决问题的方法并不是唯一的。
结论
本教程介绍了在命令行上构建计算器的一种可能方法。完成本教程后,你将能够修改和改进代码,并且在其他需要在命令行上接收用户输入的项目上工作。
我们很感兴趣看到你对这个基本命令行计算器项目的解决方案!请随时在评论中发布你的计算器项目。
接下来,你可能想要创建一个基于文本的游戏,比如井字游戏或者石头剪刀布。
相关文章:
如何在 Python 3 中制作一个计算器程序
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 简介 Python 编程语言是处理数字和求解数学表达式的强大工具。这种特性可以用来制作有用的程序。 本教程介绍了如何在 Python 3 中制作…...
搭建shopify本地开发环境
虽然shopify提供了在线编辑器的功能,但是远不及本地编辑器方便高效,这篇文章主要介绍如何在本地搭建shopify开发环境: 1、安装nodejs 18.2 2、安装git 3、安装shopify cli ,使用指令: npm install -g shopify/clilatest 4、安装ruby 5、…...
【在Linux世界中追寻伟大的One Piece】进程信号
目录 1 -> 信号入门 1.1 -> 生活角度的信号 1.2 -> 技术应用角度的信号 1.3 -> 注意 2 -> 信号的概念 2.1 -> 用kill -l命令可以查看系统定义的信号列表 2.2 -> 信号处理常见方式 3 -> 产生信号 3.1 -> Core Dump 3.2 -> 调用系统函数…...
MySQL中NULL值是否会影响索引的使用
MySQL中NULL值是否会影响索引的使用 为何写这一篇文章 🐭🐭在面试的时候被问到NULL值是否会走索引的时候,感到有点不理解,于是事后就有了这篇文章 问题: 为name建立索引,name可以为空select * from user …...
Chrome 浏览器:现代网络浏览的先锋
Chrome 浏览器:现代网络浏览的先锋 Chrome 浏览器,由谷歌公司开发的一款快速、简单且安全的网络浏览器,自2008年发布以来,已经成为全球最受欢迎的浏览器之一。本文将深入探讨 Chrome 浏览器的特点、功能、发展历程以及其对现代网…...
蓝牙定位的MATLAB仿真程序(基于信号强度,平面内的定位,四个蓝牙基站)
这段代码通过RSSI信号强度实现了蓝牙定位,展示了如何使用锚点位置和测量的信号强度来估计未知点的位置。它涵盖了信号衰减模型、距离计算和最小二乘法估计等基本概念。通过图形化输出,用户可以直观地看到真实位置与估计位置的关系。 文章目录 蓝牙定位原理蓝牙定位的原理优缺…...
解决docker一直出现“=> ERROR [internal] load metadata for docker.io/library/xxx“的问题
docker拉取镜像时报错,除标题外,还报如下信息 此时想到是不是拉取超时呢,然后配置了一下docker拉取镜像源 vm /etc/docker/daemon.json { "registry-mirrors": ["https://jq794zz5.mirror.aliyuncs.com"] } # 重新加载配…...
Django学习笔记五:templates使用详解
Django的模板系统是一个强大的工具,用于将动态数据渲染到HTML页面中。以下是Django模板系统的详细用法: 模板的基本概念 Django模板使用一个特殊的语法来插入变量、标签和过滤器。 创建模板 创建模板目录:在你的Django应用中创建一个名为…...
PriorityQueue分析
概述 PriorityQueue,优先级队列,一种特殊的队列,作用是能保证每次取出的元素都是队列中权值最小的(Java的优先队列每次取最小元素,C的优先队列每次取最大元素)。元素大小的评判可以通过元素本身的自然顺序…...
Hive数仓操作(六)
一、 Hive 分区表 Hive 的分区表通过在 HDFS 中以不同的目录存储不同的分区数据,来提高查询性能并减少数据扫描量。分区表可以根据特定的列(如 性别 列的男/女)将数据划分为多个部分,使得查询时只需要扫描相关的分区,…...
centos7安装配置python3环境
1、wget https://www.python.org/ftp/python/3.11.2/Python-3.11.2.tgz 2、安装python依赖环境 切换到root用户,然后执行下面命令: 3、安装gcc,用于后续安装Python时编译源码: yum install gcc -y 4、安装Python3相关依赖&#…...
用 LoRA 微调 Stable Diffusion:拆开炼丹炉,动手实现你的第一次 AI 绘画
总得拆开炼丹炉看看是什么样的。这篇文章将带你从代码层面一步步实现 AI 文本生成图像(Text-to-Image)中的 LoRA 微调过程,你将: 了解 Trigger Words(触发词)到底是什么,以及它们如何影响生成结…...
手机实时提取SIM卡打电话的信令声音-(题外、插播一条广告)
手机实时提取SIM卡打电话的信令声音-(题外、插播一条广告) 前言 在去年的差不多这个时候,我们做了一遍外置配件的选型,筛选过滤了一批USB蓝牙配件和type-c转usb的模块。详情可参考《外置配件的电商价格和下载链接的选型.docx》一文:蓝牙电话…...
Linux基于CentOS学习【进程状态】【进程优先级】【调度与切换】【进程挂起】【进程饥饿】
目录 进程状态 状态决定了什么 进程等待方式——队列 进程状态的表现 挂起状态 基于阻塞的挂起——阻塞挂起 swap分区 进程状态表示 Z僵尸状态 进程的优先级 什么是进程的优先级 为什么会有进程的优先级 进程饥饿 Linux的调度与切换 切换 调度 queue [ 140 ]&am…...
Golang | Leetcode Golang题解之第456题132模式
题目: 题解: func find132pattern(nums []int) bool {candidateI, candidateJ : []int{-nums[0]}, []int{-nums[0]}for _, v : range nums[1:] {idxI : sort.SearchInts(candidateI, 1-v)idxJ : sort.SearchInts(candidateJ, -v)if idxI < idxJ {ret…...
回归预测|基于哈里斯鹰优化最小二乘支持向量机的数据回归预测Matlab程序HHO-LSSVM 多特征输入单输出含基础程序
回归预测|基于哈里斯鹰优化最小二乘支持向量机的数据回归预测Matlab程序HHO-LSSVM 多特征输入单输出含基础程序 文章目录 一、基本原理一、基本原理二、HHO-LSSVM的流程三、优缺点四、应用场景 二、实验结果三、核心代码四、代码获取五、总结 一、基本原理 HHO-LSSVM回归预测结…...
【Android 源码分析】Activity生命周期之onStop-1
忽然有一天,我想要做一件事:去代码中去验证那些曾经被“灌输”的理论。 – 服装…...
【Unity】本地化实现
个人向笔记。 1 前言 记录一下自己的本地化实现思路,暂时只讲本文的本地化实现。 2 文本本地化方案-个人 本地化实现是基于Luban的。自己使用Luban实现了一个“配置表模块”,又实现了一个“全局配置模块”,之后再基于这两个模块实现了“文本…...
Django一分钟:在Django中怎么存储树形结构的数据,DRF校验递归嵌套模型的替代方案
引言 在开发过程中我们可能需要这样的树形结构: [{"data": {"name": "牛奶"},"children": [{"data": {"name": "蒙牛"}, },{"data": {"name": "伊利"}, }]},{"da…...
【Docker从入门到进阶】06.常见问题与解决方案 07.总结与资源
6. 常见问题与解决方案 在使用Docker进行开发和部署过程中,可能会遇到各种问题。以下是一些常见问题及其解决方案: 容器启动失败和调试 在使用 Docker 时,容器启动失败或立即退出可能会导致一定的困扰,以下是进一步深入解决该问…...
iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...
安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会࿰…...
深度学习水论文:mamba+图像增强
🧀当前视觉领域对高效长序列建模需求激增,对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模,以及动态计算优势,在图像质量提升和细节恢复方面有难以替代的作用。 🧀因此短时间内,就有不…...
LabVIEW双光子成像系统技术
双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制,展现出显著的技术优势: 深层组织穿透能力:适用于活体组织深度成像 高分辨率观测性能:满足微观结构的精细研究需求 低光毒性特点:减少对样本的损伤…...
苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会
在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...
适应性Java用于现代 API:REST、GraphQL 和事件驱动
在快速发展的软件开发领域,REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名,不断适应这些现代范式的需求。随着不断发展的生态系统,Java 在现代 API 方…...
