Python 数字类型 int,float,complex 使用说明
关注 1800
Python 数字类型
Python 提供了三种数据类型来表示数字,他们是整数类型int,浮点数类型float,以及复数类型complex。
如何判断变量,对象,实例是否为数字类型?
要判断一个变量(严格来说是指变量存储的值),对象,实例是否为有效的数字类型,可以使用isinstance函数,因为numbers模块的Number类是int,float,complex类型的抽象基类。你可以为isinstance函数的第二参数传递int,float,complex或Number,以判断目标是否为整数类型,浮点数类型,复数类型或数字类型。
Python 判断对象是否为数字类型(int、float、complex)|编程教程视频演示 YouTubePython 判断对象是否为数字类型(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)
-1234float 类型
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 整数|编程教程视频演示 YouTubePython 判断 float 浮点数能否转换为等价 int 整数|编程教程视频演示 Bilibili
下面交互模式中的浮点数字面量1.00000000000000000000001,其小数部分会被忽略,因此实际存储的浮点数等价于1,is_integer方法返回True。
(1.00000000000000000000001).is_integer()
Truecomplex 类型
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)|编程教程·YouTubePython 判断对象是否为数字类型(int、float、complex)|编程教程·Bilibili
Python 判断 float 浮点数能否转换为等价 int 整数|编程教程·YouTubePython 判断 float 浮点数能否转换为等价 int 整数|编程教程·Bilibili