嘿,朋友!聊点儿编程里特基础,但要真用起来可能让你皱眉的小事儿——Python 里的除法。别小看这事儿,看着简单,里头学问还真不少。刚学 Python 那会儿,我也在这儿摔过跟头,以为除法嘛,不就是那个斜杠(/)吗?结果呢,出来的东西有时候跟你想的压根儿不是一回事儿!

你想想看,小学算术,“10 除以 3”,我们脑子里蹦出来的可能是 3 余 1,或者精确到小数点是 3.333… 对吧?可在 Python 里,你写个 10 / 3,它默认可不是给你个带余数的整数,也不是非得给你个带一堆小数的浮点数,它得看你怎么“问”它。

最常见的,就是那个“真除法”。喏,就是用一个斜杠 /。比如你敲个 10 / 3,按下回车,屏幕上会跳出来 3.3333333333333335。瞧见没?它直接给你来了个浮点数,哪怕分子分母都是整数,结果也“升级”成了浮点数。这叫做 浮点数除法,或者叫 精确除法。它追求的是结果的精确度,哪怕结果能整除,比如 10 / 2,结果会是 5.0,看到没,小数点儿跟着呢。这个特性在 Python 3 里是默认行为,跟 Python 2 不太一样,Python 2 那会儿 / 默认是 整除,这改动当年还引发了不少讨论,图啥?为了让编程语言的除法更接近数学里的定义呗,毕竟数学里 10/3 可不是 3。

那要是我就想要整数结果呢?就像我们小学学的那样,10 个苹果分给 3 个人,每人分几个?不考虑切开的情况。这时候,就得请出另一个符号了——双斜杠 //。这玩意儿叫 整除运算符。你试试 10 // 3,结果是 3。它会把小数点后面的东西统统砍掉,只保留整数部分。注意啊,是直接“截断”,不是“四舍五入”。比如 10 // 3 结果是 3-10 // 3 结果是 -4。为啥是 -4?因为负数往小了去,-10 / 3 大约是 -3.333… 往小截断,就是 -4 了。是不是感觉跟正数有点不一样?对,这就是它的小脾气。记住,整除 // 总是向负无穷方向取整。

那余数呢?有时候我们不但想知道每人分几个,还想知道剩下几个对吧?这就要用到 取模运算符,也就是那个百分号 %10 % 3 的结果就是 1。它给你的就是 余数。这三个哥们儿 /, //, % 简直是除法这个家族里的“三剑客”,各司其职,缺一不可。

咱们再深入点儿,聊聊这些除法操作在实际中咋用。

你想做个需要精确计算的程序?比如算账、算科学数据,那毫无疑问,精确除法 / 是你的首选。你不会希望 100 块钱分给 3 个人 最后算出来每人只有 33 块,剩下 1 块钱不翼而飞吧?这时候就需要 100 / 3 得到 33.333... 这样的结果,再决定怎么处理这个小数部分。

但如果你的场景就是需要整数,比如计算页码,总共 100 条数据,每页显示 10 条,总共多少页?你总不能有 10.5 页吧?这时候就得用 整除 //100 // 10 结果是 10。但等等,如果总共有 101 条数据呢?101 // 10 结果还是 10。可实际上你需要 11 页,最后一页装 1 条数据。这就需要结合取模运算来判断了。一种常见的做法是 (总数 + 每页数量 - 1) // 每页数量,比如 (101 + 10 - 1) // 10 结果是 110 // 10 等于 11。或者更直观一点,先用 // 算出基础页数,再用 % 看有没有余数,有余数就页数加一。比如 pages = total_items // items_per_page,如果 total_items % items_per_page != 0,那么 pages += 1。这两种方法都能得到正确的页数,就看你喜欢哪种思路了。

取模运算 % 的用处可多了。除了算余数,它还是判断奇偶数的神器。一个数 num 如果 num % 2 == 0,那它就是偶数;如果 num % 2 != 0(或者更常见的 num % 2 == 1 对于正奇数),那就是奇数。它还可以用来周期性地做某件事。比如你想每隔 5 个元素做个标记,就可以看看当前元素的索引 index % 5 是不是等于 0。在加密、哈希算法里,取模更是核心操作之一。还有循环数组或者环形队列,用取模运算来计算下一个索引简直是标准操作,比如 next_index = (current_index + 1) % array_length

不过话说回来,Python 的除法也不是完全没有坑。尤其是当你跟负数打交道的时候。前面提到了 -10 // 3-4,那 -10 % 3 呢?别想当然地觉得是 -1!Python 的规则是,取模结果的正负号与除数(也就是 % 后面的那个数)的正负号相同。所以 10 % 31 (除数 3 是正的),-10 % 3 结果是 2 (除数 3 是正的),10 % -3 结果是 -2 (除数 -3 是负的),-10 % -3 结果是 -1 (除数 -3 是负的)。是不是有点绕?记住这个规则就行:余数 r 的符号跟 除数 b 的符号一致,并且满足 a = b * q + r,其中 q整除 a // b 的结果。比如 -10 // 3-4,那么 -10 = 3 * (-4) + r,算出 r 就是 -10 = -12 + r,所以 r = 2。看,跟 -10 % 3 的结果 2 对上了。这个规则在数学上叫做“欧几里得除法”,Python 3 采用了这种定义,主要是为了让 //% 之间的关系更加 consistent(一致),即 (a // b) * b + (a % b) 总是等于 a

除了数值类型的除法,Python 里的除法还会涉及到零。除以零永远是个雷区。无论是 10 / 0 还是 10 // 0,都会毫不留情地抛出一个 ZeroDivisionError 的错误,程序直接崩给你看。所以在做除法之前,尤其是分母是变量的时候,一定要做好检查,判断分母是不是零。if denominator != 0: result = numerator / denominator else: print("错误:除数不能为零!") 这样的防护是必不可少的。

再来,不同类型的数字相除结果也可能不一样。整数除以整数 / 会得到浮点数(Python 3 的默认行为)。浮点数除以整数,结果是浮点数。整数除以浮点数,结果也是浮点数。只要参与运算的有一个是浮点数,/ 的结果就是浮点数。而 //% 呢?如果操作数是整数,结果是整数。如果操作数里有浮点数,结果也会是浮点数,并且遵循整除和取模的定义。比如 10.0 // 3 结果是 3.010.0 % 3 结果是 1.0

你看,一个小小的除法,里面牵扯到好几种运算符、不同的数据类型,还有正负数的不同处理方式,以及永远要提防的“除以零”大坑。掌握这些,才能真正游刃有余地在 Python 里进行数值计算。

所以,下次你在 Python 里写除法时,别想当然了,先停下来想想:我想要的结果是什么?是精确的浮点数?还是只取整数部分?需不需要知道余数?参与运算的数字是整数还是浮点数?有没有可能是零?把这些问题想清楚了,再选择合适的运算符 /, //, %,这样写出来的代码才能既准确又健壮。

记住,编程很多时候就像解决现实问题,你需要不同的工具来应对不同的情况。除法这事儿,Python 提供了好几把“刀”,就看你用哪把,以及怎么用才能切到点儿上。多练多试,你就能玩转 Python 的各种除法 啦!

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。