百分号在Python中意味着什么

时间:2009-06-07 06:47:03

标签: python operators modulo

在教程中有一个查找素数的例子:

>>> for n in range(2, 10):
...     for x in range(2, n):
...         if n % x == 0:
...             print(n, 'equals', x, '*', n//x)
...             break
...     else:
...         # loop fell through without finding a factor
...         print(n, 'is a prime number')
...

我理解双==是对平等的测试,但我不理解if n % x部分。就像我可以口头遍历每个部分并说出该声明对该示例的作用。但我不明白百分号是如何落入的。

if n % x实际上说了什么?

8 个答案:

答案 0 :(得分:108)

%根据其参数做两件事。在这种情况下,它充当模运算符,这意味着当它的参数是数字时,它将第一个除以第二个并返回余数34 % 10 == 4因为34除以10是3,其余为4。

如果第一个参数是字符串,则使用第二个参数对其进行格式化。这有点涉及,所以我将参考documentation,但仅举例:

>>> "foo %d bar" % 5
'foo 5 bar'

但是,字符串格式化行为从Python 3.1开始补充,有利于字符串 .format()机制:

  

此处描述的格式化操作表现出各种怪癖,导致许多常见错误(例如无法正确显示元组和字典)。使用较新的str.format()接口有助于避免这些错误,并且还提供了一种通常更强大,灵活且可扩展的格式化文本的方法。

幸运的是,几乎所有的新功能都可以从python 2.6开始提供。

答案 1 :(得分:52)

模数运算符;给左值的余数除以右值。像:

3 % 1将等于零(因为3将1均分为1)

3 % 2等于1(因为将3除以2导致余数为1)。

答案 2 :(得分:14)

虽然这有点偏离主题,因为人们会通过搜索“Python中的百分号”(就像我做的那样)找到这个,我想要注意,%符号也用于在“魔术”函数前加上iPython:https://ipython.org/ipython-doc/3/interactive/tutorial.html#magic-functions

答案 3 :(得分:9)

  

百分号是什么意思?

它是Python中的一个运算符,根据上下文,它可能表示几件事情。其他答案中已经提到(或暗示了)很多后续内容,但我认为提供更广泛的摘要可能会有所帮助。

%代表数字:模运算/余数/余数

百分号是operator in Python。描述为:

x % y       remainder of x / y

因此,如果您将x除以y,则remainder/rest that 仍然存在。通常(至少在Python中)给定数字x和除数y

x == y * (x // y) + (x % y)

例如,如果将5除以2:

>>> 5 // 2
2
>>> 5 % 2
1

>>> 2 * (5 // 2) + (5 % 2)
5

通常,您使用模运算来测试一个数字是否均匀地除以另一个数字,这是因为以该数字为模的数字的倍数返回0:

>>> 15 % 5  # 15 is 3 * 5
0

>>> 81 % 9  # 81 is 9 * 9
0

这就是您的示例中的用法,如果它是另一个数字的倍数(除了自身和一个),则不能是素数,这就是这样做的:

if n % x == 0:
    break

如果您认为n % x == 0的描述性不是很好,则可以将其放在具有更描述性的名称的另一个函数中:

def is_multiple(number, divisor):
    return number % divisor == 0

...

if is_multiple(n, x):
    break

它也可以代替is_multiple命名为evenly_divides或类似的名称。这就是这里要测试的。

类似于它通常用于确定数字是“奇数”还是“偶数”:

def is_odd(number):
    return number % 2 == 1

def is_even(number):
    return number % 2 == 0

在某些情况下,当需要环绕(循环)行为时,它也可用于数组/列表索引,然后只需将“索引”与“数组长度”取模,即可实现:

>>> l = [0, 1, 2]
>>> length = len(l)
>>> for index in range(10):
...     print(l[index % length])
0
1
2
0
1
2
0
1
2
0

请注意,标准库operator.mod(和别名operator.__mod__)中还为该操作符提供了一个功能:

>>> import operator
>>> operator.mod(5, 2)  # equivalent to 5 % 2
1

但是还有扩展分配%=,它将结果分配回变量:

>>> a = 5
>>> a %= 2  # identical to: a = a % 2
>>> a
1

%表示字符串:printf-style String Formatting

对于字符串,含义是完全不同的,有一种方式(在我看来,这是最有限和最丑陋的方式):

>>> "%s is %s." % ("this", "good") 
'this is good'

此处,字符串中的%代表一个占位符,后跟一个格式说明。在这种情况下,我使用了%s,这意味着它需要一个字符串。然后,该字符串后跟一个%,该字符串指示左侧的字符串将由右侧格式化。在这种情况下,第一个%s被第一个参数this替换,第二个%s被第二个参数(good)替换。

请注意,有许多更好的(可能基于意见)格式化字符串的方法:

>>> "{} is {}.".format("this", "good")
'this is good.'
Jupyter / IPython中的

%:魔术命令

引用docs

  

对于Jupyter用户:魔术是IPython内核特有的并由IPython内核提供。魔术是否在内核上可用是由内核开发人员根据每个内核确定的。为了正常工作,Magics必须使用在基础语言中无效的语法元素。例如,IPython内核将%语法元素用于魔术,因为%在Python中不是有效的一元运算符。同时,语法元素在其他语言中也具有含义。

这在Jupyter笔记本和类似产品中经常使用:

In [1]:  a = 10
         b = 20
         %timeit a + b   # one % -> line-magic

54.6 ns ± 2.7 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

In [2]:  %%timeit  # two %% -> cell magic 
         a ** b

362 ns ± 8.4 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

阵列上的%运算符(在NumPy / Pandas生态系统中)

%运算符在应用于这些数组时仍然是模运算符,但是它返回一个数组,其中包含该数组中每个元素的其余部分:

>>> import numpy as np
>>> a = np.arange(10)
>>> a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

>>> a % 2
array([0, 1, 0, 1, 0, 1, 0, 1, 0, 1])

为您自己的类自定义%运算符

当然,您可以自定义将%运算符应用于自己的类时的工作方式。通常,您应该仅使用它来实现模运算!但这是一个准则,而不是硬性规定。

仅提供一个简单的示例说明其工作原理:

class MyNumber(object):
    def __init__(self, value):
        self.value = value

    def __mod__(self, other):
        print("__mod__ called on '{!r}'".format(self))
        return self.value % other

    def __repr__(self):
        return "{self.__class__.__name__}({self.value!r})".format(self=self)

该示例并不是真正有用,它只是打印然后将运算符委托给存储的值,但是它表明将%应用于实例时会调用__mod__

>>> a = MyNumber(10)
>>> a % 2
__mod__ called on 'MyNumber(10)'
0

请注意,它也适用于%=,而无需明确实现__imod__

>>> a = MyNumber(10)
>>> a %= 2
__mod__ called on 'MyNumber(10)'

>>> a
0

不过,您也可以显式实现__imod__来覆盖扩展分配:

class MyNumber(object):
    def __init__(self, value):
        self.value = value

    def __mod__(self, other):
        print("__mod__ called on '{!r}'".format(self))
        return self.value % other

    def __imod__(self, other):
        print("__imod__ called on '{!r}'".format(self))
        self.value %= other
        return self

    def __repr__(self):
        return "{self.__class__.__name__}({self.value!r})".format(self=self)

现在%=已被明确覆盖以就地工作:

>>> a = MyNumber(10)
>>> a %= 2
__imod__ called on 'MyNumber(10)'

>>> a
MyNumber(0)

答案 4 :(得分:1)

在python 2.6中,'%'运算符执行了模数。我不认为他们在3.0.1中改变了它。

模运算符告诉你两个数的除法的余数。

答案 5 :(得分:1)

检查分裂的模数。例如,如果您正在迭代从2到n的所有数字,并检查n是否可被中间任何数字整除。简而言之,您正在检查给定数字n是否为素数。 (提示:你最多可以检查n / 2)。

答案 6 :(得分:1)

模数运算符。除以两个数字时的余数。

例如:

>>> 5 % 2 = 1 # remainder of 5 divided by 2 is 1
>>> 7 % 3 = 1 # remainer of 7 divided by 3 is 1
>>> 3 % 1 = 0 # because 1 divides evenly into 3

答案 7 :(得分:0)

  

Blockquote   x%n == 0   这意味着x / n和提醒值将作为结果并与零进行比较。...

示例: 4/5 == 0

4/5提醒为1

1 == 0(否)