%
在计算中是什么?我似乎无法弄清楚它的作用。
例如,它是否计算出百分比的计算结果:4 % 2
显然等于0.如何?
%(modulo)运算符从第一个参数除以第二个参数得到余数。数字参数首先转换为通用类型。零右参数会引发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次)则没有余数。
例2:7%2
评估为1
,因为当7被除以2(3次)时,剩余的1
。
总而言之,它返回除法运算的余数,如果没有余数则返回0
。所以6%2
意味着找到6的余数除以2。
模数运算符,它通常用于整数的余数除法,但在Python中可用于浮点数。
http://docs.python.org/reference/expressions.html
%(modulo)运算符从第一个参数除以第二个参数得到余数。数字参数首先转换为通用类型。零右参数会引发ZeroDivisionError异常。参数可以是浮点数,例如,3.14%0.7等于0.34(因为3.14等于4 * 0.7 + 0.34。)模运算符总是产生与第二个操作数(或零)具有相同符号的结果;结果的绝对值严格小于第二个操作数的绝对值[2]。
这是一个模运算,除非它是一个老式的C风格字符串格式化运算符,而不是模运算。有关详细信息,请参阅here。你会在现有的代码中看到很多这样的东西。
意识到
(3+2+1-5) + (4%2) - (1/4) + 6
如果在Python 3.4中计算,即使括号结果为6.75而不是7。
并且'/'运算符也不是那么容易理解(python2.7):试试......
- 1/4
1 - 1/4
这里有点偏离主题,但在评估上面的表达式时应该考虑:)
与许多类C语言一样,它是余数或模运算。见documentation for numeric types — int, float, long, complex。
模数 - 用左手操作数除左手操作数并返回余数。
如果它有帮助:
1:0> 2%6
=> 2
2:0> 8%6
=> 2
3:0> 2%6 == 8%6
=> true
... 等等。
我很难找到使用%online的特定用例,例如。为什么做分数模数除法或负模数除法会得到答案。希望这有助于澄清这样的问题:
模数除法一般:
模数除法返回数学除法运算的余数。这样做如下:
假设我们的股息为5且除数为2,则以下除法运算将(等于x):
dividend = 5
divisor = 2
x = 5/2
应用将模量应用于分数
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
%(modulo)运算符从第一个参数除以第二个参数得到余数。数字参数首先转换为通用类型。
3 + 2 + 1 - 5 + 4 % 2 - 1 / 4 + 6 = 7
这基于运算符优先级。
%
是modulo。 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
这是一个模数操作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因为我们在这里做整数数学。
有点偏离主题,%
也用于字符串格式化操作,如%=
,将值替换为字符串:
>>> x = 'abc_%(key)s_'
>>> x %= {'key':'value'}
>>> x
'abc_value_'
关于主题,但它似乎是一个有点记录的功能,花了我一段时间来追踪,我认为它与Pythons模数计算有关,这个SO页面排名很高。
像x % y
这样的表达式评估x ÷ y
的其余部分 - 嗯,从技术上来说它是“模数”而不是“提醒”,所以如果你与%
是余数运算符的其他语言进行比较,结果可能会有所不同。 There are some subtle differences(如果你对实际后果感兴趣,请参阅“为什么Python的Integer Division Floors”)。
优先级与运算符/
(除法)和*
(乘法)相同。
>>> 9 / 2
4
>>> 9 % 2
1
Python问题:根据您使用的Python版本,%
也是(不推荐使用)字符串插值运算符,因此请注意您是否来自具有自动类型转换(如PHP或JS)的语言,其中'12' % 2 + 3
这样的表达式是合法的:在Python中它将导致TypeError: not all arguments converted during string formatting
,这可能会让你感到困惑。
[Python 3更新]
用户n00p评论:
python中的9/2是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中,它是“模数”(时钟数学)运算符。
你可以得到the explanation directly from 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
。
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中的示例代码。
Why Python's Integer Division Floors
今天有人问我(再次)解释为什么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设计时没有做到这一点。并且硬件可能不是这样做的,因为在最古老的硬件中,负数表示为“符号+幅度”而不是现在使用的二进制补码表示(至少对于整数)。我的第一台计算机是一个控制数据大型机,它使用一个补码整数和浮点数。 60个模式意味着负零!
蒂姆·彼得斯知道所有Python的浮点骷髅都埋葬在哪里,他表示有些担心我希望将这些规则扩展到浮点模数。他可能是对的;当x是一个非常小的负数时,truncate-negative-infinity规则会导致x%1.0的精度损失。但这对我来说不足以打破整数模数,并且//与它紧密耦合。
PS。请注意,我使用//而不是/ - 这是Python 3语法,并且在Python 2中也允许强调您知道您正在调用整数除法。 Python 2中的/运算符是不明确的,因为它返回两个整数操作数的不同结果,而不是int和float或两个浮点数。但这是一个完全独立的故事;见PEP 238。
由Guido van Rossum于上午9:49发布
模数是一种数学运算,有时被称为“时钟运算”。我发现将它描述为简单的余数是误导和混淆,因为它掩盖了它在计算机科学中如此广泛使用的真正原因。它确实用于包裹周期。
想想时钟:假设你在“军事”时间看一个时钟,其时间范围从0:00到23.59。现在,如果您希望每天午夜都能发生某些事情,那么您希望当前时间模式24为零:
if(小时%24 == 0):
你可以把历史上的所有时间都想象一遍又一遍地围绕着24小时的圈子,而当天的当前时刻就是无限长的数字模型24.这是一个比其余部分更为深刻的概念,它是一种数学方式处理周期,这在计算机科学中非常重要。它还用于环绕数组,允许您在到达数组末尾后增加索引并使用模数回绕到开头。
Python - 基本运算符 http://www.tutorialspoint.com/python/python_basic_operators.htm
模数 - 用左手操作数除左手操作数并返回余数
a = 10,b = 20
b%a = 0
在大多数语言中,%用于modulus。 Python也不例外。
%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')
这似乎有点偏离主题但它肯定会帮助某人。
此外,还有一个有用的内置函数divmod
:
divmod(a,b)
取两个(非复数)数作为参数,并在使用长除法时返回由商和余数组成的一对数。
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
作为每个源文件中的第一个源代码行。