Python中%的结果是什么?

问题描述 投票:195回答:18

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

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

python python-2.7 syntax operators modulo
18个回答
275
投票

%(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。


3
投票

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

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

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


3
投票

这是一个模运算,除非它是一个老式的C风格字符串格式化运算符,而不是模运算。有关详细信息,请参阅here。你会在现有的代码中看到很多这样的东西。


2
投票

意识到

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

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


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

- 1/4

1 - 1/4

这里有点偏离主题,但在评估上面的表达式时应该考虑:)


1
投票

与许多类C语言一样,它是余数或模运算。见documentation for numeric types — int, float, long, complex


1
投票

模数 - 用左手操作数除左手操作数并返回余数。

如果它有帮助:

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

... 等等。


1
投票

我很难找到使用%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 * divisor x_mult = 4
  3. 最后,从x_mult中减去红利 dividend - 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
投票

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

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

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因为我们在这里做整数数学。


130
投票

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

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

关于主题,但它似乎是一个有点记录的功能,花了我一段时间来追踪,我认为它与Pythons模数计算有关,这个SO页面排名很高。


49
投票

x % y这样的表达式评估x ÷ y的其余部分 - 嗯,从技术上来说它是“模数”而不是“提醒”,所以如果你与%是余数运算符的其他语言进行比较,结果可能会有所不同。 There are some subtle differences(如果你对实际后果感兴趣,请参阅“为什么Python的Integer Division Floors”)。

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

>>> 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评论:

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中的示例代码。

enter image description here

但是当我们在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中的示例代码。

enter image description here


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发布


47
投票

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

想想时钟:假设你在“军事”时间看一个时钟,其时间范围从0:00到23.59。现在,如果您希望每天午夜都能发生某些事情,那么您希望当前时间模式24为零:

if(小时%24 == 0):

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


9
投票

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

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

a = 10,b = 20

b%a = 0


8
投票

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


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')

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


4
投票

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

divmod(a,b)

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


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

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

© www.soinside.com 2019 - 2024. All rights reserved.