Python数值类型 int、float、complex 详解
Python数值类型:int、float、complex
在Python程序中,int、float和complex是三种十分重要的数值类型,分别代表整数、浮点数和复数。本节将进一步讲解与这三种数据类型相关的其他函数。
1、三种类型的关系
在Python程序中有三种数值类型,分别是整型(integers), 浮点型(floating point numbers), 以及复数(complex numbers)。其中整型拥有准确的精度,浮点型一般是实现C中的double 类型,有关浮点型的精度信息以及其在具体机器中的内部特性信息,可以使用函数sys.float_info()获取。复数类型由一个实数部分(即实部)与一个虚数部分(即虚部)构成,而这两个部分都是浮点型。
Python所有的数值类型(复数除外)都支持表2-1中的操作(按优先级升序排列)(所有数字操作的优先级均高于比较操作)。
表 数值类型操作
操作 | 结果 |
x + y | x 和 y 的总和 |
x - y | x 和 y 的差 |
x * y | x 和 y 的乘积 |
x / y | x 和 y 的商 |
x // y | x 除以y的商向下取整的整数 |
x % y | 求余数 x / y |
-x | x 取负 |
+x | x 保持不变 |
abs(x) | x的绝对值或x的大小 |
int(x) | x 转换为整数 |
float(x) | x 转换为浮点数 |
complex(re, im) | 将参数转化为复数,re为复数的实部,Im为复数的虚部。im 默认为0 |
c.conjugate() | c 复数的共轭 |
divmod(x, y) | (x // y, x % y) |
pow(x, y) | x 的y 次幂 |
x ** y | x 的y 次幂 |
2、整数类型的相关函数
在Python程序中,int类型提供了如下所示的内置函数。
(1)int.bit_length():返回表示二进制整数所需的位数,不包括符号和前置零。
(2)int.to_bytes(length, byteorder, *, signed=False):返回一个表示整数的字节数组。
1.length:数组的长度,如果整数转换出的字节数组长度超过了该长度,则产生OverflowError;
2.byteorder:字节序;值为"big"或者"little","big"表示最有意义的字节放在字节数组的开头,"little"表示最有意义的字节放在字节数组的结尾。在sys.byteorder保存了主机系统的字节序;
3.signed:确定是否使用补码来表示整数,如果值为false且是负数,则产生OverflowError。默认值为False。
(3)int.from_bytes(bytes, byteorder, *, signed=False):返回由给定的字节数组表示的整数。
1.bytes:字节数组或者是一个iterable;
2.byteorder:同函数to_bytes()相同;
3.signed:同函数to_bytes()相同。
例如在下面的实例文件安科网.py中,演示了使用整数类型的相关函数的过程。
#使用bit_length()返回表示二进制整数所需的位数,不包括符号和前导零:
n = -37
print(bin(n))
print(n.bit_length())
#使用函数to_bytes()返回一个表示整数的字节数组。
print((1024).to_bytes(2, byteorder='big'))
print((1024).to_bytes(10, byteorder='big'))
print((-1024).to_bytes(10, byteorder='big', signed=True))
x = 1000
print(x.to_bytes((x.bit_length() // 8) + 1, byteorder='little'))
#使用函数from_bytes()返回由给定的字节数组表示的整数。
print(int.from_bytes(b'\x00\x10', byteorder='big'))
print(int.from_bytes(b'\x00\x10', byteorder='little'))
print(int.from_bytes(b'\xfc\x00', byteorder='big', signed=True))
print(int.from_bytes(b'\xfc\x00', byteorder='big', signed=False))
print(int.from_bytes([255, 0, 0], byteorder='big'))
执行后会输出如下:
-0b100101
6
b'\x04\x00'
b'\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00'
b'\xff\xff\xff\xff\xff\xff\xff\xff\xfc\x00'
b'\xe8\x03'
16
4096
-1024
64512
16711680
3、浮点类型的相关函数
在Python程序中,float类型提供了如下所示的内置函数。
(1)float.as_integer_ratio():返回一对整数(2元组),它们的比例准确地等于浮点数的原始值,且分母为正数。无穷会引发ValueError错误,NaNs会引发OverflowError错误。
(2)float.is_integer():如果浮点数实例是整数值,则返回True,否则返回False。
上面的两个方法(as_integer_ratio()和is_integer())都支持与十六进制字符串的相互转换。由于Python的浮点数内部存储为二进制数,浮点数和十进制字符串通之间的相互转化通常会有一个小的舍入误差。与此相反的是,十六进制字符串允许浮点数的精确表示和规格。这在调试时和数值工作中很有用。
(3)float.hex():返回浮点数的十六进制字符串表示形式。对于有限的浮点数,这种表示形式总是包括一个前导的0x和尾部的p及指数。
(4)float.fromhex(s):这是一个类方法,功能是返回由十六进制字符串s表示的float。字符串s可能有前导和尾随空格。读者需要注意,float.hex()是实例方法,而float.fromhex()是一个类方法。
在计算机系统中,十六进制字符串的形式为:
[sign] ['0x'] integer ['.' fraction] ['p' exponent]
可选的exponent可以为“+”或“integer”,“sign”和“fraction”是十六进制数的字符串,“-”是带有可选的前导符号的十进制整数。大小写不敏感,且整数或小数至少有一个十六进制数字。此语法类似于C99 标准的第6.4.4.2节中指明的语法,也类似Java 1.5起使用的语法。float.hex()的输出在C或Java代码中可作为十六进制浮点数的字面值,而且C的Double.toHexString格式的十六进制字符串或Java的%a可以被float.fromhex()接受。在此需要注意的是,指数使用的是十进制数而不是十六进制表示,并且它给出用来乘系数的2的幂。例如,十六进制的字符串0x3.a7p10表示浮点数(3 + 10./16 + 7./162) * 2.010,或3740.0。
print((-2.0).is_integer())
print((3.2).is_integer())
print(float.fromhex('0x3.a7p10'))
print(float.fromhex('0x3.a7p10'))
执行后会输出如下:
True
False
3740.0
3740.0
4 迭代器类型
Python语言支持对容器中的内容进行迭代,允许用户定义的类支持迭代。要想使容器对象支持迭代,需要定义如下所示的方法:
- container.__iter__():返回迭代器对象��该对象必须支持如下所述的迭代器协议。如果容器支持不同类型的迭代,可以提供其他方法来专门请求这些迭代类型的迭代器。(对象支持多种迭代形式的一个示例是支持广度和深度优先遍历的树结构)。
Python迭代器对象本身需要支持以下两种方法,它们一起形成迭代器协议。
- iterator.__iter__():返回迭代器对象本身,这是必需的,以允许容器和迭代器在for和in语句中使用。
- iterator.__next__():从容器中返回下一个元素。如果没有其他元素,则会引发StopIteration异常。
例如在下面的实例文件diq.py中,演示了使用使用类实现__iter__()和next()函数的过程。
class Fib(object):
def __init__(self):
self.a, self.b = 0, 1 # 初始化两个计数器a,b
def __iter__(self):
return self # 实例本身就是迭代对象,故返回自己
def __next__(self):
self.a, self.b = self.b, self.a + self.b # 计算下一个值
if self.a > 10: # 退出循环的条件
raise StopIteration();
return self.a # 返回下一个值
if __name__ == '__main__':
for n in Fib():
print(n)
执行后会输出如下:
1
1
2
3
5
8