1

引言

上一篇文章的介绍中,我们提及了Python的三种基本数据类型,如文章末尾所说,Python中的内建数据类型并不仅仅是这几种,但其实我从接触Python到现在,往往就是这几种简单而又基础的数据类型占了很大的比重,或许这就是二八法则吧。上一章我们开了个好头,我希望从本章开始,可以通过实际的案例讲解来逐步深入学习。那么经过我这几天的思索,我认为有必要写一个简单的小学生四则运算计算器,来作为本章采用的案例。因为往往贴近实际生活的案例,才是真正能够吸引你继续学下去的动力。

数据分析

在拿到一个案例(也就是要解决的问题)时,我们首先要进行分析,那么针对本次的四则运算计算器,我们通过以下几个步骤进行分析:

主题及实现形式

  • 主题

简易四则运算计算器

  • 实现形式

因为考虑初学者,这里暂时不提及GUI编程,如果有对GUI编程感兴趣的同学,可以推荐两个Python的GUI库:

  1. Python自带的TK

  2. 从QT融合的PyQT

那么为了降低实现难度,我决定采用在命令行输入值的方式实现计算功能。

要实现什么功能

通过简单的分析,我们锁定需要实现以下几项功能:

  • 输入

如果我们想与计算机进行交互,那么首先就需要通过键盘将想要处理的数据输入到计算机中。

  • 数据处理

输入的数据可以推断至少包含两种:数字数据文本数据,我们需要考虑如何分拆数据,或者说如何分类对输入数据进行处理。

  • 运算

我们的简易计算器要实现的四则运算:

  1. 加:‘+’,对应计算机运算符号‘+’

  2. 减:‘-’,对应计算机运算符号‘-’

  3. 乘:‘×’,对应计算机运算符号‘*’

  4. 除:‘÷’,对应计算机运算符号‘/’

这里面需要注意,我们常规手写体运算符号和计算机运算符号的区别,关键是乘法和除法的区别。

  • 输出结果

当运算结束后,我们的程序需要将生成的计算结果反馈给用户,在这里我们称为输出。

具体的数据分析

数据分析的重点是我们要获取怎样的数据,怎样获取数据,并如何进行数据处理,我们需要依次分析一下。

  • 获取怎样的数据?

在这里首先需要考虑,我们的四则运算计算器的计算复杂度是如何的?是仅能计算两个数值的简单运算,如:1+2?还是能进行混合四则运算,如:(3+4)*8/6?那么你想处理运算的复杂程度就决定了你想获取怎样的数据,这是很实际的问题。那么在本章“简单数据处理I”中,考虑到迭代式编程,我们就先实现简单的两个数值的简单四则运算计算器,那么这里我们的计算器的名字又变长了:

计算器

命令行计算器

命令行四则运算计算器

仅处理两个值的命令行四则运算计算器

怎么样?够简单了吧?其实还不够,让我们接着往下看。

  • 怎样获取数据?

Python的内建IO函数input()可以帮助我们从命令行中获取用户的输入值,但是输入的值涉及到如何将输入值取值及赋值的问题,因此就会出现以下两种方式:

1.分段取值、赋值

分段取值很好理解,举个例子,我们的两个值的四则运算,如:1+2共分为三个部分,即两个常量12,还有运算符+。这三个部分我们分别设定三个变量,譬如a、b、c分别进行赋值,即:

a = input('第一个数:')
b = input('输入你想计算的运算符:')
c = input('第二个数:')

那么上面这段代码便是分段取值、赋值,看起来直观,但问题是用户需要输入多次,而且看起来很傻。

可以点击链接参考input()函数使用方法。

2.一次性取值

相对上面的方法,我们可以采用一次性取值赋值的方法,如下:

a = input('输入你想计算的公式')

通过单次取值,可以减少用户输入的复杂度,但是增加了编程的困难度,因为我们需要将单次的取值进行解析,区分开数字型数值和字符型运算符。

在这里我们为了再一次降低难度,我们将计算器的编程要求变为:

计算器

命令行计算器

命令行四则运算计算器

分段取两个值的命令行四则运算计算器

  • 如何处理数据?

上面一直没有提到的一点,input()函数获取的任何数据,赋值时都是字符串类型的数据,也就是说无论用户在命令行输入的是什么,赋值后我们的取到的都是字符串,那么这里我们就需要将相应的数据进行转换,而运算符的对应就需要进行各自逻辑判断,在这里就需要处理以下两问题:

  1. 上一篇文章中,我们提到了整数和浮点数,它们有各自的内建函数int()float() (可以点击链接参考使用方法)可以用于数值类型转换,那么我们需要将两个取到的字符串型数值转化为哪种类型的数字?

  2. 除了将四种运算符字符串对应到实际运算符时需要逻辑判断外,是否需要判断用户输入的运算符超出我们所限定的四则运算能力?

这里考虑不清楚没有关系,我们带着问题接着往下看,下面开始进入到我们的编程环节。

编程准备工作

在正式开始编程前,除了上面需要进行的数据分析外,还我们需要做好以下的准备工作:

编程IDE准备

我使用过的几种而且到现在还在一直使用编辑器:

  • Emacs

这个编辑器有毒,一旦用过会让你欲罢不能,尤其是它的快捷键,推荐Purcell的配置

  • PyCharm

能到达包的函数自动补全,集成化比较合理,推荐,官网(注册码可以自行百度)。

  • Atom

轻量级,拓展也很方便,改版后速度能让人满意,官网

各项功能实现的语言准备

  • input()内建函数,可以获取命令行输入值,并进行赋值。

  • int()float() ,可以将字符串转换为对应的数值类型。

  • print(),可以将计算结果打印输出到命令行

  • 条件语句if,elifelse,即:

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行的代码最终实现了一个简易的四则运算计算器,本篇的重点不在于编程的复杂与否,而是希望可以通过计算器的编程,对语言初学者推介以下几点内容:

  • 对实际问题进行编程的数据分析思维

  • 数据分析的细节处理,往往数据分析的越到位,最终实现的效果就会越好

  • 本章的语言内容部分新增介绍的几个重点:条件判断语句ifelifelseinnot==,内建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部件进阶教程之计算器》,如有问题,望各位斧正。


LorgSher
66 声望4 粉丝