Python 数字类型 int,float,complex 使用说明
关注 1421
Python 数字类型
Python 提供了三种数据类型来表示数字,他们是整数类型int
,浮点数类型float
,以及复数类型complex
。
如何判断变量,对象,实例是否为数字类型?
要判断一个变量(严格来说是指变量存储的值),对象,实例是否为有效的数字类型,可以使用isinstance
函数,因为numbers
模块的Number
类是int
,float
,complex
类型的抽象基类。你可以为isinstance
函数的第二参数传递int
,float
,complex
或Number
,以判断目标是否为整数类型,浮点数类型,复数类型或数字类型。
Python 判断对象是否为数字类型、int、float、complex|编程教程视频演示 Bilibili
from numbers import Number
isinstance(12.1232, Number)
True
isinstance(1.1, int)
False
布尔值是否为数字类型?
布尔类型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 数字类型的隐式转换优先级
在某些特定条件下,比如算术运算,不同的数字类型会发生隐式转换,其中complex
类型的优先级最高,int
类型的优先级最低,优先级较低的类型将隐式转换为优先级较高的类型。
在交互模式中,我们将浮点数类型的1.23456
与整数类型的123
相加,计算的结果将是一个浮点数类型的值。
result = 1.23456 + 123
type(result)
<class 'float'>
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
。
int 类型的取值范围是多少?
在 Python3 中,int
整数类型的取值范围是不确定的,当计算机依然拥有可分配的资源时,int
类型的取值可以趋近于无穷,这类似于 JavaScript 中的BigInt
。
如何在 Python 中书写二进制,八进制,十六进制格式的整数?
书写的二进制格式整数,需要具有前缀0b
,比如0b1001
。书写的八进制格式整数,需要具有前缀0o
,比如0o777
。书写的十六进制格式整数,需要具有前缀0x
,比如0xA123
。
需要指出的是,以上方法不适用于浮点数类型和复数类型,书写类似于0b1111.0001
这样的数字将导致错误。
转换 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
float 类型
Python 中的浮点数类型float
符合 IEEE 754 二进制浮点数标准,因此可利用采用相同标准的浮点数硬件来提升运算效率,当然,这里有个绕不开的老问题,二进制浮点数的不准确性。
float
类型允许使用类似于1.23e+2
,1.23e-5
这样的科学计数法,其中+
可以省略,+
和-
两边不能有空格。
二进制浮点数不准确
想要深入了解二进制浮点数的不准确问题,你可以查看编程指南的为何二进制浮点数不准确?IEEE 754 二进制浮点数舍入规则一节。
如何判断 float 类型是否能够转换为等价的 int 类型?
使用float
类型的is_integer
方法,可以判断浮点数能否被转换为等价的整数。由于具有近似性,浮点数表示的数字可能并非你书写的字面量,或你认为的计算结果,因此is_integer
方法的存在是有意义的。int
类型也拥有is_integer
方法,但他总是返回True
。
Python 判断 float 能否转换为等价的 int|编程教程视频演示 Bilibili
下面交互模式中的浮点数字面量1.00000000000000000000001
,其小数部分会被忽略,因此实际存储的浮点数等价于1
,is_integer
方法返回True
。
(1.00000000000000000000001).is_integer()
True
complex 类型
Python 中的complex
类型用于表示复数,复数由实数和虚数两部分组成,其中虚数对应了不存在,整个复数需要使用类似于1.23+4.56j
,12-34j
的形式来表示,其中+
或-
的左边为实数部分,+
或-
和其右边为采用j
标记的虚数部分,+
或-
的两边不能有空格。当然,复数也可以被书写为仅保留虚数部分的形式,比如4.56j
。
另外,无论是实数部分还是虚数部分,都可以使用科学计数法,比如1.2e+10+3.4e-5j
。
如何获取复数的实数或虚数部分?
使用complex
类型的只读属性real
和imag
,可以分别获取复数的实数和虚数部分,比如,(1-2.34j).imag
的运算结果为-2.34
。int
和float
类型也拥有real
和imag
属性,但他们的imag
属性只会返回0
和0.0
,并且int
的real
和imag
属性的类型为int
。
如何获取复数的共轭复数?
使用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 中的数字转换为分数形式
对于int
和float
类型,可以使用as_integer_ratio
方法,将其对应的数字转换为分数表达形式,分数的分子和分母会被放入一个元组,并作为结果返回。
(123).as_integer_ratio()
(123, 1)
(0.5).as_integer_ratio()
(1, 2)
获取 Python 数字的绝对值
使用函数abs
可以获取数字的绝对值,比如,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