Python 模运算是什么?

Python 模运算是什么?

在写 Python 的过程中,整数运算是最常用、最基础的部分。

但你有没有想过,看似简单的 // 和 %,其实藏着不少“坑”?尤其当负数出现时,它们的行为常常会让人大吃一惊。

今天我们就来彻底解剖 Python 中整数运算的内部逻辑。不仅要搞清楚这些运算到底在干什么,还要搞明白它们在边界场景下的真实表现。

这不是一篇枯燥的数学笔记,而是一份程序员实用指南。尤其适合那些不想在细节上翻车的你。

Python 中的整数(int)可以做各种算术运算,比如加减乘除、取幂等,没什么悬念:

但重点来了:

没错,在 Python 中,“除法 / 总是返回浮点数”,哪怕结果看上去像个整数,比如 10 / 2 == 5.0。

这意味着:

这就是为什么 Python 又专门提供了 // 来做“真正的整除”。

让我们回到小学,假设你被要求计算:

你可能会这样做:

最终你写下答案是:

现在看懂这句了吗?

用 Python 来描述这件事,我们可以写成:

而这两个操作满足一个非常重要的公式:

我们接下来会不断用到它,它是理解整除和取余真正意义的核心钥匙。

我们正式写下这个公式,形式上是这样的:

它的含义非常重要,Python 的 // 和 % 运算符,就是为了保证这条等式永远成立,无论 a 和 b 是正是负。

换句话说:

它们的本质,是共同满足这个等式:

这也是为什么你在 Python 中看到一些“奇怪”的结果,比如 -13 % 4 == 3,但其实一点都不奇怪——我们会在接下来的内容详细讲解。

很多人以为整除就是“把小数部分截断”,比如:

于是自然而然地以为:

但实际上是:

为什么?因为 Python 的 // 运算不是做截断,而是做 floor 除法,也叫“向下取整”。

举几个例子你就明白了:

注意⚠️:当遇到负数时,floor 不是“去掉小数部分”,而是向更小的方向取整。这点非常重要。

而这,恰好是 Python 中 // 运算的数学基础。

如果你用 math.trunc 来试试,会发现差异立马就显现出来:

所以请记住:

举个例子:

你会看到:

✅ 验证成立!

来试试看你的理解是否牢固了,以下这些表达式分别会返回什么结果?

我们先回顾一下上文的小测验:

等等,最后这句 -7 % 3 == 2?你可能想说:“负七除以三不就余 -1 吗?怎么是 2?”

很多人第一次看到这个结果会一脸问号。但别忘了我们在上半部分强调的那条核心等式:

我们带着这个公式来验证:

果然成立!

所以,在 Python 中,% 运算的目标并不是简单求“余数”,而是:

关键点来了:

来看一组实验对比:

很多人第一反应是:“为啥结果带符号了?”

其实这不是 bug,而是设计决定。

Python 的 % 运算,永远让结果的符号和“除数”(也就是右边那个数)保持一致。

无一例外,全都满足核心公式 ✅

为什么 -7 // 3 == -3 而不是 -2?

我们用数轴来可视化一下,会更容易理解。

这个结果落在 -3 到 -2 之间,但因为 // 是 floor 除法,所以向下取整到 -3。

而不是简单截掉小数(那是 trunc)变成 -2!

这种行为在正数和负数之间造成了巨大差异:

所以再次强调:在 Python 中,

我们用几行代码,再次验证我们说的一切:

输出结果:

结果完美符合我们上面所说的所有规则:

结论是:

也就是说,它的使命不是“给你个你看得懂的余数”,而是:

最后稍微提一嘴浮点数。

即便是浮点数参与运算,Python 也会尽可能遵守那条“核心公式”:

但是注意!由于浮点数有精度误差,这个等式可能 近似成立 而非完全一致。

今天我们一起深入挖掘了 Python 中整数运算的底层规则:

你现在不仅不会再被 -13 % 4 == 3 这样的表达式吓到,还能向别人讲清楚这背后的数学逻辑和语言设计理念。

建议收藏本文,下次你踩在某个边界条件上出错的时候,说不定就靠它救命了。

如果你觉得这篇文章有帮助,欢迎点赞、转发、收藏!❤️