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 [int(d) for d in str(abs(n))]
- 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 判断,即可在日常编程中高效使用整数。 |