Оператор Modulo в Python 1 мин для чтения


Добавить в избранное

Операция по модулю — это арифметическая операция, которая находит остаток от деления одного числа на другое. Остаток называется модулем операции.
Например, 5 деленное на 3, равно 1, с остатком 2, а 8, деленное на 4, равно 2, с остатком 0.
Оператор Modulo в Python
В Python оператор Modulo представлен знаком процента ( %). Синтаксис выглядит следующим образом:
num1 % num2
5 % 4
Если делитель (второй аргумент) равен нулю, то возбуждается ошибка ZeroDivisionError:
5 % 0
ZeroDivisionError: integer division or modulo by zero
Оператор по модулю также принимает плавающие числа в качестве аргументов:
6.8 % 3.4
При форматировании строк символ % представляет оператор интерполяции.
Примеры
Одним из распространенных случаев использования оператора по модулю является проверка, является ли число нечетным или четным. Если число, деленное на 2, не имеет остатка, то это четное число. В противном случае, если он оставляет остаток от 1, то число нечетное:
num = 11 if (num % 2) == 0: print(num, "is even") else: print(num, "is odd")
Если вы запустите приведенный выше код, 11 % 2 оставьте остаток 1 и код внутри оператора else будет выполнен:
11 is odd
Вот еще один пример, показывающий, как проверить, является ли число простым числом, используя оператор по модулю. Простое число — это положительное целое число, которое может быть разделено без остатка только на одно и на 1:
def isPrimeNumber(num): if num < 1: return False for i in range(2, num): if (num % i) == 0: return False else: return True
Сначала мы проверяем num, является ли число положительным числом. Затем мы проверяем, делится ли число на другое число в диапазоне от 2 или num без напоминания. Если ни одно из условий не выполнено, число простое.
Читать Как анализировать и очищать HTML с помощью Pyquery
Оператор по модулю также может быть использован для преобразования единиц измерения. В следующем примере показано, как преобразовать секунды в минуты:
def secondsToMinutes(sec): seconds = sec // 60 minutes = sec % 60 return "%d minutes and %d seconds" % (minutes, seconds) secondsToMinutes(657)
'57 minutes and 10 seconds'
Оператор деления на две косые черты (//) округляет результат до ближайшего целого числа.
Вывод
В этой статье мы показали, как использовать оператор Python по модулю.
Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
Что делает divmod функция в Python?
Функция divmod() принимает в качестве аргументов два числа и возвращает кортеж из двух значений, первое из которых частное от деления аргументов, а второе остаток от деления.
divmod(19, 5) # (3, 4) divmod(6, 3) # (2, 0) divmod(19.5, 6) # (3.0, 1.5)
Div and mod. Питон
![]()
Дано трехзначное число. Разобрать
его на цифры.
x 123
1
x1
2
x2
3
x3
• x=int(input())
• x1= x // 100; < делим на 100 и берем целую часть
• x2= x % 100 //10; < нужно 2 шага:
1) делим на 100 и берем остаток (123 % 100 даст 23).
2) затем делим на 10, берем целую часть (23 // 10=2).
• x3= x % 10; < делим на 10 и берем остаток
• print (x1,x2,x3);
Mod и остаток — не одно и то же

Приготовьтесь, вас ждёт крайне педантичная статья, которая вполне может спасти вас на собеседовании или сэкономить несколько часов при вылавливании бага в продакшне!
Я сейчас активно работаю над вторым сезоном «Руководства для самозванца» и пишу о шифре RSA для SSH, который, очевидно, является самым загружаемым фрагментом кода в истории IT.
Хочется полностью разобраться в этой истории. Кто придумал этот шифр, как он работает, почему работает и будет ли работать в будущем. Сейчас я раскопал одну чертовски интересную историю. Я не криптоманьяк и вижу, как других буквально засасывает в эту область. Но мне это тоже интересно, потому что повсюду есть маленькие норки, а меня как сороку привлекают блестящие штучки в глубоких норках. Я также очень хорош в метафорах.
В любом случае: на прошлой неделе я узнал что-то странное и хочу поделиться: оказывается, mod и остаток от деления — не одно и то же. Действительно забавно то, что некоторые читатели при этих словах выпрыгивают со своих кресел и орут: «А ведь именно это я всегда пытался сказать вам и всем остальным!»
Позовите ребят из секты «mod не остаток»! Это для вас.
Что такое mod?
Я должен был изучить это, как и в прошлый раз, когда всплыла такая тема. Это одна из тех вещей, которые ты знаешь, но не запоминаешь. Когда вы применяете mod, то делите одно число на другое и берёте остаток. Итак: 5 mod 2 будет 1, потому что 5/2=2 с остатком 1.
Термин mod означает операцию modulo, с модулем 2 в данном случае. Большинство языков программирования используют % для обозначения такой операции: 5 % 2 = 1 .
Вот где мы попадаем в странную серую область.
Математика циферблата
Помню, как учил это в школе, а потом забыл. Существует тип математики, называемый «модульной арифметикой», которая имеет дело с циклическими структурами. Самый простой способ представить это — циферблат с циклом 12. Для математика циферблат — это mod 12 . Если хотите понять, можно ли равномерно разделить 253 часа на дни, то можете применить операцию 253 mod 24 , результатом будет 13, поэтому ответ «нет»! Мы можем ответить «да» только если результат 0.
Другой вопрос, который вы можете задать: «Если я выеду в 6 вечера, сколько времени будет по приезду через 16 часов?». Это будет 6 + 16 mod 12 , то есть 10.
Криптографы любят mod , потому что при использовании с действительно большими числами можно создать нечто, известное как «односторонние функции». Это специальные функции, которые позволяют легко вычислить что-то в одном направлении, но не в обратном.
Если я скажу вам, что 9 является результатом возведения в квадрат, вы можете легко определить, что на входе было 3. Перед вами весь процесс от начала до конца. Если я скажу, что 9 является результатом mod 29 , то будет сложнее понять, что на входе.
Криптографам нравится эта идея, потому что они могут использовать деление с остатком с гигантскими простыми числами для генерации криптографических ключей. Это совсем другая история: если хотите прочитать об этом, то можете купить книгу или, ещё лучше, поддержать мои усилия написать её.
Впрочем, не будем отклоняться от темы.
Остатки и математика циферблата
Теперь переходим к сути: modulo и простой остаток одинаковы, когда числа положительны, но отличаются в случае отрицательных чисел.
Рассмотрим такую задачу:
const x = 19 % 12; console.log(x);
Каково значение x ? Делим числа и получаем 7 как остаток от 12. Это верный ответ. Как насчет такого:
const y = 19 % -12; console.log(y);
Используя обычную математику, мы можем умножить -12 на -1, что даёт 12, и у нас по-прежнему остаётся 7, поэтому наш ответ снова 7.
JavaScript с этим согласен:

C# тоже согласен:

Google согласен с первым утверждением, но не согласен со вторым:

Ruby согласен с Google:

Во имя Дейкстры, что здесь происходит?
Вращение часов назад
Чтобы ответить на вопрос, следует понять разницу между остатком и modulo. Программисты объединяют эти операции, но не должны этого делать, потому что они дают одинаковый результат только в случае, если делитель (в нашем случае 12) положителен. Вы можете легко отправить баги в продакшн, если делитель отрицательный.
Но почему существует разница? Рассмотрим положительный делитель 19 mod 12 на часах:

Конечный результат 7. Мы это знаем и мы можем доказать математически. Но что насчёт 19 mod -12 ? Здесь нужно использовать другие часы:

Модуль равен -12, и мы не можем игнорировать или изменить его, умножив на -1, поскольку модульная арифметика так не работает. Единственный способ правильно рассчитать результат — переставить метки на часах так, чтобы мы двигались от -12 или вращали часы против часовой стрелки, что даёт тот же результат.
Почему не начать метки с -1, двигаясь к -2, и т.д.? Потому что в таком случае мы будем двигаться назад и постоянно уменьшать результат, пока не достигнем -12, и в этот момент сделаем прыжок +12, а modulo так не работает.
Это известная вещь
Прежде чем назвать меня сумасшедшим и начать гуглить тему: это известный факт. На самом деле MDN (Mozilla Developer Network) даже дошла до того, чтобы назвать % операцией «остатка» (remainder), а не modulo:
Оператор remainder возвращает остаток от деления одного операнда на другой. Он всегда принимает знак делимого.
Вот что Эрик Липперт, один из богов C#, говорит о modulo в C#:
Однако это совсем не то, что оператор % реально делает в C#. Оператор % не является каноническим оператором modulus, это оператор остатка.
А как на вашем языке?
Ну и что?
Могу понять, если вы дочитали досюда, а теперь чешете голову и задаётесь вопросом, стоит ли беспокоиться. Думаю, что стоит по двум причинам:
- Я представляю, как этот вопрос займёт меня врасплох на собеседовании.
- Я представляю, как этот попадёт в продакшн, а разработчики будут несколько часов выяснять, почему математика не работает.