Python中%的结果是什么?


Answers:


304

%(模)运算符从第一个参数除以第二个参数得出余数。首先将数字参数转换为通用类型。零权限参数引发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。


7
为什么所有示例的右边都有更大的数字?有人可以解释产生2的2%6的结果吗?
wookie 2015年

8
第一个数字是分子,第二个是分母。在您的示例中2除以6是0的余数2,因此结果是
David David

4
请更新您的答案,下面有更准确的答案。在C / C ++中,%用于'rem',而在Python中%用于'mod'。例如- 21 % 4在Python中是3。
azam

你能解释为什么-11%5 = 4吗?
dahiya_boy

@dahiya_boy我已将GvR的说明添加到下面我不太喜欢的答案中。
Paulo Scardine

143

在某种程度上,主题%还用于字符串格式化操作,例如%=将值替换为字符串:

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

同样,偏离主题,但它似乎是一个小记录功能,它花了一段时间来跟踪,并且我认为这是有关Python的模数计算的此SO页面高度行列。


%是否也有逻辑用作字符串格式参考,还是该符号超载只是历史的偶然?这应该是它自己的问题吗?
WAF

5
记录不良?我不这么认为:字符串格式化操作
KurzedMetal,2015年

@KurzedMetal- %=未显示在该页面上
P. Myer Nore

@WAF %之所以选择该运算符,是因为它镜像了字符串本身中使用的百分比指定符。
MI Wright

@ P.MyerNore我知道这将近3年,但可能会帮助其他人。几秒钟内阅读第一个突出显示的段落。5.6.2由KurzedMetal链接在上面。“ x%= {}”只是“ x = x%{...}”的简写
Sujay Phadke

58

像这样的表达式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

在现代Python中,9 / 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%的5 给出了Quotient = 2 and remainder = 1-11%5给出Quotient = -2 and remainder = -1

快速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 AM


1
另外,help(divmod)记录不变量q, r = divmod(x y) <==> q*y + r == x
chepner

49

模数是一种数学运算,有时也称为“时钟算术”。我发现将其简单描述为剩余部分会产生误导和混乱,因为它掩盖了它在计算机科学中被大量使用的真正原因。它实际上是用于环绕循环的。

想想时钟:假设您以“军事”时间查看时钟,该时间范围为0:00-23.59。现在,如果您希望每天午夜发生一些事情,那么您希望当前时间mod 24为零:

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

您可以想到历史中的所有小时都围绕24小时一圈地循环,并且一天中的当前小时是无限长的mod24。这是一个比余数更深刻的概念,这是一种数学方法处理周期,这在计算机科学中非常重要。它也用于环绕数组,允许您增加索引并使用模数在到达数组末尾后返回到开头。


1
这是在Python中实现的方式:a % b = a - b * floor(a/b)
Aiman Al-Eryani


7

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


11
据我所知,Python是不寻常的,因为它使用%作为模数。Fortran,C / C ++和Java使用%表示余数。(请参见stackoverflow.com/questions/13683563/…,区别在于负值和小数值的处理方式。)进行区分的语言(例如Ada,Haskell和Scheme)使用单词“ rem”和“ mod” (或“余数”和“取模”)而不是%。
Jim Pivarski 2014年

5
更新:我通过语言en.wikipedia.org/wiki/Modulo_operation找到了这个伟大的模/余数运算表。Python是不寻常的但不是唯一的(例如,TCL和Lua共享Python的约定。)
Jim Pivarski 2014年


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

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


8
请记住,孩子#是在评论,//是操作员。
迈克·凯因

3

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

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

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


3

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


3

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

divmod(a,b)

使用两个(非复数)数字作为参数,并在使用长除法时返回一对包含其商和余数的数字。


2

意识到

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

如果使用Python 3.4计算,即使带括号的结果也是6.75,而不是7。


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

- 1/4

1 - 1/4

这里有点题外话,但是在评估上面的表达式时应该考虑:)


2
这怎么会是7?简化为(1)+(0)-(0.25)+(6)
J.Steve

1

对于我来说,很难在线找到使用%的特定用例,例如,为什么做分数模除法或负模除法会得出答案呢?希望这有助于澄清如下问题:

模量部门:

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

假设我们的股息为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  —> 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

0

%(模)运算符从第一个参数除以第二个参数得出余数。首先将数字参数转换为通用类型。

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

这基于运算符优先级。


0

%3 % 2 = 14 % 2 = 0

/ 是(在这种情况下为整数)除,因此:

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



0

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

如果有帮助:

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

... 等等。


0

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

4%2 = 0

  2
2|4
 -4
  0


11%3 = 2

  3
3|11
 -9
  2

给剩下的一个师没有太多
余地
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.