Что означает процент означает знак в Python
в учебнике есть пример поиска простых чисел:
>>> 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 ответов
оператор модуля; дает остаток левого значения, разделенного на правое значение. Например:
3 % 1
будет равно нулю (так как 3 делится равномерно на 1)
3 % 2
будет равно 1 (так как деление 3 на 2 приводит к остатку 1).
% делает две вещи, в зависимости от его аргументов. В этом случае он действует как оператор по модулю, то есть, когда его аргументы являются числами, он делит первый на второй и возвращает остаток. 34 % 10 == 4
так как 34 делится на 10-это три, а остальные четыре.
если первый аргумент является строкой, он форматирует его, используя второй аргумент. Это немного связано, поэтому я буду ссылаться на документация, но только в качестве примера:
>>> "foo %d bar"%5
'foo 5 bar'
однако поведение форматирования строк дополняется с Python 3.1 в пользу строка.format()
механизм:
операции форматирования, описанные здесь, демонстрируют различные причуды, которые приводят к ряду распространенных ошибок (таких как неправильное отображение кортежей и словарей). Использование нового
str.format()
интерфейс помогает избежать этих ошибок, а также обеспечивает в целом более мощный, гибкий и расширяемый подход к форматированию текста.
и, к счастью, почти все новые функции также доступны с python 2.6 и далее.
хотя это немного не по теме, так как люди найдут это, ища " процентный знак в Python "(как и я), я хотел отметить, что знак % также используется для префикса" волшебной " функции в iPython:https://ipython.org/ipython-doc/3/interactive/tutorial.html#magic-functions
что означает знак процента означает?
это оператор в Python, который может означать несколько вещей в зависимости от контекста. Многое из того, что следует ниже, уже упоминалось (или намекалось) в других ответах, но я подумал, что было бы полезно предоставить более подробное резюме.
%
для чисел: операция по модулю / остаток / отдых
знак процента -оператор в Python. Это описано as:
x % y remainder of x / y
таким образом, он дает вам остаток/остаток, что остается если вы "разделяете пол" x на y. Обычно (по крайней мере, в 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
стиль форматирования строк
для строк значение совершенно другое, вот оно в одну сторону (на мой взгляд, самый ограниченный и уродливый) для форматирования строк:
>>> "%s is %s." % ("this", "good")
'this is good'
здесь %
в строке представляет собой заполнитель, за которым следует спецификация форматирования. В этом случай я использовал %s
что означает, что он ожидает строку. Затем за строкой следует %
что означает, что строка с левой стороны будет отформатирована с правой стороны. В этом случае первый %s
заменяется первым аргументом this
и второй %s
заменяется вторым аргументом (good
).
обратите внимание, что есть гораздо лучшие (возможно, основанные на мнении) способы форматирования строк:
>>> "{} is {}.".format("this", "good")
'this is good.'
%
in Jupyter / IPython: магические команды
цитировать docs:
для пользователей Jupyter: магия специфична и предоставляется ядром IPython. Доступны ли магии в ядре-это решение, которое принимается разработчиком ядра на основе каждого ядра. Чтобы правильно работать, магия должна использовать синтаксический элемент, который недопустим в базовом языке. Например, ядро 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)
в python 2.6 оператор " % "выполнил модуль. Я не думаю, что они изменили его в 3.0.1
оператор по модулю сообщает вам остаток деления двух чисел.
Он проверяет, если по модулю деления. Например, в случае, если вы перебираете все числа от 2 до n и проверить, если N делится на любое из чисел между ними. Проще говоря, вы проверяете, является ли данное число n простым. (Подсказка: вы можете проверить до n/2).
оператор модуля. Остальное при делении на два числа.
Например:
>>> 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
Blockquote x % n ==0 это означает, что x / n и значение напоминания будут взяты в результате и сравниваться с нулем....
пример: 4/5==0
4/5 напоминание 1
1==0 (False)