2010-12-13 157 views
121

计算中的%是什么?我似乎无法弄清楚它的功能。%在Python中如何工作?

它计算出的百分比例如:3 + 2 + 1 - 5 + 4 % 2 - 1/4 + 6显然等于7.如何?

+2

这LPTHW ..... – orange 2011-04-17 13:31:53

+0

不应'3 + 2 + 1 - 5 + 4%2 - 1/4 + 6'评估为'6.75' ? – taper 2018-01-03 10:41:11

+0

@taper这个问题可能没有使用python 3.0或更高版本。 – 2018-01-05 00:46:18

回答

163

%(模)运算符产生第一个参数除以第二个参数的余数。数字参数首先被转换为通用类型。零右参数引发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。

+2

为什么所有的例子都有更大的数字在右边?有人可以解释2%6的结果产生2? – wookie 2015-03-27 06:23:48

+4

第一个数字是分子,第二个数字是分母在你的例子中,除以6是2 0剩余2,因此结果是2. – David 2015-04-26 22:01:45

+3

请更新您的答案,下面有更准确的答案。[C/C++](http://stackoverflow.com/a/20638659/3370168)%是'rem'而Python中的%为'mod',例如' - 21%4'在Python中为3 – azam 2016-08-03 13:05:21

31

像'x%y'这样的表达式计算为'x/y'的其余部分。优先规则如'/'和'*'。

>>> 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这可能会让你感到困惑。

+0

你可以用一个例子来解释一下吗?抱歉。 :( – orange 2010-12-13 18:34:58

3

模运算符,它用于整数的余数分割,通常情况下,但在Python中可用于浮点数。

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

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

8

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

+3

就我所见,Python不常见,因为它使用%作为模数; Fortran,C/C++和Java使用%来表示余数。 (请参阅http://stackoverflow.com/questions/13683563/whats-the-difference-between-mod-and-remainder,差异在于如何处理负值和小数值)。区分的语言(如Ada ,Haskell和Scheme)使用“rem”和“mod”(或“余数”和“模数”)而不是%。 – 2014-05-23 05:49:05

+2

更新:我通过语言http://en.wikipedia.org/wiki/Modulo_operation发现了这个伟大的模/余数运算表。 Python是不寻常的,但不是唯一的(例如,TCL和Lua共享Python的惯例。) – 2014-05-23 06:00:42

0

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

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

这是基于操作者的优先级。

0

%modulo3 % 2 = 14 % 2 = 0

/是(在这种情况下一个整数)分裂,使:

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

这是一个模运算,除当它是一个老式的C风格的字符串格式化运算符时,不是模运算。详情请参阅here。你会在现有的代码中看到很多。

3

另外,有称为divmod一个有用的内置功能:

divmod(A,B)

取两(非复数)号作为参数,并返回一对由数字 的的商和 其余时使用长划分。

94

有点偏离主题,将%也用于字符串格式化操作,如%=将值代入一个字符串:

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

同样,偏离主题,但它似乎是一个小记录功能,花了我一段时间来追查,我认为这与蟒蛇模数计算有关,因为这个网页排名很高。

+18

谢谢。这是一个记录不完善和广泛使用的功能,是我带到这篇文章的原因。 – 2013-12-29 21:28:54

+3

我们喜欢这个无题的答案。 – 2014-07-28 11:50:40

+0

是否有%逻辑被用作字符串格式引用,或者它只是历史事件中的那个符号被重载了吗?这应该是它自己的问题吗? – WAF 2014-08-19 14:17:16

25

模数是一种数学运算,有时称为“时钟算术”。我发现将它简单地描述为余数是误导和混淆的,因为它掩盖了它在计算机科学中如此使用的真实原因。它确实被用来环绕周期。想象一下时钟:假设你在“军事”时间看时钟,时间范围从0:00到23.59。现在,如果你想要的东西,每天午夜发生,你会希望当前的时间国防部24是零:

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

你能想到的一切历史上小时一遍又一遍地围绕着一个24小时的圆周,一天中的当前时间是无限长的数字24。这是一个更深刻的概念,而不仅仅是一个余数,它是一个处理周期的数学方法,它是非常计算机科学中很重要。它也用于环绕数组,允许您在达到数组末尾后增加索引并使用模数回到开头。

+1

这是正确的答案,它必须被标记为如此。 – 2016-01-25 06:46:32

+0

这是如何在Python中实现的:'a%b = a - b * floor(a/b)' – 2016-01-27 12:17:36

2

注意,如果在Python 3.4计算

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

即使在6.75,而不是7括号结果。


而“/”经营者不是那么容易理解,太(python2.7):尝试...

- 1/4 

1 - 1/4 

这是一个有点题外话这里,但应评估上述表达式:)

+0

这将如何成为7?它简化为'(1)+(0) - (0.25)+(6)'。 – 2016-06-13 13:41:09

3

x % y当考虑计算由y其中的商是整数除以除法x的其余部分。其余的标记为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 Python的风格划分2,只需加入行

from __future__ import division 

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

+6

记得小孩'#'是注释,'//'是一个操作符。 – 2016-05-06 08:16:19

1

模数 - 用右手操作数分开左手操作数并返回余数。

如果有帮助:

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

...等等。

2

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

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

这似乎比较偏离主题,但它肯定会帮助别人。

0

我很难找到使用%online的特定用例,例如。为什么做分数模数除法或负模数除法会导致它的答案。希望这有助于澄清这样的问题:

模司一般来说:

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

假设我们有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