Python 3.8从零开始学
上QQ阅读APP看书,第一时间看更新

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颗。