本笔记是基于《Python学习手册-原书第五版》第五章 数值类型的个人理解。
对象是一切Python程序的基础,是Python编程中最基本的概念。
Python数值相关的类型有哪些?
1.整数和浮点对象
2.复数对象
3.固定精度对象——小数
4.有理数对象——分数
5.带有数值运算的集合体
6.布尔值——真/假
7.内置函数和模块——round,math,random等
8.表达式——无限制整数精度;位运算;十六进制;八进制;二进制格式
9.第三方扩展:向量,库,可视化
Python 2.X和Python 3.X中整数的区别?
整数包括正整数,负整数和零。是不带小数的数字。
Python 2.X中有一般整数(32位)和长整数(无限精度)。
Python 3.X中只有整数(无限精度)。
Python中的浮点数是什么?
浮点数是带有小数部分的数字,CPython中采用C语言中的双精度浮点数来实现。
什么是变量?
变量就是名称,用于记录程序中的信息。
变量在第一次赋值时被创建。
变量在表达式中使用时,会被替换成它们存储的值。
变量在表达式使用之前,必须已被赋值。
变量引用对象,而且从不需要事先声明。
整数和浮点数一起运算会发生什么?
整数会先转化为浮点数,然后再一起运算。
比较运算符中的细节。
# 允许整数和浮点数进行比较
>>> 1<2
True
>>> 2.0>=1
True
>>> 2.0 == 2.0
True
>>> 2.0 != 2.0
False
# 链式比较的等价形态
>>> x<y<z
True
>>> x<y and y<z
True
# 链式比较的等价形态
>>> x<y>z
False
>>> x<y and y>z
False
由于and为一假即假,因此只要判断出前一个表达式为假,后面的表达式不运行。
#浮点运算会出现误差
>>> (1.1+2.2) == 3.3
False
>>> 1.1+2.2
3.3000000000000003
Python中有三种风格的除法——经典除法,向下取整除法和真除法。
经典除法是整数/整数=整数。对于出现的小数部分会进行截断处理。在Python2.X版本会出现。例如10/4=2。Python3.X已经不用了。
向下取整数是当出现小数点时,取比该数字小的最大整数。如10/4=2.5→2。
真除法是指无关操作数的类型,都返回包含任何小数部分的一个浮点数结果。
# 真除法 不管运算是什么类型,都返回包含带小数的浮点数。
>>> 10/4
2.5
>>> 12/4
3.0
# 整数法,取比结果小的最大整数,结果向下取整数
>>> 10//4
2
>>> -10//4
-3
>>> -10//-4
2
# 向下取整等价表达式
>>> import math
>>> math.floor(2.5)
2
>>> math.floor(-2.5)
-3
# 截断表达式————舍去小数部分
>>> import math
>>> math.trunc(2.5)
2
>>> math.trunc(-2.5)
-2
复数介绍
复数通常在工程和科学应用程序中使用。用j后缀表示虚数部分。复数允许我们将它的实部和虚部作为属性来访问,并支持所有一般的数学表达式,还可以通过标准的cmath模块中的工具进行处理。
#复数的运算
>>> 1j*1j
(-1+0j)
>>> 2+1j*3
(2+3j)
>>> (2+1j)*3
(6+3j)
十六进制、八进制、二进制的字面量转换
在内存中,同一个整数的值是相同的。
# 八进制表达,前缀0o表达八进制
>>> 0o1,0o20,0o377
(1, 16, 255)
# 十六进制表达,前缀0x表达十六进制
>>> 0x01,0x10,0xff
(1, 16, 255)
# 二进制表达,前缀0b表达二进制
>>> 0b1,0b10000,0b11111111
(1, 16, 255)
# 将数转换为八进制,十六进制和二进制表达的方法
>>> oct(64),hex(64),bin(64)
('0o100', '0x40', '0b1000000')
# 其他进制转换成十进制的另一种方法
>>> int('100',8),int('40',16),int('1000000',2)
(64, 64, 64)
位运算
Python支持C语言中的大多数表达式,包括把整数作为二进制位串处理的运算。
# 向左移动2位 1 * 2**2 = 4 0001 → 0100
>>> 1 << 2
4
# 向右移动2为 4 / 2**2 = 1 0100 → 0001
>>> 4>>2
1
# 或操作 0001|0010 → 0011 or 一真即真(见1为1)
>>> 1|2
3
# 与操作 0001&0010 → 0000 and 一假为假(见0为0)
>>> 1&2
0
常用的数值工具
# 常用的数学数值
>>> import math
>>> math.pi # π
3.141592653589793
>>> math.e # 自然对数
2.718281828459045
>>> math.sin(math.radians(90)) # sin(90)
1.0
>>> math.sqrt(144) # 144的平方根
12.0
>>> 144**0.5 # 144的平方根
12.0
>>> pow(2,3) # 2的3次幂
8
>>> 2**3 # 2的3次幂
8
>>> min(3,1,2,4),max(3,1,2,4) #求最小值和最大值
(1, 4)
>>> math.floor(2.567),math.floor(-2.567) #向下取整
(2, -3)
>>> math.trunc(2.567), math.trunc(-2.567) #去除小数取整
(2, -2)
>>> int(2.567),int(-2.567)
(2, -2)
>>> round(2.567,2),round(-2.567,2) #四舍五入
(2.57, -2.57)
>>> import random
>>> random.random() #取随机数
0.1389731374675479
>>> random.randint(1,10) #取1~10范围内随机整数
7
小数类型
为了解决浮点数运算容易出现精度误差的问题,如1.1+2.2 == 3.3返回False。
Python引入了小数Decimal的概念。
从语法上讲,需要通过调用已导入模块中的函数来创建小数;从功能上讲,小数对象很像浮点数,但有固定的位数和小数点——小数是精度固定的浮点数。
# 浮点数运算精度会有误差
>>> 0.1+0.1+0.1-0.3
5.551115123125783e-17
# 使用小数运算
>>> from decimal import Decimal
>>> Decimal('0.1')+Decimal('0.1')+Decimal('0.1')-Decimal('0.3')
Decimal('0.0')
# Decimal会自动转换位数至可用的最高位数
>>> Decimal('0.1')+Decimal('0.1')+Decimal('0.1')-Decimal('0.300')
Decimal('0.000')
# 设置全局小数精度
>>> import decimal
>>> decimal.Decimal('1')/decimal.Decimal('7')
Decimal('0.1428571428571428571428571429')
>>> decimal.getcontext().prec=4 # 设置为四位有效小数
>>> decimal.Decimal('1')/decimal.Decimal('7')
Decimal('0.1429')
分数类型
Fraction——分数可以实现一个有理数对象,显示地保持了一个分子和分母,从而避免了浮点数运算的不精确性和局限性。
#分数表在内存中以对象状态存储
>>> from fractions import Fraction
>>> Fraction(1, 3)
Fraction(1, 3)
>>> print(Fraction(1, 3))
1/3
#分数运算
>>> x = Fraction(1, 2)
>>> y = Fraction(1, 3)
>>> x+y
Fraction(5, 6)
>>> x-y
Fraction(1, 6)
>>> x*y
Fraction(1, 6)
>>> x/y
Fraction(3, 2)
# 分数也可以通过字符串表示的小数来创建
>>> Fraction('0.25')
Fraction(1, 4)
# 分数参与浮点数运算
>>> Fraction(1,4)+0.25
0.5
>>> Fraction(1,3)+0.25
0.5833333333333333
集合
集合是不可变对象的无序合体,集合内的元素具有唯一性。
按照定义,一个元素在集合中只能出现一次,因此在涉及数值和数据库的工作中集合有着广泛的应用。集合常用于过滤重复项,提取列表,字符串及其他可迭代对象中的差异
集合只能包含不可变的(可哈希化的)对象类型,因此字典和列表不能嵌入到集合中。
集合可以嵌入元组来表示日期,记录,IP地址等。
集合也可以包含模块、类型对象等。
由于集合是可变的,所以集合不能嵌入到集合中去。
因为顺序不重要,所以集合可以进行顺序无关的等价性测试。
当你遍历一个图或其他有环结构时,集合可用于记录已访问的位置。
# 创建两个集合
>>> x = set('abcde')
>>> y = set('bdxyz')
>>> x
{'a', 'e', 'd', 'c', 'b'}
>>> y
{'y', 'z', 'd', 'b', 'x'}
# 差集运算,x中有,y中没有的
>>> x-y
{'a', 'e', 'c'}
# 并集运算 or x中有或y中有
>>> x|y
{'a', 'y', 'e', 'z', 'd', 'c', 'b', 'x'}
>>> x.update(y)
>>> x
{'a', 'y', 'e', 'z', 'd', 'c', 'b', 'x'}
# 交集运算 and x中和y中都有的
>>> x&y
{'d', 'b'}
>>> x.intersection(y)
{'d', 'b'}
# 判断元素是否在集合中
>>> 'a' in x
True
>>> 'z' in x
False
# 在集合中增加元素
>>> x.add('p')
>>> x
{'a', 'p', 'e', 'd', 'c', 'b'}
# 在集合中移除元素
>>> x.remove('p')
>>> x
{'a', 'e', 'd', 'c', 'b'}
# 集合可以进行与顺序无关的等价性测试
>>> L1 = [1,2,3,4,5]
>>> L2 = [5,4,3,2,1]
>>> L1 == L2
False
>>> set(L1) == set(L2)
True
布尔型
Python有一个名为bool的显示布尔数据类型,带有True和False作为可用且预赋值的内置名称。
在内部,True和False是bool的实例,bool实际上是int的子类。
# True的类型。type() 不会认为子类是一种父类类型,不考虑继承关系。
>>> type(True)
<class 'bool'>
# isinstance()会认为子类是一种父类类型,考虑继承关系。
>>> isinstance(True, int)
True
# 判断True的值是否等于1
>>> True == 1
True
# 判断True是否是1
>>> True is 1
False
>>> True or False
True
>>> True and False
False
>>> True + 4
5
数值扩展
Numpy库提供了高级的数值编程工具——矩阵数据类型,向量处理和精密的计算库。Python和Numpy的组合可以当做免费且灵活的MATLAB来使用。