说明
《Python 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
Python 的内置函数 int() 是构造方法,它可以将数字或字符串转换为整型数字。它还可以通过 base 参数,可以转化指定进制的数字。
int() 有两种使用形式,分别是:
int([x]) -> integer
int(x, base=10) -> integer
它们都会返回一个基于数字或字符串 x 构造的整数对象,或者在未给出参数时返回 0。
在第一种情况下,可以传入一个 字符, 类字节对象(bytes-like object)或者一个实数,第二种情况可以传入一个 base 变量,来指定返回数字的进制,默认为 10,是我们日常使用的 10 进制。
如果 x :
__int__()
,int(x) 将返回 x.__int__()
定义的值。__index__()
,它将返回 x.__index__()
定义的的值。__trunc__()
,它将返回 x.__trunc__()
的值。以上几个如果定义了两种及三种,会按以上顺序依次返回排在前边的值。
对于浮点数,它将截断小数位,舍去所有小数位上的数字。
如果 x 不是数字,或者有 base 参数,x 必须是字符串、bytes、表示进制为 base 的 整数字面值 的 bytearray 实例。该文字前可以有 + 或 - (中间不能有空格),前后可以有空格。
一个进制为 n 的数字包含 0 到 n-1 的数,其中 a 到 z (或 A 到 Z )表示 10 到 35。默认的 base 为 10 ,允许的进制有 0、2-36。
2、8、16 进制的数字可以在代码中用 0b/0B 、 0o/0O 、 0x/0X 前缀来表示。进制为 0 将安照代码的字面量来精确解释,最后的结果会是 2、8、10、16 进制中的一个。所以 int('010', 0)
是非法的,但 int('010')
和 int('010', 8)
是合法的。
默认为 10 进制:
# integer
int(123)
# float
int(123.23)
# string
int('123')
# 以上均输出:
# 123
# 字符中可包含分组下划线
int('323_133')
# 323133
如:
# 二进制 binary 0b or 0B
int('1010', 2)
int('0b1010', 2)
# 八进制 octal 0o or 0O
int('12', 8)
int('0o12', 8)
# 十六进制 hexadecimal
int('A', 16)
int('0xA', 16)
# 以上均输出:
# 10
在内部, int() 作为方法可以调用对象的 __int__()
方法。因此,即使对象不是个数字,也可以将对象转换为整数对象。可以通过重写类的 __index__()
和 __int__()
方法返回一个数字。
这两个方法返回的值应该与较早版本的 Python 使用的 __int__()
相同,而较新版本使用的是 __index__()
方法。
例如:
class Person:
age = 23
def __index__(self):
return self.age
def __int__(self):
return self.age
person = Person()
int(person)
# 23
如果无法转换,则抛出 ValueError
异常:
try:
five = "five"
print(int(five))
except ValueError as e:
print(e)
# invalid literal for int() with base 10: 'five'
int 类型实现了 numbers.Integral
抽象基类 (abstract base class)。int() 构造的对象方法有:
3.1 新版功能
返回以二进制表示一个整数所需要的位数,不包括符号位和前面的零:
>>> n = -37
>>> bin(n)
'-0b100101'
>>> n.bit_length()
6
更准确地说,如果 x 非零,则 x.bit_length()
是使得 2**(k-1) <= abs(x) < 2**k
的唯一正整数 k。 同样地,当 abs(x) 小到足以具有正确的舍入对数时,则 k = 1 + int(log(abs(x)
, 2))。 如果 x 为零,则 x.bit_length()
返回 0。
等价于:
def bit_length(self):
s = bin(self) # 二进制表示法: bin(-37) --> '-0b100101'
s = s.lstrip('-0b') # 删除前导零和减号
return len(s) # len('100101') --> 6
3.10 新版功能
返回整数的绝对值的二进制表示中 1 的个数。也被称为 population count。示例:
>>> n = 19
>>> bin(n)
'0b10011'
>>> n.bit_count()
3
>>> (-n).bit_count()
3
等价于:
def bit_count(self):
return bin(self).count("1")
3.2 新版功能
语法为:int.to_bytes(length, byteorder, *, signed=False)
,返回表示一个整数的字节数组。
(1024).to_bytes(2, byteorder='big')
# b'\x04\x00'
(1024).to_bytes(10, byteorder='big')
# b'\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00'
(-1024).to_bytes(10, byteorder='big', signed=True)
# b'\xff\xff\xff\xff\xff\xff\xff\xff\xfc\x00'
x = 1000
x.to_bytes((x.bit_length() + 7) // 8, byteorder='little')
# b'\xe8\x03'
整数会使用 length 个字节来表示。 如果整数不能用给定的字节数来表示则会引发 OverflowError。
byteorder 参数确定用于表示整数的字节顺序。 如果 byteorder 为 "big",则最高位字节放在字节数组的开头。 如果 byteorder 为 "little",则最高位字节放在字节数组的末尾。 要请求主机系统上的原生字节顺序,请使用 sys.byteorder 作为字节顺序值。
signed 参数确定是否使用二的补码来表示整数。 如果 signed 为 False 并且给出的是负整数,则会引发 OverflowError。 signed 的默认值为 False。
3.2 新版功能
classmethod int.from_bytes(bytes, byteorder, *, signed=False)
返回由给定字节数组所表示的整数。
int.from_bytes(b'\x00\x10', byteorder='big')
# 16
int.from_bytes(b'\x00\x10', byteorder='little')
# 4096
int.from_bytes(b'\xfc\x00', byteorder='big', signed=True)
# -1024
int.from_bytes(b'\xfc\x00', byteorder='big', signed=False)
# 64512
int.from_bytes([255, 0, 0], byteorder='big')
# 16711680
bytes 参数必须为一个 bytes-like object 或是生成字节的可迭代对象。
byteorder 参数确定用于表示整数的字节顺序。 如果 byteorder 为 "big",则最高位字节放在字节数组的开头。 如果 byteorder 为 "little",则最高位字节放在字节数组的末尾。 要请求主机系统上的原生字节顺序,请使用 sys.byteorder 作为字节顺序值。
signed 参数指明是否使用二的补码来表示整数。
3.8 新版功能
返回一对整数元组,其比率正好等于原整数并且分母为正数。 整数的比率总是用这个整数本身作为分子,1 作为分母。
x = 8
x.as_integer_ratio()
# (8, 1)
>>> (10).as_integer_ratio()
(10, 1)
>>> (-10).as_integer_ratio()
(-10, 1)
>>> (0).as_integer_ratio()
(0, 1)
int() 在最近的版本中经历以下的更新:
base.__index__
方法,则会调用该方法来获取进制数(以前的版本使用 base.__int__
而不是 base.__index__
)__int__()
未定义则回退至 __index__()
更新时间:2021-11-09 23:21:49 标签:python int 数字