Python%的结果是多少?
-
09-10-2019 - |
题
什么是 %
在计算中?我似乎无法弄清楚它的作用。
例如,它是否可以计算计算的百分之一: 4 % 2
显然等于0。如何?
解决方案
百分比(MODULO)运算符得出第二个论点的剩余部分。数字参数首先转换为公共类型。零正确的论点提出了ZerodivisionError异常。该参数可能是浮点数,例如3.14%0.7等于0.34(因为3.14等于4*0.7 + 0.34。)MODULO操作员始终产生的结果与第二操作数(或零)相同的符号;结果的绝对值严格小于第二操作数的绝对值[2]。
摘自 http://docs.python.org/reference/expressions.html
示例1:
6%2
评估 0
因为如果6除以2(3次),则没有剩余。
示例2: 7%2
评估 1
因为还有剩余的 1
当7除以2(3次)。
因此,总而言之,它返回了分区操作的其余部分,或 0
如果没有剩余。所以 6%2
手段找到6的其余部分除以2。
其他提示
有些话题, %
也用于字符串格式操作,例如 %=
将值替换为字符串:
>>> x = 'abc_%(key)s_'
>>> x %= {'key':'value'}
>>> x
'abc_value_'
同样,话题不足,但这似乎是一个有记录的功能,我花了一段时间才能追踪, 和 我认为这与pythons modulo计算有关,因此该页面对此排名很高。
像这样的表达 x % y
评估其余部分 x ÷ y
- 嗯,从技术上讲,它是“模量”而不是“提醒”,因此,如果您与其他语言进行比较,结果可能会有所不同 %
是其余操作员。 有一些细微的差异 (如果您对实际后果感兴趣,请参见“为什么Python的整数划分地板”)。
优先级与操作员相同 /
(部门)和 *
(乘法)。
>>> 9 / 2
4
>>> 9 % 2
1
- 9除以2等于4。
- 4次2是8
- 9负8为1-其余部分。
Python Gotcha: :取决于您正在使用的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
.
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
这打扰了某些人,但是有一个很好的数学原因。整数部门操作(//)及其兄弟姐妹,Modulo操作(%),共同完成并满足不错的数学关系(所有变量都是整数):
a/b = q with remainder r
这样
b*q + r = a and 0 <= r < b
(假设A和B为> = 0)。
如果您希望这种关系扩展为负A(保持B阳性),则有两个选择:如果您将Q截断为Zero,则R将变为负,因此不变性更改为0 <= abs(r)<否则,您可以朝着负无穷大的地板q,而不变的保持0 <= r <b。 [更新:修复了此Para
在数学数理论中,数学家始终更喜欢后一种选择(请参阅 维基百科)。对于Python,我做出了相同的选择,因为Modulo操作有一些有趣的应用程序,其中A的符号无趣。考虑使用Posix Timestamp(自1970年初以来的几秒钟)并将其转变为一天中的时间。由于一天中有24*3600 = 86400秒,因此该计算仅为t%86400。但是,如果我们使用负数在1970年之前表达时间,则“截断为零”规则将带来毫无意义的结果!使用地板规则,一切都很好。
我想到的其他应用程序是计算机图形中像素位置的计算。我确定还有更多。
顺便说一句,对于负B,一切都会翻转,而不变的变成:
0 >= r > b.
那么C为什么不这样做呢?当时C设计了硬件可能没有这样做。而且硬件可能不是这样做的,因为在最古老的硬件中,负数表示为“标志 +幅度”,而不是如今使用的两者的补充表示(至少对于整数)。我的第一台计算机是控制数据大型机,它使用了一个人的补充,用于整数和浮子。 60个模式意味着负零!
蒂姆·彼得斯(Tim Peters)知道所有Python的浮点骨架都被埋葬在哪里,他对我希望将这些规则扩展到浮点Modulo表示担忧。他可能是对的;当X是非常小的负数时,截短的to-towards-nfitage-Infinita-Infinita-Infinita-Infinita-Infinita-Infinity规则可能会导致X%1.0的精确损失。但这对我来说还不够,可以打破整数模式,//与此密切相关。
PS。请注意,我正在使用//而不是 / - 这是Python 3语法,并且还允许在Python 2中强调您知道您正在调用整数部门。 Python 2中的 /运算符是模棱两可的,因为它返回了两个整数操作数的结果,而不是在INT和一个float或两个浮点上。但这是一个完全不同的故事。参见PEP 238。
由Guido Van Rossum发表于上午9:49
模量是一种数学操作,有时被描述为“时钟算术”。我发现将其描述为剩余的是误导性和混乱,因为它掩盖了它在计算机科学中的真正原因。它确实用于缠绕周期。
想想一个时钟:假设您在“军事”时间里看一个时钟,范围从0:00-23.59开始。现在,如果您希望每天在午夜每天发生某些事情,您将希望当前的时间mod 24为零:
如果(小时%24 == 0):
您可以想到历史上的所有小时都在一遍又一遍地包裹24小时的圈子,而一天中的当前小时是无限长的数字mod 24.这是一个比剩余的更深刻的概念,这是一种数学方式处理周期,这在计算机科学中非常重要。它也用于缠绕数组,使您可以增加索引并使用模量在到达数组末端后将模量重新回到开始。
Python-基本运营商
http://www.tutorialspoint.com/python/python_basic_operators.htm
模量 - 将左手操作数划分为右手操作数,剩余的返回
a = 10和b = 20
b%a = 0
在大多数语言中%用于 模量. 。 Python也不例外。
%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')
这似乎毫无意义,但肯定会对某人有所帮助。
另外,还有一个有用的内置功能称为 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
作为每个源文件中的第一个源代码行。
模量运算符,通常用于整数上的余数,但在Python中可用于浮点数。
http://docs.python.org/reference/expressions.html
百分比(MODULO)运算符得出第二个论点的剩余部分。数字参数首先转换为公共类型。零正确的论点提出了ZerodivisionError异常。该参数可能是浮点数,例如3.14%0.7等于0.34(因为3.14等于4*0.7 + 0.34。)MODULO操作员始终产生的结果与第二操作数(或零)相同的符号;结果的绝对值严格小于第二操作数的绝对值[2]。
这是一个模型操作,除非是老式的C风格的字符串格式化操作员. 。看 这里 有关详细信息。您将在现有代码中看到很多。
意识到
(3+2+1-5) + (4%2) - (1/4) + 6
即使在python 3.4中计算,括号也会导致6.75,而不是7。
而且“/”操作员也不那么容易理解(Python2.7):尝试...
- 1/4
1 - 1/4
这在这里有点偏离,但是在评估上述表达式时应考虑:)
就像在许多类似C的语言中一样,它的剩余或模型操作。看到 数字类型的文档 - int,float,长,复杂.
模量 - 将左手操作数按右手操作数和剩余返回。
如果有帮助:
1:0> 2%6
=> 2
2:0> 8%6
=> 2
3:0> 2%6 == 8%6
=> true
... 等等。
对于我来说,很难很难找到特定的用例,用于在线使用%,例如为什么要进行分数模量划分或负模量划分会导致答案的答案。希望这有助于澄清这样的问题:
通常,模量部门:
模量部门返回数学分区操作的其余部分。确实如下:
假设我们的股息为5和2的分数,以下分区操作将为(等于x):
dividend = 5
divisor = 2
x = 5/2
模量计算中的第一步是进行整数划分:
x_int = 5 // 2(Python中的整数部门使用双重斜线)
x_int = 2
接下来,将X_INT的输出乘以除数:
x_mult = x_int * divisor x_mult = 4
最后,从x_mult中减去股息
股息-x_mult = 1
因此,模量操作返回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
因此,当您进行整数部门时,您可能会获得与您预期的不同结果!
在以下股息上应用上述步骤,Divisor说明了模量概念:
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,因为我们在这里进行整数数学。
我发现,掌握模量运算符(%)的最简单方法是通过长期分裂。它是其余的,对于确定一个偶数或奇数的数字可能很有用:
4%2 = 0
2
2|4
-4
0
11%3 = 2
3
3|11
-9
2
通常,如果您将两个数字划分,它将返回其余部分:
以此示例:===> 10%3 =?.....是的是1, 为什么 ?
10 / 3 = 3 ===> 3 * 3 = 9 ==> 10 - 9 = 1