摘要:获取怎样的数据在这里首先需要考虑,我们的四则运算计算器的计算复杂度是如何的是仅能计算两个数值的简单运算,如还是能进行混合四则运算,如那么你想处理运算的复杂程度就决定了你想获取怎样的数据,这是很实际的问题。
引言
在上一篇文章的介绍中,我们提及了Python的三种基本数据类型,如文章末尾所说,Python中的内建数据类型并不仅仅是这几种,但其实我从接触Python到现在,往往就是这几种简单而又基础的数据类型占了很大的比重,或许这就是二八法则吧。上一章我们开了个好头,我希望从本章开始,可以通过实际的案例讲解来逐步深入学习。那么经过我这几天的思索,我认为有必要写一个简单的小学生四则运算计算器,来作为本章采用的案例。因为往往贴近实际生活的案例,才是真正能够吸引你继续学下去的动力。
数据分析在拿到一个案例(也就是要解决的问题)时,我们首先要进行分析,那么针对本次的四则运算计算器,我们通过以下几个步骤进行分析:
主题及实现形式主题
简易四则运算计算器
实现形式
因为考虑初学者,这里暂时不提及GUI编程,如果有对GUI编程感兴趣的同学,可以推荐两个Python的GUI库:
Python自带的TK
从QT融合的PyQT
那么为了降低实现难度,我决定采用在命令行输入值的方式实现计算功能。
要实现什么功能通过简单的分析,我们锁定需要实现以下几项功能:
输入
如果我们想与计算机进行交互,那么首先就需要通过键盘将想要处理的数据输入到计算机中。
数据处理
输入的数据可以推断至少包含两种:数字数据和文本数据,我们需要考虑如何分拆数据,或者说如何分类对输入数据进行处理。
运算
我们的简易计算器要实现的四则运算:
加:‘+’,对应计算机运算符号‘+’
减:‘-’,对应计算机运算符号‘-’
乘:‘×’,对应计算机运算符号‘*’
除:‘÷’,对应计算机运算符号‘/’
这里面需要注意,我们常规手写体运算符号和计算机运算符号的区别,关键是乘法和除法的区别。
输出结果
当运算结束后,我们的程序需要将生成的计算结果反馈给用户,在这里我们称为输出。
具体的数据分析数据分析的重点是我们要获取怎样的数据,怎样获取数据,并如何进行数据处理,我们需要依次分析一下。
获取怎样的数据?
在这里首先需要考虑,我们的四则运算计算器的计算复杂度是如何的?是仅能计算两个数值的简单运算,如:1+2?还是能进行混合四则运算,如:(3+4)*8/6?那么你想处理运算的复杂程度就决定了你想获取怎样的数据,这是很实际的问题。那么在本章“简单数据处理I”中,考虑到迭代式编程,我们就先实现简单的两个数值的简单四则运算计算器,那么这里我们的计算器的名字又变长了:
计算器
命令行计算器
命令行四则运算计算器
仅处理两个值的命令行四则运算计算器
怎么样?够简单了吧?其实还不够,让我们接着往下看。
怎样获取数据?
Python的内建IO函数input()可以帮助我们从命令行中获取用户的输入值,但是输入的值涉及到如何将输入值取值及赋值的问题,因此就会出现以下两种方式:
1.分段取值、赋值
分段取值很好理解,举个例子,我们的两个值的四则运算,如:1+2共分为三个部分,即两个常量1和2,还有运算符+。这三个部分我们分别设定三个变量,譬如a、b、c分别进行赋值,即:
a = input("第一个数:") b = input("输入你想计算的运算符:") c = input("第二个数:")
那么上面这段代码便是分段取值、赋值,看起来直观,但问题是用户需要输入多次,而且看起来很傻。
可以点击链接参考input()函数使用方法。
2.一次性取值
相对上面的方法,我们可以采用一次性取值赋值的方法,如下:
a = input("输入你想计算的公式")
通过单次取值,可以减少用户输入的复杂度,但是增加了编程的困难度,因为我们需要将单次的取值进行解析,区分开数字型数值和字符型运算符。
在这里我们为了再一次降低难度,我们将计算器的编程要求变为:
计算器
命令行计算器
命令行四则运算计算器
分段取两个值的命令行四则运算计算器
如何处理数据?
上面一直没有提到的一点,input()函数获取的任何数据,赋值时都是字符串类型的数据,也就是说无论用户在命令行输入的是什么,赋值后我们的取到的都是字符串,那么这里我们就需要将相应的数据进行转换,而运算符的对应就需要进行各自逻辑判断,在这里就需要处理以下两问题:
上一篇文章中,我们提到了整数和浮点数,它们有各自的内建函数int()和float() (可以点击链接参考使用方法)可以用于数值类型转换,那么我们需要将两个取到的字符串型数值转化为哪种类型的数字?
除了将四种运算符字符串对应到实际运算符时需要逻辑判断外,是否需要判断用户输入的运算符超出我们所限定的四则运算能力?
这里考虑不清楚没有关系,我们带着问题接着往下看,下面开始进入到我们的编程环节。
编程准备工作在正式开始编程前,除了上面需要进行的数据分析外,还我们需要做好以下的准备工作:
编程IDE准备我使用过的几种而且到现在还在一直使用编辑器:
Emacs
这个编辑器有毒,一旦用过会让你欲罢不能,尤其是它的快捷键,推荐Purcell的配置。
PyCharm
能到达包的函数自动补全,集成化比较合理,推荐,官网(注册码可以自行百度)。
Atom
轻量级,拓展也很方便,改版后速度能让人满意,官网。
各项功能实现的语言准备input()内建函数,可以获取命令行输入值,并进行赋值。
int()和float() ,可以将字符串转换为对应的数值类型。
print(),可以将计算结果打印输出到命令行
条件语句if,elif和else,即:
if a == True: # 如果a为真,我们要做什么? elif b == True: # 如果b为真,我们要做什么? else: # 如果a、b都不为真,我们要做什么?
如果这里不太懂,可以参考手册中条件语句if的用法。
in语句,一般用于序列判断中,例如:
a = "China" b = "n" b in a # 返回值为True,因为字符“n”在“China”中
not语句,表示否的意思,延续上一个例子:
a = "China" c = "s" c not in a # 返回值为True,因为字符“s”不在“China”中开始编程
我们现在开始编程,但是编程之前需要明确前面最后留下的问题,首先字符串需要转换为浮点型,因为需要考虑到计算含精度数值的运算;其次,为限制我们的运算规则,我们需要用条件语句if来判断用户输入的运算符是否在我们规定的四则运算中,而且这个判断的优先级在最高层。下面我们来看看实现 :
分段取值、赋值## 通过input()取值,并直接用float()将获取的字符串转化为浮点数 x = float(input("First Num: ")) # 获取第一个值 o = input("Operator: ") # 获取运算符 y = float(input("Second Num: ")) # 获取第二个值 result = 0 # 初始化一个结果变量,赋值为0运算符判断
## 通过input()取值,并直接用float()将获取的字符串转化为浮点数 x = float(input("First Num: ")) # 获取第一个值 o = input("Operator: ") # 获取运算符 y = float(input("Second Num: ")) # 获取第二个值 result = 0 # 初始化一个结果变量,赋值为0 if o not in "+-*/": # 如果运算符不在字符串"+-*/"中,需要输出的内容 else: # 如果运算符符合要求,开始分类计算运算符字符串对应到实际运算
## 通过input()取值,并直接用float()将获取的字符串转化为浮点数 x = float(input("First Num: ")) # 获取第一个值 o = input("Operator: ") # 获取运算符 y = float(input("Second Num: ")) # 获取第二个值 result = 0 # 初始化一个结果变量,赋值为0 if o not in "+-*/": # 如果运算符不在字符串"+-*/"中,需要输出的内容 print("Sorry! Out of my capability areas!") else: # 如果运算符符合要求,开始分类计算,并赋值到result if o == "+": result = x + y elif o == "-": result = x - y elif o == "*": result = x * y else: result = x / y
输出结果注意:几乎大部分语言都相似的语法,赋值使用单个等号=,而两个等号==用于判断等号两侧的值是否相等。
## 通过input()取值,并直接用float()将获取的字符串转化为浮点数 x = float(input("First Num: ")) # 获取第一个值 o = input("Operator: ") # 获取运算符 y = float(input("Second Num: ")) # 获取第二个值 result = 0 # 初始化一个结果变量,赋值为0 if o not in "+-*/": # 如果运算符不在字符串"+-*/"中,需要输出的内容 print("Sorry! Out of my capability areas!") else: # 如果运算符符合要求,开始分类计算,并赋值到result if o == "+": result = x + y elif o == "-": result = x - y elif o == "*": result = x * y else: result = x / y # 将结果输出到命令行 print(result)总结
那么通过上面16行的代码最终实现了一个简易的四则运算计算器,本篇的重点不在于编程的复杂与否,而是希望可以通过计算器的编程,对语言初学者推介以下几点内容:
对实际问题进行编程的数据分析思维
数据分析的细节处理,往往数据分析的越到位,最终实现的效果就会越好
本章的语言内容部分新增介绍的几个重点:条件判断语句if、elif、else、in、not和==,内建IO函数input()和print(),以及用内建函数float()进行数据类型转换
更简单的方法实现最复杂的功能?其实Python作为动态解释类脚本语言,在实际使用过程中体现的淋漓尽致,庞大的扩展库就不深入探究,仅是内建函数的使用就让人感觉畅快淋漓。下面回顾一下全篇内容,在Python中其实仅用2行代码就可以实现上面所说的:
不用逻辑判断
不用区分数值类型
一次性取值(即表达式)
混合四则运算(且不仅限于四则运算)
命令行
计算器
除命令行这点不太让人满意外,计算器全部功能的实现仅需引入一个内建函数eval(),让我们来看看代码实现:
x = input("Expression Computer: ") print(eval(x))
可点击eval()链接参考详细使用方法。
那么这便是Python的魅力所在。
关于GUI编程我之前有段时间一直在学习PyQt,但后来考虑到运行效率问题,总感觉Python跟GUI隔层墙,后来索性就闲置了,等回头哪天又心血来潮,希望自己能重试Pytho的GUI开发梦。
由于Qt是由C++实现的,实际开发效果还算中等偏上,学习中我是参考Qt的C++代码转录为Python代码,可以正常运行,如果感兴趣的同学可以点击链接《PyQt5 - QWidgets部件进阶教程之计算器》,如有问题,望各位斧正。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/38569.html
摘要:除此之外的特定形式还有二进制序列类型,那么我们在这里所说的序列主要包含以下三种列表列表是一种可变序列,一般形式为,方括号内的各项间用逗号分隔。 引言 对于以前没有接触过任何编程语言的人来说,首先能明确编程的目的很重要,往往能明确一个目的,在日后的学习中遇到困难时心态就会轻松许多。当今计算机文化的多元化发展,涌现出了大数据、分布式计算、神经网络、机器学习等众多新概念,即便这样,任何意义上...
摘要:是个的一种实现方式,编译代码为字节码,然后由虚拟机执行,这意味着此时程序与程序没有区别,只是源代码不一样。原文链接全栈之路系列文章 Python的诞生 Python是著名的龟叔Guido van Rossum(吉多·范罗苏姆)在1989年圣诞节期间,为了打发无聊的圣诞节而编写的一个编程语言。 showImg(https://segmentfault.com/img/remote/146...
摘要:本文重点掌握异步编程的相关概念了解期物的概念意义和使用方法了解中的阻塞型函数释放的特点。一异步编程相关概念阻塞程序未得到所需计算资源时被挂起的状态。 导语:本文章记录了本人在学习Python基础之控制流程篇的重点知识及个人心得,打算入门Python的朋友们可以来一起学习并交流。 本文重点: 1、掌握异步编程的相关概念;2、了解期物future的概念、意义和使用方法;3、了解Python...
摘要:变量作为函数返回值时,必须声明为动态类型。动态变量与中的变量基本完全相同支持在使用时改变类型。比较运算符在运算时考虑变量类型,如果是动态变量与一致。与不一致,语句可以没有,表示忽略所有异常。 上一篇 《Zephir 简介》 简单介绍了环境搭建,编写了一个的简单示例。这一篇继续介绍 Zephir 基础。 基本语法Zephir 中,每个文件都必须有且只有一个类,每个类都必须有一个命名空间,...
摘要:布尔值布尔值和布尔代数的表示完全一致,一个布尔值只有两种值的数据类型可以通过内置的函数查询,例如还可以用来判断和的区别在于不会认为子类是一种父类类型。会认为子类是一种父类类型。基本功能是进行成员关系测试和删除重复元素。 ...
阅读 1079·2021-09-22 15:37
阅读 1101·2021-09-13 10:27
阅读 2409·2021-08-25 09:38
阅读 2396·2019-08-26 11:42
阅读 1490·2019-08-26 11:39
阅读 1519·2019-08-26 10:58
阅读 2235·2019-08-26 10:56
阅读 2540·2019-08-23 18:08