Python 数字类型 int,float,complex 使用说明
Python 数字类型
Python 提供了三种数据类型来表示数字,他们是整数类型int
,浮点数类型float
,以及复数类型complex
。
如何判断 Python 变量,对象,实例是否为数字类型?
要判断一个 Python 变量(严格来说是指变量存储的值),对象,实例是否为有效的数字类型,可以使用isinstance
函数,因为numbers
模块的Number
类是int
,float
,complex
类型的抽象基类。你可以为isinstance
函数的第二参数传递int
,float
,complex
或Number
,以判断目标是否为整数类型,浮点数类型,复数类型或数字类型。
from numbers import Number
isinstance(12.1232, Number)
True
isinstance(1.1, int)
False
如何判断 Python 对象是否为数字类型,整数类型 int,浮点数类型 float 或复数类型 complex更多代码与讲解 Bilibili
Python 中的布尔值是否为数字类型?
Python 的布尔类型bool
是int
的派生类,因此bool
也是一种“数字类型”,只不过他用于描述真假状态,而不是数字。当使用isinstance
函数判断True
或False
是否为Number
或int
的实例时,得到的结果为True
。
from numbers import Number
isinstance(True, Number)
True
isinstance(False, int)
True
使用下划线分隔数字中的数位
在 Python 中,你可以为数字的字面量加入下划线(_
),以使其更容易被观察,比如0b_1000_1010
。需要指出,下划线只能放在前缀(0b
,0x
)以及数字的数位之间,以下书写均不正确,0_b1000
,12_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
的二进制形式为-0b1101111
,1101111
的精度为7
。- bit_count 方法
int
类型的bit_count
方法,用于获取一个整数二进制形式中的1
的个数。比如,(-111).bit_count()
的结果为6
,因为,-111
的二进制形式为-0b1101111
,1101111
中1
的个数为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_bytes
和from_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
参数是需要转换为int
的bytes
实例。
(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+2
,1.23e-5
这样的科学计数法,其中+
可以省略,+
和-
两边不能有空格。
二进制浮点数不准确
想要深入了解二进制浮点数的不准确问题,你可以查看编程指南的为何二进制浮点数不准确?IEEE 754 二进制浮点数舍入规则一节。
如何判断 Python float 类型是否能够转换为等价的 int 类型?
使用float
类型的is_integer
方法,可以判断浮点数能否被转换为等价的整数。由于具有近似性,浮点数表示的数字可能并非你书写的字面量,或你认为的计算结果,因此is_integer
方法的存在是有意义的。Python 的int
类型也拥有is_integer
方法,但他总是返回True
。
下面交互模式中的浮点数字面量1.00000000000000000000001
,其小数部分会被忽略,因此实际存储的浮点数等价于1
,is_integer
方法返回True
。
(1.00000000000000000000001).is_integer()
True
如何判断 Python 浮点数类型 float 能否转换为等价整数类型 int更多代码与讲解 Bilibili
Python complex 类型
Python 中的complex
类型用于表示复数,复数由实数和虚数两部分组成,其中虚数对应了不存在,整个复数需要使用类似于1.23+4.56j
,12-34j
的形式来表示,其中+
或-
的左边为实数部分,+
或-
和其右边为采用j
标记的虚数部分,+
或-
的两边不能有空格。当然,复数也可以被书写为仅保留虚数部分的形式,比如4.56j
。
另外,无论是实数部分还是虚数部分,都可以使用科学计数法,比如1.2e+10+3.4e-5j
。
如何获取 Python 复数的实数或虚数部分?
使用complex
类型的只读属性real
和imag
,可以分别获取复数的实数和虚数部分,比如,(1-2.34j).imag
的运算结果为-2.34
。int
和float
类型也拥有real
和imag
属性,但他们的imag
属性只会返回0
和0.0
,并且int
的real
和imag
属性的类型为int
。
如何获取 Python 复数的共轭复数?
使用complex
类型的conjugate
方法,可以获取复数的共轭复数,比如,(12+34j).conjugate()
的返回结果为(12-34j)
。虽然int
和float
类型也拥有conjugate
方法,但由于没有虚数部分,因此该方法对于他们不具备实际效果。
在交互模式中,我们对复数a
和b
执行加法运算,计算方法为将实数和虚数部分分别相加。
a = 1+1j
b = 1.23e+2+1.23e-2j
a + b
(124+1.0123j)
a.conjugate()
(1-1j)
转换 Python 数字类型与字符串类型
你可以使用str
类型的构造器将数字类型的值转换为字符串类型的值,字符串对应的数字为十进制,或者使用int
,float
或complex
类型的构造器将字符串类型的值转换为数字类型的值,字符串不能包含空格,float
和complex
的构造器接受科学计数法。
对于float
和complex
类型的值,str
构造器可能会将其转换为包含科学计数法的字符串。
str(0.0000012222)
'1.2222e-06'
str(1.23e-4)
'0.000123'
float('1.23e-4')
0.000123
此外,bin
,oct
,hex
函数可将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 的int
和float
类型,可以使用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