261

计算中的什么%?我似乎无法弄清楚它的作用。

例如,它是否计算出计算的百分比:4 % 2显然等于 0。如何?

4

20 回答 20

327

%(取模)运算符产生第一个参数除以第二个参数的余数。数字参数首先转换为通用类型。零右参数引发 ZeroDivisionError 异常。参数可以是浮点数,例如,3.14%0.7 等于 0.34(因为 3.14 等于 4*0.7 + 0.34。)模运算符总是产生与第二个操作数(或零)具有相同符号的结果。结果的绝对值严格小于第二个操作数的绝对值 [2]。

取自http://docs.python.org/reference/expressions.html

示例 1: 6%2计算结果为,0因为如果 6 除以 2(3 次)没有余数。

示例 27%2计算结果为,1因为1当 7 除以 2(3 次)时有余数。

所以总结一下,它返回除法运算的余数,或者0如果没有余数。所以6%2意味着找到 6 除以 2 的余数。

于 2010-12-13T18:34:00.987 回答
147

有点离题,%也用于字符串格式化操作,例如%=将值替换为字符串:

>>> x = 'abc_%(key)s_'
>>> x %= {'key':'value'}
>>> x 
'abc_value_'

再次,题外话,但它似乎是一个小的记录功能,我花了一段时间来追踪,认为它与这个 SO 页面排名很高的 Python 模计算有关。

于 2013-02-15T00:58:08.220 回答
61

像这样的表达式x % y计算余数x ÷ y- 好吧,从技术上讲,它是“模数”而不是“提醒”,因此如果您与余数运算符所在的其他语言进行比较,结果可能会有所不同%有一些细微的差别(如果您对实际结果感兴趣,请参阅下面的“为什么 Python 的整数除法层”)。

优先级与运算符/(除法)和*(乘法)相同。

>>> 9 / 2
4
>>> 9 % 2
1
  • 9 除以 2 等于 4。
  • 4乘以2是8
  • 9 减 8 是 1 - 余数。

Python 陷阱:取决于您使用的 Python 版本,%它也是(已弃用的)字符串插值运算符,因此请注意您是否来自具有自动类型转换的语言(如 PHP 或 JS),其中类似的表达式'12' % 2 + 3是合法的: Python 它将导致TypeError: not all arguments converted during string formatting您可能会感到非常困惑。

[Python 3 的更新]

用户 n00p 评论:

9/2 在 python 中是 4.5。你必须像这样进行整数除法:9//2 如果你想让python告诉你在除法(4)之后剩下多少个完整的对象。

准确地说,整数除法曾经是 Python 2 中的默认值(请注意,这个答案比我已经上学的男孩大,当时 2.x 是主流):

$ python2.7
Python 2.7.10 (default, Oct  6 2017, 22:29:07)
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.31)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 9 / 2
4
>>> 9 // 2
4
>>> 9 % 2
1

在现代 Python9 / 2结果中4.5确实:

$ python3.6
Python 3.6.1 (default, Apr 27 2017, 00:15:59)
[GCC 4.2.1 Compatible Apple LLVM 8.1.0 (clang-802.0.42)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 9 / 2
4.5
>>> 9 // 2
4
>>> 9 % 2
1

[更新]

用户 dahiya_boy 在评论环节中问道:

:你能解释一下为什么吗-11 % 5 = 4- dahiya_boy

这很奇怪,对吧?如果你在 JavaScript 中尝试这个:

> -11 % 5
-1

这是因为在 JavaScript%中是“余数”运算符,而在 Python 中是“模数”(时钟数学)运算符。

您可以直接从 GvR 获得解释


编辑 - dahiya_boy

在 Java 和 iOS-11 % 5 = -1中,而在 python 和 ruby-11 % 5 = 4​​ 中。

Paulo Scardine解释了一半的原因,其余的解释在下面

在 Java 和 iOS 中, 给出%余数意味着如果你将11 % 5Quotient = 2 and remainder = 1-11 % 5相除Quotient = -2 and remainder = -1

swift iOS 中的示例代码。

在此处输入图像描述

但是当我们在 python 中谈论它时,它给出了时钟模数。它与以下公式一起使用

mod(a,n) = a - {n * Floor(a/n)}

也就是说,

mod(11,5) = 11 - {5 * Floor(11/5)} => 11 - {5 * 2}

所以,mod(11,5) = 1

mod(-11,5) = -11 - 5 * Floor(-11/5) => -11 - {5 * (-3)}

所以,mod(-11,5) = 4

python 3.0 中的示例代码。

在此处输入图像描述


为什么 Python 的整数除法层级

今天我被要求(再次)解释为什么 Python 中的整数除法会返回结果的下限,而不是像 C 那样截断为零。

对于正数,这不足为奇:

>>> 5//2
2

但如果其中一个操作数为负数,则结果为下限,即从零四舍五入(向负无穷大):

>>> -5//2
-3
>>> 5//-2
-3

这让一些人感到不安,但有一个很好的数学原因。整数除法运算 (//) 和它的兄弟,模运算 (%),一起满足一个很好的数学关系(所有变量都是整数):

a/b = q with remainder r

这样

b*q + r = a and 0 <= r < b

(假设 a 和 b >= 0)。

如果您希望关系扩展为负 a(保持 b 为正),您有两种选择:如果您将 q 截断为零,则 r 将变为负数,因此不变量变为 0 <= abs(r) < 否则,您可以将 q 降低到负无穷大,并且不变量保持 0 <= r < b。[更新:修复了这个段落]

在数学数论中,数学家总是更喜欢后一种选择(参见例如Wikipedia)。对于 Python,我做出了同样的选择,因为模运算有一些有趣的应用,其中 a 的符号是无趣的。考虑采用 POSIX 时间戳(自 1970 年初以来的秒数)并将其转换为一天中的时间。因为一天有 24*3600 = 86400 秒,所以这个计算只是 t % 86400。但是如果我们用负数来表示 1970 年之前的时间,“向零截断”规则将给出毫无意义的结果!使用底线规则一切正常。

我想到的其他应用是计算机图形中像素位置的计算。我敢肯定还有更多。

顺便说一下,对于负 b,一切都只是翻转,不变量变为:

0 >= r > b.

那么为什么C不这样做呢?可能在设计 C 时硬件没有这样做。并且硬件可能没有这样做,因为在最古老的硬件中,负数表示为“符号+幅度”,而不是现在使用的二进制补码表示(至少对于整数)。我的第一台计算机是 Control Data 大型机,它使用整数和浮点数的补码。60 个模式意味着负零!

蒂姆·彼得斯(Tim Peters)知道所有 Python 的浮点骨架都埋在哪里,他对我希望将这些规则扩展到浮点模数表示了一些担忧。他可能是对的;当 x 是一个非常小的负数时,truncate-towards-negative-infinity 规则会导致 x%1.0 的精度损失。但这还不足以让我打破整数模数,并且 // 与它紧密耦合。

PS。请注意,我使用 // 而不是 /——这是 Python 3 的语法,并且在 Python 2 中也允许强调您知道您正在调用整数除法。Python 2 中的 / 运算符是不明确的,因为它为两个整数操作数返回不同的结果,而不是一个 int 和一个浮点数或两个浮点数。但这是一个完全不同的故事。见 PEP 238。

Guido van Rossum 于上午 9:49 发布

于 2010-12-13T18:33:20.400 回答
49

模数是一种数学运算,有时被称为“时钟算术”。我发现将其描述为简单的余数会产生误导和混淆,因为它掩盖了它在计算机科学中如此广泛使用的真正原因。它确实用于环绕循环。

想想一个时钟:假设你看一个“军用”时间的时钟,时间范围从 0:00 到 23.59。现在,如果您希望每天午夜发生一些事情,您会希望当前时间 mod 24 为零:

如果(小时 % 24 == 0):

你可以想象历史上的所有时间都围绕着一个 24 小时的圆圈一遍又一遍地缠绕,而一天中的当前时间是无限长的数字 mod 24。这是一个比余数更深刻的概念,它是一种数学方式处理循环,这在计算机科学中非常重要。它还用于环绕数组,允许您增加索引并在到达数组末尾后使用模数回绕到开头。

于 2013-10-22T17:11:27.593 回答
9

Python - 基本运算符
http://www.tutorialspoint.com/python/python_basic_operators.htm

模数 - 左手操作数除以右手操作数并返回余数

a = 10 和 b = 20

b % a = 0

于 2010-12-13T18:40:03.250 回答
7

在大多数语言中,% 用于模数。Python也不例外。

于 2010-12-13T18:34:29.770 回答
5

% Modulo 运算符也可用于打印在 Google https://developers.google.com/edu/python/strings上定义的字符串(就像在 C 中一样)。

      # % operator
  text = "%d little pigs come out or I'll %s and %s and %s" % (3, 'huff', 'puff', 'blow down')

这似乎有点离题,但它肯定会帮助某人。

于 2017-04-21T18:31:57.853 回答
4

x % y计算x除以除以y其中商是整数的余数。余数的符号为y


在 Python 3 上,计算产生6.75; 这是因为/在 Python 2 上进行真正的除法,而不是整数除法(默认情况下)。在 Python 2 上1 / 4给出 0,因为结果是向下舍入的。

整数除法也可以在 Python 3 上使用//运算符完成,因此要获得 7 作为结果,您可以执行:

3 + 2 + 1 - 5 + 4 % 2 - 1 // 4 + 6

此外,您可以在 Python 2 上获得 Python 样式划分,只需添加以下行

from __future__ import division

作为每个源文件中的第一个源代码行。

于 2015-02-16T16:13:02.927 回答
3

模运算符,它通常用于整数的余数除法,但在 Python 中可用于浮点数。

http://docs.python.org/reference/expressions.html

%(取模)运算符产生第一个参数除以第二个参数的余数。数字参数首先转换为通用类型。零右参数引发 ZeroDivisionError 异常。参数可以是浮点数,例如,3.14%0.7 等于 0.34(因为 3.14 等于 4*0.7 + 0.34。)模运算符总是产生与第二个操作数(或零)具有相同符号的结果。结果的绝对值严格小于第二个操作数的绝对值 [2]。

于 2010-12-13T18:33:36.463 回答
3

这是一个模运算,除非它是一个老式的 C 风格的字符串格式化运算符,而不是一个模运算。有关详细信息,请参见此处。您会在现有代码中看到很多这样的内容。

于 2010-12-13T18:47:40.383 回答
3

此外,还有一个有用的内置函数,称为divmod

divmod(a, b)

将两个(非复数)数字作为参数,并在使用长除法时返回一对由它们的商和余数组成的数字。

于 2010-12-13T20:45:24.373 回答
2

意识到

(3 +2 + 1 - 5) + (4 % 2) - (1/4) + 6

如果在 Python 3.4 中计算,即使括号结果为 6.75 而不是 7。


'/' 运算符也不是那么容易理解(python2.7):尝试...

- 1/4

1 - 1/4

这有点离题,但在评估上述表达式时应该考虑到:)

于 2015-02-11T13:20:36.113 回答
2

我很难在网上找到使用 % 的具体用例,例如,为什么做分数模除法或负模除法会得到答案。希望这有助于澄清这样的问题:

模数除法一般:

模除法返回数学除法运算的余数。它是这样做的:

假设我们有 5 的除数和 2 的除数,以下除法运算将是(等于 x):

dividend = 5
divisor = 2

x = 5/2 
  1. 模数计算的第一步是进行整数除法:

    x_int = 5 // 2 (python 中的整数除法使用双斜线)

    x_int = 2

  2. 接下来,x_int 的输出乘以除数:

    x_mult = x_int * 除数 x_mult = 4

  3. 最后,从 x_mult 中减去股息

    股息 - x_mult = 1

  4. 因此,模运算返回 1:

    5 % 2 = 1

将模数应用于分数的应用程序

Example: 2 % 5 

应用于分数时的模数计算同上;但是,重要的是要注意,当除数大于被除数时,整数除法将导致值为零:

dividend = 2 
divisor = 5

整数除法结果为 0,而 ; 因此,当执行上述第 3 步时,股息的值会被结转(从零中减去):

dividend - 0 = 2  —&gt; 2 % 5 = 2 

将模数应用于负数的应用程序

发生下限除法,其中整数除法的值向下舍入到最低整数值:

import math 

x = -1.1
math.floor(-1.1) = -2 

y = 1.1
math.floor = 1

因此,当您进行整数除法时,您可能会得到与预期不同的结果!

将上述步骤应用于以下除数和除数说明了模数概念:

dividend: -5 
divisor: 2 

第 1 步:应用整数除法

x_int = -5 // 2  = -3

第 2 步:将整数除法的结果乘以除数

x_mult = x_int * 2 = -6

第 3 步:从相乘的变量中减去被除数,注意双重否定。

dividend - x_mult = -5 -(-6) = 1

所以:

-5 % 2 = 1
于 2017-12-18T02:23:53.393 回答
0

与许多类似 C 的语言一样,它是余数或模运算。请参阅有关数字类型的文档 — int、float、long、complex

于 2010-12-13T18:34:47.507 回答
0

%(取模)运算符产生第一个参数除以第二个参数的余数。数字参数首先转换为通用类型。

3 + 2 + 1 - 5 + 4 % 2 - 1 / 4 + 6 = 7

这是基于运算符优先级的。

于 2010-12-13T18:35:25.870 回答
0

%模数3 % 2 = 1,4 % 2 = 0

/是(在这种情况下为整数)除法,所以:

3 + 2 + 1 - 5 + 4 % 2 - 1 / 4 + 6
1 + 4%2 - 1/4 + 6
1 + 0 - 0 + 6
7
于 2010-12-13T18:36:12.733 回答
0

这是一个模运算 http://en.wikipedia.org/wiki/Modulo_operation

http://docs.python.org/reference/expressions.html

因此,按照操作顺序,这可以解决

(3+2+1-5) + (4%2) - (1/4) + 6

(1) + (0) - (0) + 6

7

1/4=0 因为我们在这里做整数数学。

于 2010-12-13T18:37:27.433 回答
0

模数 - 将左手操作数除以右手操作数并返回余数。

如果有帮助:

1:0> 2%6
=> 2
2:0> 8%6
=> 2
3:0> 2%6 == 8%6
=> true

... 等等。

于 2016-04-28T22:32:44.570 回答
0

我发现掌握模运算符 (%) 的最简单方法是通过长除法。它是余数,可用于确定一个数字是偶数还是奇数:

4%2 = 0

  2
2|4
 -4
  0


11%3 = 2

  3
3|11
 -9
  2
于 2019-08-22T16:13:14.940 回答
-1

def absolute(c): if c>=0: return c else: return c*-1 x=int(input("输入值:")) a=absolute(x) print(a)

于 2021-08-26T17:58:07.197 回答