
面对余数你会如何处理?舍弃、改造、还是直接丢弃?在 Python 中,取模运算符可以帮你获取地板除法运算后的余数,而如何使用这些余数,完全由你决定。
本文大纲
Python 取模运算符是什么、工作原理
语法规则与基础用法
取模运算、整数除法、地板除法的关联关系
整数取模运算
用取模判断奇偶数
浮点数取模与浮点精度问题
Python 与其他语言的负数取模差异
取模运算符、divmod()、math.fmod() 对比
取模运算的运算符优先级
实战场景与案例
常见报错与解决方案
总结
本文将全面讲解 Python 取模运算符的定义、底层逻辑,演示整数与浮点数的使用方式,解析负数取模的易错点,并对比 math.fmod()、divmod() 等同类方法。内容干货充足,接下来正式开始学习。
一、什么是 Python 取模运算符?工作原理详解
Python 的取模运算符用于计算地板除法运算后的余数,这个余数也被称为模值,和小学数学中的余数概念基本一致。在编程场景中,取模运算在处理循环规律、周期场景、数值约束等实际问题时有着极高的使用率。
我们可以用钟表表盘直观理解取模运算:
午夜时分,时针、分针均指向12点位置。随着时间流逝,分针顺时针转动,每满60分钟,时针前进1格,分针归零重置,重新从0分钟开始计时,循环往复。
在这个场景中:
时针走动的格数 = 总分钟数 // 60(地板除法)
分针当前位置 = 总分钟数 % 60(取模运算)
例如90分钟后,时间为1点30分:90//60=1(小时),90%60=30(分钟),完美对应取模与地板除法的逻辑。

二、Python 取模语法与基础用法
Python 中取模运算符为百分号 %,放置在两个数值之间,用于计算前者对后者地板除法的余数。
print(7 % 2)
# 输出结果:1
7除以2,商为3,余数为1,取模运算直接返回余数1。
更多基础示例:
print(8 % 2) # 整除无余数,输出 0
print(100 % 3) # 余数为1,输出 1
print(90 % 60) # 余数为30,输出 30
三、取模、整数除法与地板除法的关联
取模运算的核心依托于地板除法(也常被称作整数除法)。Python 中 // 代表地板除法,% 代表取模运算,二者严格绑定,满足固定数学公式:
我们用 a=7, b=2 验证公式:
print(2 * (7 // 2) + (7 % 2))
# 输出结果:7
公式成立,这也是 Python 取模运算的底层数学逻辑。
四、整数取模运算
取模运算符最常用的场景就是整数运算。当两个操作数均为整数时,返回结果也为整数,支持极大或极小数值,运算逻辑不变。
# 超大整数取模
print(10000000000000000 % 2) # 偶数取模2余0
print(2 % 10000000000000000) # 2除以大数,余数为2
# 输出:
# 0
# 2
经典场景:用取模判断奇偶数
整数对2取模只有两种结果:0为偶数,1为奇数,这是编程中最常用的判断逻辑,适配任意大小整数。
示例:网页表格奇偶行交替配色
if row_number % 2 == 0:
row_color = "light_gray" # 偶数行浅灰
else:
row_color = "white" # 奇数行白色
五、浮点数取模与浮点精度问题
取模运算符同样支持浮点数运算,底层公式不变:
浮点数取模返回结果为浮点数:
print(6.5 % 2)
# 输出结果:0.5
2可以完整包含在6.5中3次(3×2=6),剩余余数0.5。
浮点精度坑点(重点)
计算机存储浮点数存在精度误差,会导致看似整除的运算出现异常余数:
print(0.3 // 0.1)
print(0.3 % 0.1)
# 预期输出:3.0、0.0
# 实际输出:
# 2.0
# 0.09999999999999998
原因:0.1 无法被二进制精准存储,0.3/0.1 的实际计算结果为 2.9999999999999996,地板除法向下取整为2,最终产生异常余数。
解决方案:避免浮点数严格相等判断,使用极小误差值容错:
将 x % 0.1 == 0 改为 x % 0.1 < 1e-9。
六、Python 负数取模(与其他语言的核心差异)
负数取模是 Python 与 C、Java、JS 等语言差异最大的知识点,也是高频易错点。
Python 负数取模规则
取模结果的符号永远与除数(b)一致,底层遵循向下取整(向负无穷取整)的数学逻辑。
print(-5 % 3) # 除数为正,结果为正
print(5 % -3) # 除数为负,结果为负
# 输出:
# 1
# -1
推导 -5 % 3:
-5 // 3 = -2(向下取整)代入公式:
-5 - 3 × (-2) = 1
其他语言(C/Java/JS)规则
这类语言取模结果符号与被除数(a)一致,除法向0取整。
例如 -5 % 3 在 C/Java/JS 中结果为 -2。
Python 规则的优势
Python 取模结果永远落在 [0, b] 区间内,天然适配循环、索引、时间计算等场景,正负偏移量都不会越界:
# 时间偏移容错(支持负数偏移)
minute = (current_minute + offset) % 60
# 循环索引永不越界
index = i % n
七、%、divmod()、math.fmod() 三者对比
Python 提供三种取模相关方式,适用场景各不相同:
1. 内置函数 divmod()
无需导入库,直接返回 (商, 余数) 元组,商为地板除法结果,余数规则与 % 完全一致。
print(divmod(7, 2)) # (3, 1)
print(divmod(1, -3)) # (-1, -2)
2. math.fmod()
需要导入 math 库,仅返回浮点型余数,兼容 C 语言取模规则:结果符号与被除数一致。
import math
print(math.fmod(-5, 3)) # 输出 -2
三者完整对比表
| 运算方式 | 返回值 | 余数符号规则 | 示例(-5, 3)结果 | 适用场景 |
|---|---|---|---|---|
| % | 仅余数 | 与除数一致 | 1 | 循环索引、周期计算 |
| divmod() | (商, 余数) | 与除数一致 | (-2, 1) | 同时需要商和余数 |
| math.fmod() | 浮点余数 | 与被除数一致 | -2 | 适配C语言负数取模逻辑 |
八、取模运算符优先级
Python 遵循 PEMDAS 运算优先级规则,取模 % 与乘、除优先级相同,高于加减运算,同级运算从左至右执行。
示例运算拆解:
print(5 + 4 * 2 % 3 - 1)
# 运算步骤:
# 1. 4*2 = 8(乘法优先)
# 2. 8%3 = 2(取模与乘法同级)
# 3. 5+2-1 = 6
# 最终输出:6
九、实战场景与案例
1. 列表循环遍历(不越界)
无需判断索引边界,自动循环复用列表元素
coffee_shops = ["Coffee Clubhouse", "Kate's Cafe", "Jammin' Java"]
for i in range(0, 30):
print(f"April {i+1}: {coffee_shops[i % len(coffee_shops)]}")
2. 轮询调度(负载均衡)
将请求均匀分发至多台服务器
servers = ["Server1", "Server2", "Server3"]
for request_id in range(10):
server = servers[request_id % len(servers)]
print(f"Request {request_id} -> {server}")
3. 时间单位换算
秒数批量转换为小时、分钟、秒
total_seconds = 10000
minutes, seconds = divmod(total_seconds, 60)
hours, minutes = divmod(minutes, 60)
print(f"{total_seconds} 秒 = {hours} 小时 {minutes} 分钟 {seconds} 秒")
# 输出:10000 秒 = 2 小时 46 分钟 40 秒
4. 闰年判断
def is_leap_year(year):
# 能被4整除且不被100整除,或能被400整除
return (year % 4 == 0 and year % 100 != 0) or (year % 400 == 0)
print(is_leap_year(1924)) # True
十、常见报错与解决方案
1. ZeroDivision error(除零错误)
取模运算本质包含除法逻辑,除数不能为0,否则直接报错:
4 % 0
# ZeroDivision error: integer modulo by zero
解决方案:代码中提前判断除数不为0,再执行取模运算。
2. 负数取模结果不符合预期
熟悉 C/Java 语法的开发者极易踩坑,核心原因是 Python 结果符号跟随除数。
解决方案:牢记 Python 规则——正数除数必返回正余数,天然适配循环场景,无需额外修正。
十一、总结
1. Python 取模运算符 % 用于计算地板除法的余数,核心公式:a = b * (a // b) + (a % b);
2. 整数、浮点数均支持取模,浮点数运算需注意精度误差,避免严格相等判断;
3. Python 负数取模结果符号跟随除数,与 C/Java/JS 不同,更适配周期、索引场景;
4. divmod() 可同时获取商和余数,math.fmod() 兼容传统语言负数取模逻辑;
5. 取模与乘除优先级一致,广泛用于奇偶判断、轮询调度、单位换算、循环索引等场景。
推荐学习书籍 《CDA一级教材》适合CDA一级考生备考,也适合业务及数据分析岗位的从业者提升自我。完整电子版已上线CDA网校,累计已有10万+在读~ !



雷达卡





京公网安备 11010802022788号







