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

快速排序的非递归实现:借助栈实现、借助队列实现
目录 用栈实现快速排序 1.用栈实现非递归快速排序的思路步骤 1.1.思路步骤 2.用栈实现非递归快速排序的代码 3.用栈实现非递归快速排序的整个工程 3.1.QuickSortNonR.h 3.2.QuickSortNonR.c 3.3.Stack.h 3.4.Stack.c 用队列实现非递归快速排序 1.用队列实现非递归快…...

Finops成本优化企业实践-可视化篇
引言:上一章讨论了finops的一些方法论,笔者在拿到finops官方认证finops-engineer certificate之后,将方法论运用到所在项目组中,并于今年完成了40%的费用节省。在此将这些实践方法总结沉淀,与大家分享。实践包括三篇&a…...

Spring Boot中线程池使用
说明:在一些场景,如导入数据,批量插入数据库,使用常规方法,需要等待较长时间,而使用线程池可以提高效率。本文介绍如何在Spring Boot中使用线程池来批量插入数据。 搭建环境 首先,创建一个Spr…...

Python机器学习:自然语言处理、计算机视觉与强化学习
📘 Python机器学习:自然语言处理、计算机视觉与强化学习 目录 ✨ 自然语言处理(NLP) 文本预处理:分词、去停用词词向量与文本分类:使用Word2Vec与BERT 🌆 计算机视觉基础 图像预处理与增强目标…...

Vue2 + ElementUI + axios + VueRouter入门
之前没有pc端开发基础,工作需要使用若依框架进行了一年的前端开发.最近看到一个视频框架一步步集成,感觉颇受启发,在此记录一下学习心得。视频链接:vue2element ui 快速入门 环境搭建和依赖安装 安装nodejs安装Vue Cli使用vue create proje…...

GO网络编程(四):海量用户通信系统2:登录功能核心【重难点】
目录 一、C/S详细通信流程图二、消息类型定义与json标签1. 消息类型定义2. JSON标签3.结构体示例及其 JSON 表示:4.完整代码与使用说明 三、客户端发送消息1. 连接到服务器2. 准备发送消息3. 创建 LoginMes 并序列化4. 将序列化后的数据嵌入消息结构5. 序列化整个 M…...

某项目实战分析代码二
某项目实战分析代码二 此次分析的是protobuf的使用操作流程具体实现 3. 业务数据分析3.1 客户端3.2 服务器端简单案例 此次分析的是protobuf的使用 Protocol Buffer( 简称 Protobuf) 是Google公司内部的混合语言数据标准,它是一种轻便高效的结构化数据存储格式&…...

全面指南:探索并实施解决Windows系统中“mfc140u.dll丢失”的解决方法
当你的电脑出现mfc140u.dll丢失的问题是什么情况呢?mfc140u.dll文件依赖了什么?mfc140u.dll丢失会导致电脑出现什么情况?今天这篇文章就和大家聊聊mfc140u.dll丢失的解决办法。希望能够有效的帮助你解决这问题。 哪些程序依赖mfc140u.dll文件…...

QT学习笔记1(QT和QT creator介绍)
QT学习笔记1(QT和QT creator介绍) Qt 是一个跨平台的应用开发框架,主要用于图形用户界面(GUI)应用的开发,但也支持非GUI程序的开发。Qt 支持多种平台,如Windows、macOS、Linux、iOS和Android&a…...

存储电话号码的数据类型,用 int 还是用 string?
在 Java 编程中,存储电话号码的选择可以通过两种常见方式进行:使用 int 类型或 String 类型。这种选择看似简单,但实际上涉及到 JVM 内部的字节码实现、内存优化、数据表示、以及潜在的可扩展性问题。 Java 基本数据类型与引用数据类型的差异…...