Python数据类型深入学习之数字
一. 数字常量
1. 下面来看看Python的数字常量中都要哪些类型:
数字 | 常量 |
129,-89,0 | 一般整数 |
9999848499999L,4594646469l | 长整型数(无限大小) |
1.232,3.14e-10,4E203,3.0e+210 | 浮点数 |
0177,x9ff,0XFF | 整数的八进制和十六进制数 |
2+5j,2.0+6.0j,3J | 复数常量 |
这里需要注意的是:如果整数常量以l或L结尾,那么它就变成了Python的长整型数。当一个整数的值超过32位时,它会自动变换为长整型数,不需要自己输入字母L。八进制数以数字0开头,后面接数字0-7构成的字符串。十六进制数以0x或0X开头,后面接十六进制的数字0-9和A-F。十六进制中的字符是不区分大小写的!
2. 内置数学工具和扩展(用于处理数字对象的工具)
(1)操作符如下表所示:
注意:在Python的新版本中x<>y的用法已经被取消,目前只能用x!=y
(2)操作符的优先级
在上图中越靠后的操作符优先级越高。
(3)混合类型的数字运算时自动升级
意思就是,当两个不同类型的数字进行运算时,Python首先会将被操作的对象转换成其中最复杂的操作对象,然后在进行同类型的对象运算。因此,Python有划分数字类型复杂度的准则:整型<长整型<浮点数<复数
注意:整数和浮点数的除法运算是不一样的,例子如下:
(4)除法:传统除法,Floor除法,真除法
①X / Y 传统除法,在Python2.7版本中后之前的版本中,这个除法对整数相除得到的结果会省去小数部分,对于浮点数会保留小数部分。但是在3.0版本之后就变成了真除法(无论任何类型都会保留小数部分)
②X // Y Floor除法,不考虑操作对象的类型,总会省略结果的小数部分。不论是2.0版本还是3.0版本
3. 位操作
Python的另一个特点是,也支持像C语言中的大多数数学表达式,比如实现位移和布尔操作等。
上面的二进制1左移了两位,成为二进制4,由0001---->0100
4. 长整型数 在Python中,一个长整型数可以任意大
5. 八进制和十六进制数 Python中有一些内置函数支持十进制与八进制和十六进制之间的相互转换
oct()函数:十进制---->八进制
hex()函数:十进制---->十六进制
int()函数:可以将一个数字字符串(指八进制或十六进制数)转化为整数。int('0100') -->100,int('0100', 8) -->64,int('0x40', 16) -->64
6. 常用的数学工具:math模块,random模块,内置函数int(),round()等。这里需要注意的是:在使用之前,模块必须导入,内置函数不用。
7. 小数数字 小数对象跟浮点数不同,但是有共同之处:都有固定的精度。然而浮点数对象的数学运算在精度方面有缺陷,比如当计算0.1+0.1+01-0.3的时候,结果应该为0,然而并不是:
对于小数对象可以更正结果:
另外decimal中context对象可以设置小数精度:
8. 布尔型
在Python中布尔型比较特殊,首先它的值为True 和 False。 注意这里的首字母必须大写,不然会报错!!这是区别于其他语言的地方。并且在Python中True 可以作为数字1参与数学运算。
9. 动态类型介绍
在执行a = 3 这行程序时,我们并没有声明变量的类型,Python内部都做了什么工作呢?
(1) 创建一个对象来代表值3
(2) 创建一个变量a,如果它还没有被创建的话
(3) 将变量与新的对象相连接
通过上图可以看出变量和对象是保存在内存中的不同部分,并通过连接相关联。变量总是连接到对象,绝对不会连接到其他变量上。在内部事实上是到对象内存空间的一个指针,在Python中从变量到对象的连接称作引用。即引用是一种关系,以内存中的指针的形式实现。一旦变量被使用,Python自动跟随这个变量到对象的连接。
(4) 对象的垃圾收集
每当一个变量名被赋予了一个新的对象,之前的对象占用的空间就会被回收(如果它没有被其他的变量名或对象引用的话)。这种自动回收对象空间的技术称作垃圾收集。当变量被赋予一个新的对象时,它的前一个对象的空间会被回收,并且对象的空间自动放入自由内存空间池,等待后来的对象使用。
(5) 共享引用
这里变量a和b都引用了相同的对象(也就是说,指向了相同的内存空间)。在Python中称作共享引用。
下面看这个引用:
这个引用结构如下:
看下面的赋值语句:
注意一点,对象的引用值在此过程中逐个丢弃,每一次x被赋值给一个新的对象,Python都回收了对象的空间,在Python内部,通过保持用每个对象中的计数器记录引用 到这个对象上的 次数来完成这一功能。一旦这个计数器被设置为零,这个对象的内存空间就会自动回收。像上图中的赋值过程,每次x被赋值给一个新的对象,前一个对象的引用计数器变为零,导致它的空间被回收。
(6) 共享引用和在原处修改
所谓在原处修改,是指具有可变性的数据对象,比如列表。下面看这样的操作:
修改L1的第一个元素,对L1对象产生了影响,L2和L1引用的是同一对象,因此L2也发生了变化。那么怎么才能在修改L1的时候,不对L2产生影响呢?这就用到了Python的拷贝对象,而不是创建引用。能进行拷贝的方法很多,比如copy模块,内置列表函数(分片操作)。分片是最常用的.
(7) 共享引用和相等
在Python中,对于小的整数和小的字符串,可能并没有被回收;相反的,它将可能被保存在一个系统表中(缓存机制)。由于Python的引用模型,在Python中有两种不同的方法判断是否相等:
① == 操作符: 测试两个被引用的对象是否具有相同的值;
② is 操作符:检查两个变量是否指向同一个对象。如果相同,返回True,否则False。实质上is是比较实现引用的指针。
举例如下:
再看小的数字的情况:
为什么这里的is的结果是True呢?因为小的数字和字符串被缓存和复用了!
注意:Python中提供了可以查询对象被引用次数的函数:sys.getrefcount(对象名)