引言
在上一篇文章的介绍中,我们提及了Python的三种基本数据类型,如文章末尾所说,Python中的内建数据类型并不仅仅是这几种,但其实我从接触Python到现在,往往就是这几种简单而又基础的数据类型占了很大的比重,或许这就是二八法则吧。上一章我们开了个好头,我希望从本章开始,可以通过实际的案例讲解来逐步深入学习。那么经过我这几天的思索,我认为有必要写一个简单的小学生四则运算计算器,来作为本章采用的案例。因为往往贴近实际生活的案例,才是真正能够吸引你继续学下去的动力。
数据分析
在拿到一个案例(也就是要解决的问题)时,我们首先要进行分析,那么针对本次的四则运算计算器,我们通过以下几个步骤进行分析:
主题及实现形式
主题
简易四则运算计算器
实现形式
因为考虑初学者,这里暂时不提及GUI编程,如果有对GUI编程感兴趣的同学,可以推荐两个Python的GUI库:
那么为了降低实现难度,我决定采用在命令行输入值的方式实现计算功能。
要实现什么功能
通过简单的分析,我们锁定需要实现以下几项功能:
输入
如果我们想与计算机进行交互,那么首先就需要通过键盘将想要处理的数据输入到计算机中。
数据处理
输入的数据可以推断至少包含两种:数字数据和文本数据,我们需要考虑如何分拆数据,或者说如何分类对输入数据进行处理。
运算
我们的简易计算器要实现的四则运算:
加:‘+’,对应计算机运算符号‘+’
减:‘-’,对应计算机运算符号‘-’
乘:‘×’,对应计算机运算符号‘*’
除:‘÷’,对应计算机运算符号‘/’
这里面需要注意,我们常规手写体运算符号和计算机运算符号的区别,关键是乘法和除法的区别。
输出结果
当运算结束后,我们的程序需要将生成的计算结果反馈给用户,在这里我们称为输出。
具体的数据分析
数据分析的重点是我们要获取怎样的数据,怎样获取数据,并如何进行数据处理,我们需要依次分析一下。
获取怎样的数据?
在这里首先需要考虑,我们的四则运算计算器的计算复杂度是如何的?是仅能计算两个数值的简单运算,如: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
轻量级,拓展也很方便,改版后速度能让人满意,官网。
各项功能实现的语言准备
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部件进阶教程之计算器》,如有问题,望各位斧正。