整数 int
Python 的 int 类型表示任意精度的整数,没有 C 语言中 int 的溢出问题。无论是计数还是天文数字,int 都能精确表示。
创建整数
最直接的方式是书写整数字面量:
age = 25
year = 2024
count = 0
negative = -7
也可以通过 int() 构造函数从其他类型转换:
print(int(3.7)) # 3,向零取整
print(int(-3.7)) # -3,向零取整
int() 不接受空字符串或非法格式,否则会抛出 ValueError:
print(int("")) # ValueError: invalid literal for int()
print(int("3.14")) # ValueError,含小数点不能直接转
print(int("abc")) # ValueError
进制表示
Python 支持四种进制书写整数,输出时统一显示为十进制:
# 二进制:前缀 0b 或 0B
binary = 0b1010
print(binary) # 10
# 八进制:前缀 0o 或 0O(数字零加字母 o)
octal = 0o17
print(octal) # 15
# 十六进制:前缀 0x 或 0X
hexadecimal = 0xFF
print(hexadecimal) # 255
# 十进制:无前缀
decimal = 255
print(decimal) # 255
注意:Python 3 不再支持 0777 这种前导零表示八进数的写法,必须写 0o777,否则报语法错误。
int() 还可以按指定进制解析字符串:
print(int("1010", 2)) # 10
print(int("FF", 16)) # 255
print(int("z", 36)) # 35,支持 2-36 进制
print(int("0b1010", 0)) # 10,前缀 0 表示自动推断进制
下划线分隔符
从 Python 3.6 起,整数中允许使用下划线 _ 作为视觉分隔符,提升大数字可读性:
million = 1_000_000
binary_mask = 0b1111_0000_1111
hex_address = 0xFF_FF
print(million) # 1000000
print(binary_mask) # 3855
下划线可以放在任意数字之间,但不能在开头、结尾,也不能连续出现:
# 合法
a = 1_2_3_4
b = 1_000
# 非法
# c = _1000 # SyntaxError,_1000 被当作变量名
# d = 1000_ # SyntaxError
# e = 1__000 # SyntaxError
无限精度
Python 的 int 采用变长存储,理论上只受可用内存限制:
# 计算 2 的 1000 次方
huge = 2 ** 1000
print(len(str(huge))) # 302 位数字
# 大整数运算依然精确
print(10 ** 100 + 1 - 10 ** 100) # 1
对比浮点数,大整数不会丢失精度:
print(10 ** 20 + 1 == 10 ** 20) # False,整数精确
print(1e20 + 1 == 1e20) # True,float 精度不足
常用运算
整数支持完整的算术运算集:
print(17 + 3) # 20,加法
print(17 - 3) # 14,减法
print(17 * 3) # 51,乘法
print(17 / 3) # 5.666...,真除法,结果总是 float
print(17 // 3) # 5,地板除,向下取整
print(17 % 3) # 2,取余
print(17 ** 3) # 4913,幂运算
print(-17 // 3) # -6,向负无穷取整
print(-17 % 3) # 1,余数与除数同号
地板除 // 和取余 % 满足恒等式 a == (a // b) * b + a % b。对于负数,结果可能出乎直觉:
print(-7 // 2) # -4
print(-7 % 2) # 1
print((-7 // 2) * 2 + (-7 % 2)) # -7,验证恒等式
位运算将整数视为二进制补码:
print(5 & 3) # 1,按位与
print(5 | 3) # 7,按位或
print(5 ^ 3) # 6,按位异或
print(~5) # -6,按位取反
print(5 << 1) # 10,左移乘 2
print(5 >> 1) # 2,右移除 2
边界与特殊情况
零:0 在布尔上下文中为假值,但 bool(-1) 为 True(非零即真)。
前导零陷阱:Python 3 不再支持 0777 这种无前缀八进制写法,必须写 0o777,否则报 SyntaxError。
布尔是整数的子类:
print(isinstance(True, int)) # True
print(True + True) # 2
print(1 == True) # True
print(1 is True) # False,值相等但身份不同
除零错误:5 // 0 和 5 % 0 均抛出 ZeroDivisionError。
大整数的性能:虽然无限精度,但位数越多运算越慢。日常无需担心,处理密码学级别的大数时才需考虑优化。
整数是 Python 中最基础的数据类型之一。掌握进制表示、地板除行为和无限精度特性,能避免许多常见错误。