如何在 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 时,容器启动失败或立即退出可能会导致一定的困扰,以下是进一步深入解决该问…...

docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...

AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...

wpf在image控件上快速显示内存图像
wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像(比如分辨率3000*3000的图像)的办法,尤其是想把内存中的裸数据(只有图像的数据,不包…...

使用SSE解决获取状态不一致问题
使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件,这个上传文件是整体功能的一部分,文件在上传的过程中…...
加密通信 + 行为分析:运营商行业安全防御体系重构
在数字经济蓬勃发展的时代,运营商作为信息通信网络的核心枢纽,承载着海量用户数据与关键业务传输,其安全防御体系的可靠性直接关乎国家安全、社会稳定与企业发展。随着网络攻击手段的不断升级,传统安全防护体系逐渐暴露出局限性&a…...

一些实用的chrome扩展0x01
简介 浏览器扩展程序有助于自动化任务、查找隐藏的漏洞、隐藏自身痕迹。以下列出了一些必备扩展程序,无论是测试应用程序、搜寻漏洞还是收集情报,它们都能提升工作流程。 FoxyProxy 代理管理工具,此扩展简化了使用代理(如 Burp…...

EasyRTC音视频实时通话功能在WebRTC与智能硬件整合中的应用与优势
一、WebRTC与智能硬件整合趋势 随着物联网和实时通信需求的爆发式增长,WebRTC作为开源实时通信技术,为浏览器与移动应用提供免插件的音视频通信能力,在智能硬件领域的融合应用已成必然趋势。智能硬件不再局限于单一功能,对实时…...