好好学Python:从零基础到项目实战
上QQ阅读APP看书,第一时间看更新

2.2 数据类型

计算机是可以做快速、高精度数学计算的机器,工程师们设计的计算机程序也可以处理各种数值,并且计算机能处理的不仅仅是数值,还有文本、图形、音频、视频、网页等各种各样的数据对象。在程序设计时,对于不同的对象需要定义不同的对象类型,Python 3.x中有6种标准的对象类型:Number(数字)、String(字符串)、List(列表)、Tuple(元组)、Sets(集合)、Dictionary(字典),本节将首先讲解Number(数字)类型,其他5种对象类型将在后续章节介绍。

Python 3.x支持3种不同的Number(数字)类型:整数类型(int)、浮点数类型(float)、复数类型(complex)。

2.2.1 整型

整数类型(int)通常称为整型或整数,一般直接用int表示,是正整数、0和负整数的集合,并且不带小数点。在Python 3.x中,整型没有限制大小,可以当作long(长整型)类型使用,所以Python 3.x没有Python 2.x的long类型。

例如,Python快乐学习班的同学准备去户外旅游了,同学们商讨后决定坐“集合号”大巴去往“Python库”游玩。同学们高高兴兴坐上了大巴准备出发,现在需要统计有多少同学在车上,于是班长吩咐统计委员小萌清点一下人数,小萌花了一分钟逐个点了一遍,总计31人,小萌在Python学习群中输入31,以告知所有同学该消息。与此同时,小萌想起在Python的交互窗口中也可以输入数值,于是小萌在交互模式下输入:

>>> 31
31

这里输入的31就是整型,对于编译器,识别到的是整型。

随着“集合号”的前行,大巴来到了“数据类型”服务区,司机PyCharm通知同学们将在“数据类型”服务区停留片刻后方可继续上路。同学们也感觉是时候做个内存清除了,有需要的同学纷纷下车。片刻后,同学们纷纷上车了,班长再次吩咐小萌清点一下人数。小萌苦笑一下,看来又得花一分钟清点人数了,为什么不叫一个人帮忙从车的另一头清点呢?于是小萌叫小智帮忙从另一头清点一下人数。半分钟后,小萌和小智在车中间碰上了,小智告诉小萌他的计数是15人,小萌自己清点的也是15人,小萌在交互模式下输入:

>>> 15 + 15
30

小萌准备把数字报告给班长,突然想到上次报告的是31人,这次是30人,数字不对啊,小萌在交互模式下输入:

>>> 31 - 30
1

怎么少了一人呢?小萌突然慌了,然后仔细一想,原来是把自己忘加上了,于是再次输入:

>>> 15 + 15 + 1
31

这次没问题了,人全部到齐。于是小萌在Python学习群发送了一条和上次一样的31的消息。班长看到消息后,示意司机可以发车了,突然又想到了什么,叫司机先等等。因为走了一段路程了,到达目的地还有一段距离,同学们路上可能会口渴及饥饿,于是吩咐强壮的小强和活泼的小娜去服务区的“Number”店买一大包TensorFlow糖,给每人配备一根Keras能量棒和两瓶Caffe水。每人两瓶Caffe水,一共要买多少瓶呢?小娜在交互模式下输入:

>>> 31 * 2
62

一共要买62瓶Caffe水,小强轻易就扛起这62瓶Caffe水。

Keras能量棒每人一根,要购买多少根?小娜在交互模式下输入:

>>> 31 * 1
31

一共要购买31根,小娜轻轻提上,随手拿了一大包TensorFlow糖。

东西都买回来了,Caffe水好分,给每人两瓶就是,Keras能量棒也简单,每人派发一根就是。这一大包TensorFlow糖该怎么分呢?看包装袋上有总颗数,一共有155颗,每人多少颗呢?小娜在交互模式下输入:

>>> 155 / 31
5.0

结果出来了,给每人发5颗TensorFlow糖就可以了。于是小娜蹦蹦跳跳地发糖去了,此时发完Caffe水的小强也帮忙一起发糖,每人给5颗。TensorFlow糖终于发完了,小娜感觉惬意极了,也坐下来好好补充能量了。小娜突然感觉有什么不对劲,有155颗糖,分给31人,每人5颗TensorFlow糖没错,但从Python交互模式下看到的结果怎么是5.0呢?假如有156颗糖,Python交互模式下得到的计算结果会是怎样的呢?于是小娜输入如下数据:

>>> 156 / 31
5.032258064516129

如果按这个计算结果分发TensorFlow糖,就没有办法平均分了,小娜我可是没有办法弄出带这么多位小数的糖果。这种结果是怎么来的呢?

原因是:对于Python的整数除法,除法(/)计算结果是浮点数,即使两个整数恰好能整除,结果也是浮点数,即最终结果会带上小数位。如果只想得到整数的结果,舍弃小数部分,可以使用地板除(//),整数的地板除(//)永远是整数,除不尽时会舍弃小数部分。

更改前面输入的数据:

>>> 155 // 31
5

这时得到的计算结果就不带小数位了,即不是浮点数了。再看看用156做计算的结果:

>>> 156 // 31
5

155和156对31做地板除的结果都是5,这个也不对啊。156除以31应该还要剩余一个,怎么会一点不剩。

因为地板除(//)只取结果的整数部分,对这个问题,Python提供了一个余数运算,可以得到两个整数相除的余数,在Python中叫取模(%),下面看看155和156对31的取模:

>>> 155 % 31
0
>>> 156 % 31
1

这次的计算结果就符合自己的预期了。假如有156颗TensorFlow糖,平均分发给31个小伙伴,就会多出1颗。

2.2.2 浮点型

浮点类型(float)一般称为浮点型,由整数部分与小数部分组成,也可以使用科学计数法表示。

比如,小娜还在静静思考中,班长突然打断了她的思维,问小娜在服务区的“Number”店购物总共花了多少钱。小娜理了一下思绪,每瓶Caffe水5.3元,一共62瓶,Caffe水总共多少钱呢?在交互模式下输入:

>>> 5.3*62
328.59999999999997

计算得到的结果怎么这么长?小娜有点想不明白了,不过冷静一思考,原来是这么一回事:整型和浮点型在计算机内部存储的方式不同,整型运算永远是精确的,而浮点型运算可能会有四舍五入的误差。对该结果做四舍五入,保留一位小数,结果是328.6,就没有偏差了。

小娜:“班长,328.6元。”

班长:“这么便宜,是所有的吗?”

小娜:“是Caffe水的。”

班长:“那总共多少钱?”

Keras能量棒每根6.5元,一共31根,在交互模式输入:

>>> 6.5*31
201.5

Caffe水加Keras能量棒,再加上TensorFlow糖的30元,加起来的总额如下:

>>> 5.3*62+6.5*31+30
560.0999999999999

计算结果又出现了前面浮点计算的问题,应该这么输入:

>>> 328.6+201.5+30
560.1

这个计算结果就好看多了,也符合了预期结果形式。

小娜把购物花费的总额560.1元报告给了班长。

小娜又开始思考了,浮点数相乘的结果这么奇怪,那浮点数除法计算的结果会是怎样的呢?小娜立刻进行实践,在交互模式下输入:

>>> 155/31.0
5.0

得到的计算结果和155除以31的计算结果是一样的,那156除以31.0得到的计算结果又是怎样的呢?在交互模式下输入:

>>> 156/31.0
5.032258064516129

得到的计算结果和156除以31也是一样的。那做地板除和取模的结果又是怎样的呢?在交互模式下输入:

>>> 156 // 31.0
5.0
>>> 156 % 31.0
1.0

从计算结果可以看出,结果也都是浮点型的。

2.2.3 复数

复数由实数部分和虚数部分构成,可以用a+bj或complex(a,b)表示,复数的实部a和虚部b都是浮点型。

Python支持复数,不过Python的复数我们当前阶段使用或接触得比较少,此处就不再具体讲解,读者有一个概念即可,有兴趣可以自行查阅相关资料。

2.2.4 数据类型转换

在现实生活中,我们都经历过换零钱的操作,特别是在不支持移动支付的地区或国家,必须要随时准备好一些零钱。换零钱的操作就是将一张面额大些的钱,换算成等额或不等额的面额更小的钱的过程。如将50元换成2张20元,10张1元(有一些地方可能要收取一些手续费,如换50元需要收取2元,实际50元只能换取48元零钱)。

在编程的过程中,也有类似这样的转换过程,不过不是换零操作,而是类型转换的操作。比如将整型转换为浮点型,浮点型转换为整型。一般将浮点型转换为整型会丢失精度,在实际操作中需要注意。

对数据内置的类型进行转换,只需要将数据类型作为函数名即可。

在Python中,数据类型转换时有如下4个函数可以使用:

● int(x)将x转换为一个整数。

● float(x)将x转换为一个浮点数。

● complex(x)将x转换为一个复数,实数部分为x,虚数部分为0。

● complex(x, y)将x和y转换为一个复数,实数部分为x,虚数部分为y。x和y是数字表达式。

比如,小娜去“Number”店购物,购物总支出金额是560.1元,“Number”店的老板为免除找零的麻烦,让小娜支付560元即可,即支付一个整数,舍弃小数部分,可以理解为将浮点型转换为整型了,表示如下:

>>> int(560.1)
560

很容易就得到了转换后的结果。

在实际生活中,金钱的操作必须用浮点型进行记账,就需要使用float函数。在交互模式下输入:

>>> float(560.1)
560.1

这样转换后得到的就是浮点型数据。

不过这个计算结果的小数位还是大于0,仍然涉及找零的问题,要得到小数位为0的结果,该怎么办呢?把int函数放入float函数中是否可以呢?在交互模式下输入:

>>> float(int(560.1))
560.0

这里的执行过程是这样的:先把560.1通过int函数取整,得到整型560,再通过float函数将560转换成浮点型560.0,就得到了我们想要的结果。当然,这里虽然得到了最终想要的结果,但输入的字符看起来有点复杂。这其实是函数的嵌套,后面会进行具体介绍,此处做了解即可。

2.2.5 常量

所谓常量,就是不能改变现有值的量,可以直接拿来使用,常量对应的值是固定的,不会发生变更。比如常用的数学常数π就是一个常量。在Python中,通常一般用全部大写的变量名表示常量。

Python中有两个比较常见的常量,即PI和E。

● PI:数学常量pi(圆周率,一般以π表示)。

● E:数学常量e,即自然对数。

这两个常量将会在后续章节中使用,具体的用法在使用中体现。