Python整数int详解:进制转换、无限精度、位运算与常见陷阱
Python的整数类型(int)没有大小限制,支持多种进制,且内置了丰富的运算规则。本文从基础表示到实际场景,系统讲解int的使用技巧和常见误区。基本表示与进制转换
十进制整数可直接书写。Python 3.6+允许在数字中使用下划线提升可读性,解释器会自动忽略该分隔符:
x = 42
population = 14_0000_0000# 14亿
其他进制需加前缀:
binary = 0b1010 # 二进制
octal = 0o17 # 八进制
hex_num = 0xFF # 十六进制
进制转换函数:
n = 255
print(bin(n)) # '0b11111111'
print(oct(n)) # '0o377'
print(hex(n)) # '0xff'
# 去掉前缀用format
print(format(n, 'b')) # '11111111'
print(format(n, '08b')) # 填充至8位
# 字符串转整数指定进制
print(int('1010', 2)) # 10
print(int('ff', 16)) # 255
print(int('0xff', 0)) # 自动检测进制
算术运算与整除细节
基本运算:加、减、乘、除(结果浮点)、整除、取余、幂:
a, b = 17, 5
print(a + b) # 22
print(a / b) # 3.4(浮点数)
print(a // b)# 3(向下取整)
print(a % b) # 2
print(a ** b)# 1419857
整除是向下取整,而非向零取整,负数时需要注意:
print(-10 // 3) # -4
print(10 // -3) # -4
print(-10 % 3) # 2(根据公式a = b*(a//b) + (a%b))
print(10 % -3) # -2
复合赋值运算符:
x = 10
x += 5 # x=15
x /= 4 # 注意:/ 运算符使x变为浮点
内置函数:pow支持模幂运算,divmod同时返回商和余数,round采用银行家舍入(0.5时舍入到偶数):
print(pow(2, 10, 1000)) # 24 (2^10 mod 1000)
print(divmod(17, 5)) # (3, 2)
print(round(3.5)) # 4
print(round(4.5)) # 4(银行家舍入)
无限精度与内部缓存
Python int可以存储任意大的整数,仅受内存限制:
def factorial(n):
result = 1
for i in range(1, n+1):
result *= i
return result
print(f'100! = {factorial(100)}')# 输出长达158位的结果
big = 2**1000
print(len(str(big)))# 302位数字
内部实现中,小整数(-5到256)会被缓存复用,大整数则不缓存。但判断整数相等永远使用 == 而非 is:
a, b = 100, 100
print(a is b) # True(缓存)
a, b = 1000, 1000
print(a is b) # False(未缓存,实际依赖实现)
类型转换与安全处理
int()函数可转换浮点数(截断)、字符串(支持空格和下划线)、指定进制:
print(int(3.99)) # 3(截断)
print(int('42 ')) # 42
print(int('1_000')) # 1000
print(int('FF', 16)) # 255
# 浮点数字符串不能直接转,需先转float
print(int(float('3.14')))# 3
整型转其他类型:
n = 42
print(str(n)) # '42'
print(float(n)) # 42.0
print(bool(n)) # True
print(n.to_bytes(2, 'big'))# b'\x00*'
安全转换函数:
def safe_int_convert(value, default=0):
try:
return int(value)
except (ValueError, TypeError):
return default
实际应用场景
计数器与索引:
even_count = sum(1 for i in range(1, 101) if i % 2 == 0)# 50
分页计算:向上取整公式 (total + page_size - 1) // page_size:
total_pages = (total_items + page_size - 1) // page_size
位运算实现权限管理:
READ = 0b0001
WRITE = 0b0010
DELETE = 0b0100
ADMIN = 0b1000
user_perm = READ | WRITE
has_delete = bool(user_perm & DELETE)# False
user_perm |= DELETE
user_perm &= ~WRITE
时间戳获取与计算:
import time, datetime
ts = int(time.time())
dt = datetime.datetime.fromtimestamp(ts)
start = time.time()
time.sleep(1.5)
elapsed_ms = int((time.time() - start) * 1000)
常见陷阱与注意事项
1. 整除/混淆:统计平均值时误用 // 会导致结果被截断,应使用 /。
2. 大整数性能:超大整数的乘除运算效率会显著下降,需要评估。
3. 溢出不存在:Python int理论上无上限,无需担心回绕问题。
4. 判断相等始终用 ==,不用 is(小整数缓存仅是实现细节)。
实用工具函数
以下工具函数直接可用:
def is_even(n): return n % 2 == 0
def is_prime(n):
if n < 2: return False
if n < 4: return True
if n % 2 == 0 or n % 3 == 0: return False
i = 5
while i * i <= n:
if n % i == 0 or n % (i+2) == 0: return False
i += 6
return True
def get_digits(n): return
def is_palindrome_number(n):
s = str(n)
return s == s[::-1]
def gcd(a, b):
while b: a, b = b, a % b
return a
def lcm(a, b): return a * b // gcd(a, b)
总结:Python的int类型具备了无限精度、多种进制表示、丰富的运算支持,以及便捷的类型转换。掌握整除的向下取整行为、位运算技巧、以及避免不必要的 is 判断,即可在日常编程中高效使用整数。
Re: Python整数int详解:进制转换、无限精度、位运算与常见陷阱
感谢楼主的系统总结,非常清晰!尤其注意到你提到了 Python 整除是向下取整而非向零取整,这个点在实际中很容易被忽略,配合 `%` 的符号规律也讲得很清楚。另外银行家舍入的演示也很实用——平时用 `round` 时确实要小心“4.5 舍到 4”这类行为。想请教一个场景:当需要向零取整的整数除法时,比如金融计算中截断小数部分,除了先用 `int(a / b)`,有没有更直接的高效写法?Re: Python整数int详解:进制转换、无限精度、位运算与常见陷阱
这篇帖子干货满满,把Python int的方方面面都讲得很透彻了。我特别赞同你强调的“整除向下取整”这个细节,初次接触负数取模时确实容易懵,配合公式 `a = b*(a + (a%b)` 来理解就清晰多了。小整数缓存那个点也很实用,平时写代码判断相等确实应该养成用 `==` 的习惯,避免依赖不可控的实现细节。 另外,你提到的“大整数性能”陷阱在实际场景中很容易被忽略,比如递归深度或超大数运算,一旦数据量上去,性能开销会非常明显。分页的向上取整公式 `(total + page_size - 1) // page_size` 也是个经典写法,简洁高效。 想问一下,你在实际项目中遇到过因为int无限精度导致内存暴涨的案例吗?或者有没有什么场景你特别推荐用位运算做权限管理?这几种用法都挺有意思的。Re: Python整数int详解:进制转换、无限精度、位运算与常见陷阱
楼主总结得真全面!之前对负数整除和取模一直有点懵,看了这个例子终于明白“向下取整”和公式 a = b*(a + (a%b) 的关系了。还有那个银行家舍入的 round(4.5)=4,以前真没注意过,学到了。 想请教一下:在实际项目中用位运算管理权限时,如果权限数量超过几十个,用 int 的二进制位会不会太长导致可读性变差?有没有什么好的命名或分组习惯可以分享?
页:
[1]