Python 数字类型 int,float,complex 使用说明

我被代码海扁署名-非商业-禁演绎
阅读 11:52·字数 3560·发布 
Bilibili 空间
关注 960

Python 数字类型

Python 提供了三种数据类型来表示数字,他们是整数类型int,浮点数类型float,以及复数类型complex

如何判断 Python 变量,对象,实例是否为数字类型?

要判断一个 Python 变量(严格来说是指变量存储的值),对象,实例是否为有效的数字类型,可以使用isinstance函数,因为numbers模块的Number类是intfloatcomplex类型的抽象基类。你可以为isinstance函数的第二参数传递intfloatcomplexNumber,以判断目标是否为整数类型,浮点数类型,复数类型或数字类型。

from numbers import Number
isinstance(12.1232, Number)
True
isinstance(1.1, int)
False

Python 中的布尔值是否为数字类型?

Python 的布尔类型boolint的派生类,因此bool也是一种“数字类型”,只不过他用于描述真假状态,而不是数字。当使用isinstance函数判断TrueFalse是否为Numberint的实例时,得到的结果为True

from numbers import Number
isinstance(True, Number)
True
isinstance(False, int)
True

使用下划线分隔数字中的数位

在 Python 中,你可以为数字的字面量加入下划线(_),以使其更容易被观察,比如0b_1000_1010。需要指出,下划线只能放在前缀(0b0x)以及数字的数位之间,以下书写均不正确,0_b100012_3__0xA9

布尔类型

要想了解 Python 布尔类型,你可以查看Python 布尔类型 bool 使用说明一节。

Python 数字类型的隐式转换优先级

在某些特定条件下,比如算术运算,不同的 Python 数字类型会发生隐式转换,其中complex类型的优先级最高,int类型的优先级最低,优先级较低的类型将隐式转换为优先级较高的类型。

在交互模式中,我们将浮点数类型的1.23456与整数类型的123相加,计算的结果将是一个浮点数类型的值。

result = 1.23456 + 123
type(result)
<class 'float'>

Python int 类型

Python 中的整数类型int用于表示整数,在其有效的取值范围内,int类型的精度不受限制,这使得他可以精准的表达每一个数字,不会出现近似值。

以下是一些本节没有特殊描述的int类型的方法。

bit_length 方法

int类型的bit_length方法,用于获取一个整数在二进制形式下的精度。比如,(-111).bit_length()的结果为7,因为,-111的二进制形式为-0b11011111101111的精度为7

bit_count 方法

int类型的bit_count方法,用于获取一个整数二进制形式中的1的个数。比如,(-111).bit_count()的结果为6,因为,-111的二进制形式为-0b110111111011111的个数为6

Python int 类型的取值范围是多少?

在 Python3 中,int整数类型的取值范围是不确定的,当计算机依然拥有可分配的资源时,int类型的取值可以趋近于无穷,这类似于 JavaScript 中的BigInt

如何在 Python 中书写二进制,八进制,十六进制格式的整数?

Python 中书写的二进制格式整数,需要具有前缀0b,比如0b1001。Python 中书写的八进制格式整数,需要具有前缀0o,比如0o777。Python 中书写的十六进制格式整数,需要具有前缀0x,比如0xA123

需要指出的是,以上方法不适用于浮点数类型和复数类型,书写类似于0b1111.0001这样的数字将导致错误。

转换 Python int 类型与 bytes 类型

使用int类型提供的to_bytesfrom_bytes方法,你可以将int类型的值转换为一个bytes实例,或将一个bytes实例转换为int类型的值。

to_bytes(length=1, byteorder='big', *, signed=False)
int.from_bytes(bytes, byteorder='big', *, signed=False)

length 参数

length参数默认为1,他决定了bytes实例的长度,当bytes不足以容纳被转换的整数时,将引发异常OverflowError

byteorder 参数

byteorder参数用于决定整数转换后在bytes中的存储顺序,其默认值为'big',他表示整数的高位在序列的左边,如果设置为'little',则整数的高位在序列的右边。

signed 参数

signed参数用于决定是否采用补码表示整数,默认为False,如果目标是负数,则需要设置为True

bytes 参数

bytes参数是需要转换为intbytes实例。

(1234).to_bytes(4)
b'\x00\x00\x04\xd2'
(1234).to_bytes(4, 'little')
b'\xd2\x04\x00\x00'
int.from_bytes(b'\xd2\x04\x00\x00', 'little')
1234
(-1234).to_bytes(4, signed=True)
b'\xff\xff\xfb.'
int.from_bytes(b'\xff\xff\xfb.', signed=True)
-1234

Python float 类型

Python 中的浮点数类型float符合 IEEE 754 二进制浮点数标准,因此可利用采用相同标准的浮点数硬件来提升运算效率,当然,这里有个绕不开的老问题,二进制浮点数的不准确性。

float类型允许使用类似于1.23e+21.23e-5这样的科学计数法,其中+可以省略,+-两边不能有空格。

二进制浮点数不准确

想要深入了解二进制浮点数的不准确问题,你可以查看编程指南为何二进制浮点数不准确?IEEE 754 二进制浮点数舍入规则一节。

如何判断 Python float 类型是否能够转换为等价的 int 类型?

使用float类型的is_integer方法,可以判断浮点数能否被转换为等价的整数。由于具有近似性,浮点数表示的数字可能并非你书写的字面量,或你认为的计算结果,因此is_integer方法的存在是有意义的。Python 的int类型也拥有is_integer方法,但他总是返回True

下面交互模式中的浮点数字面量1.00000000000000000000001,其小数部分会被忽略,因此实际存储的浮点数等价于1is_integer方法返回True

(1.00000000000000000000001).is_integer()
True

Python complex 类型

Python 中的complex类型用于表示复数,复数由实数和虚数两部分组成,其中虚数对应了不存在,整个复数需要使用类似于1.23+4.56j12-34j的形式来表示,其中+-的左边为实数部分,+-和其右边为采用j标记的虚数部分,+-的两边不能有空格。当然,复数也可以被书写为仅保留虚数部分的形式,比如4.56j

另外,无论是实数部分还是虚数部分,都可以使用科学计数法,比如1.2e+10+3.4e-5j

如何获取 Python 复数的实数或虚数部分?

使用complex类型的只读属性realimag,可以分别获取复数的实数和虚数部分,比如,(1-2.34j).imag的运算结果为-2.34intfloat类型也拥有realimag属性,但他们的imag属性只会返回00.0,并且intrealimag属性的类型为int

如何获取 Python 复数的共轭复数?

使用complex类型的conjugate方法,可以获取复数的共轭复数,比如,(12+34j).conjugate()的返回结果为(12-34j)。虽然intfloat类型也拥有conjugate方法,但由于没有虚数部分,因此该方法对于他们不具备实际效果。

在交互模式中,我们对复数ab执行加法运算,计算方法为将实数和虚数部分分别相加。

a = 1+1j
b = 1.23e+2+1.23e-2j
a + b
(124+1.0123j)
a.conjugate()
(1-1j)

转换 Python 数字类型与字符串类型

你可以使用str类型的构造器将数字类型的值转换为字符串类型的值,字符串对应的数字为十进制,或者使用intfloatcomplex类型的构造器将字符串类型的值转换为数字类型的值,字符串不能包含空格,floatcomplex的构造器接受科学计数法。

对于floatcomplex类型的值,str构造器可能会将其转换为包含科学计数法的字符串。

str(0.0000012222)
'1.2222e-06'
str(1.23e-4)
'0.000123'
float('1.23e-4')
0.000123

此外,binocthex函数可将int类型的值转换为二进制,八进制或十六进制的数字字符串,float类型的hex方法可将浮点数转换为十六进制的数字字符串,他可能类似于'0x3.a7p10',其中p用于标记指数。hex方法生成的字符串,可通过float类型的fromhex方法重新转换为浮点数。

bin(1234)
'0b10011010010'
(1.234).hex()
'0x1.3be76c8b43958p+0'
float.fromhex('0x1.3be76c8b43958p+0')
1.234

文本/字符串类型

如果你希望了解如何判断字符串是否为数字,可以查看判断 Python 字符串是否为字母或数字一段。

将 Python 中的数字转换为分数形式

对于 Python 的intfloat类型,可以使用as_integer_ratio方法,将其对应的数字转换为分数表达形式,分数的分子和分母会被放入一个 Python 元组,并作为结果返回。

(123).as_integer_ratio()
(123, 1)
(0.5).as_integer_ratio()
(1, 2)

获取 Python 数字的绝对值

使用函数abs可以获取 Python 数字的绝对值,比如,abs(-100)的结果为100。需要说明的是,abs函数不适用于复数,他可能会返回一些莫名其妙的值,比如abs(-100+123j)的结果可能是158.52129194527782

源码

check_numeric_types.ipynb·codebeatme/python·GitHub
check_if_float_types_are_integer_types.ipynb·codebeatme/python·GitHub

讲解视频

如何判断 Python 对象是否为数字类型,整数类型 int,浮点数类型 float 或复数类型 complex·Bilibili
如何判断 Python 浮点数类型 float 能否转换为等价整数类型 int·Bilibili