Python中%是取模运算符,结果类型随操作数类型变化且负数模正数恒非负;/是真除法,恒返回浮点数;//才是地板除,语义明确、性能更优。
%和/的底层行为完全不同%是取模运算符,返回除法后的余数;/是真除法运算符,总是返回浮点数结果。这不是“整除 vs 除法”的简单区分——即使操作数都是整数,/也绝不返回整数类型,而%的结果类型严格跟随操作数类型(如int % int → int,float % float → float)。
%的行为容易误解Python的%遵循“向负无穷取整”的除法规则,导致负数取模结果恒为非负数(只要模数为正)。这和C/C++/Java等语言的“向零取整”不同,是很多bug的源头。
-7 % 3 得 2(因为 -7 = -3 * 3 + 2,商向下取整为-3)7 % -3 得 -2(模数为负时,结果符号与模数一致)-7 // 3 是 -3,不是 -2——这是理解%的关键:它必须满足 (a // b) * b + (a % b) == a
/再转int()
用/后套int()会截断小数(向零取整),而//才是地板除(向下取整),且语义明确、性能更好。尤其在索引计算、分页、分组等场景,误用会导致边界错位。
start = page * per_page(page和per_page为整数,无需除法)n // 2 比 int(n / 2) 更可靠,尤其当n为负时10 / 3 → 3.333...,int(10 / 3) → 3;但 -10 / 3 → -3.333...,int(-10 / 3) → -3,而 -10 // 3 → -4
判断奇偶、轮询、哈希桶索引、循环缓冲区偏移——用%;需要精确比例、浮点中间结果、科学计算——用/;需要整数商且不关心符号方向——优先考虑//而非/加类型转换。
立即学习“Python免费学习笔记(深入)”;
def is_even(n):
return n % 2 == 0 # ✅ 正确,-4 %
2 == 0
def safe_mod_index(items, i):
return items[i % len(items)] # ✅ 自动处理负索引
def split_into_batches(data, batch_size):
return [data[i:i + batch_size] for i in range(0, len(data), batch_size)] # ✅ 用步长,不用除法
真正容易被忽略的是:当模数可能为负或零时,%会抛出ZeroDivisionError,而/对零除同样报错——但很多人只记得检查/的分母,却忘了%也要防零模数。