Что % делает в вычислении? Кажется, я не могу понять, что он делает.
Получается ли процент от вычисления, например: 4 % 2 очевидно, равен 0. Каким образом?
Переведено автоматически
Ответ 1
Оператор % (по модулю) выдает остаток от деления первого аргумента на второй. Числовые аргументы сначала преобразуются в обычный тип. Аргумент zero right вызывает исключение ZeroDivisionError . Аргументами могут быть числа с плавающей запятой, например, 3,14%0,7 равно 0,34 (поскольку 3,14 равно 4*0.7 + 0.34.) Оператор по модулю всегда выдает результат с тем же знаком, что и его второй операнд (или ноль); абсолютное значение результата строго меньше абсолютного значения второго операнда [2].
Пример 1: 6%2 вычисляется как 0 потому что нет остатка, если 6 разделить на 2 ( 3 раза ).
Пример 2: 7%2 вычисляется как 1 потому что остается остаток от 1, когда 7 делится на 2 ( 3 раза ).
Итак, подводя итог, он возвращает остаток от операции деления, или 0 если остатка нет. Итак, 6%2 означает найти остаток от 6, разделенный на 2.
Ответ 2
Несколько не по теме, % также используется в операциях форматирования строк, таких как %= для замены значений в строку:
>>> x = 'abc_%(key)s_' >>> x %= {'key':'value'} >>> x 'abc_value_'
Опять же, не по теме, но, похоже, это небольшая документированная функция, на поиск которой мне потребовалось некоторое время, и я думал, что это связано с вычислением Pythons по модулю, для которого эта страница SO занимает высокое место.
Ответ 3
Выражение типа x % y вычисляет остаток от x ÷ y - ну, технически это "модуль", а не "напоминание", поэтому результаты могут отличаться, если вы сравниваете с другими языками, где % является оператором остатка. Есть некоторые тонкие различия (если вас интересуют практические последствия, смотрите также "Почему этажи целочисленного деления в Python" ниже).
Приоритет такой же, как у операторов / (деление) и * (умножение).
>>> 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:
9/2 равно 4.5 в python. Вы должны выполнить целочисленное деление следующим образом: 9 // 2, если вы хотите, чтобы python сообщал вам, сколько целых объектов осталось после деления (4).
Если быть точным, целочисленное деление использовалось по умолчанию в Python 2 (имейте в виду, этот ответ старше, чем у моего мальчика, который уже ходит в школу и в то время, когда 2.x были мейнстримом):
$ python2.7 Python 2.7.10 (default, Oct 62017, 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 272017, 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 это оператор "модуля" (clock math).
В Java и iOS -11 % 5 = -1 тогда как в python и ruby -11 % 5 = 4.
Ну, половина причины объясняется Пауло Скардином, а остальное объяснение приведено ниже
В Java и iOS, % дает остаток, который означает, что если вы разделите 11 % 5, это даст Quotient = 2 and remainder = 1 и -11 % 5 дает Quotient = -2 and remainder = -1.
Пример кода в swift iOS.
Но когда мы говорим о том, что в python это дает модуль синхронизации. И его работа с приведенной ниже формулой
Почему в Python используется целочисленное деление по этажам
Сегодня меня попросили (снова) объяснить, почему целочисленное деление в Python возвращает минимум результата вместо усечения до нуля, как C.
В положительных числах нет ничего удивительного:
>>> 5//2 2
Но если один из операндов отрицательный, результат уменьшается, т. Е. Округляется от нуля (до отрицательной бесконечности):
>>> -5//2 -3 >>> 5//-2 -3
Некоторых людей это беспокоит, но на то есть веская математическая причина. Операция целочисленного деления (//) и ее брат, операция деления по модулю (%), идут рука об руку и удовлетворяют приятному математическому соотношению (все переменные являются целыми числами):
a/b = q with remainder r
такой, что
b*q + r = a and0 <= r < b
(предполагая, что a и b равны >= 0).
Если вы хотите, чтобы отношение расширялось до отрицательного значения a (сохраняя положительное значение b), у вас есть два варианта: если вы сократите q до нуля, r станет отрицательным, так что инвариант изменится на 0 <= abs (r) < в противном случае вы можете уменьшить q до отрицательной бесконечности, а инвариант останется 0 <= r < b . [обновление: исправлено этот пункт]
В математической теории чисел математики всегда предпочитают последний вариант (см., Например, Википедия ). Для Python я сделал тот же выбор, потому что есть несколько интересных приложений операции по модулю, где знак a неинтересен. Рассмотрите возможность использования временной метки POSIX (секунды с начала 1970 года) и преобразования ее во время суток. Поскольку в сутках 24 * 3600 = 86400 секунд, это вычисление просто равно t % 86400. Но если бы мы выражали время до 1970 года отрицательными числами, правило "усечения до нуля" дало бы бессмысленный результат! Используя правило floor, все работает нормально.
Другие приложения, о которых я думал, - это вычисления положения пикселей в компьютерной графике. Я уверен, что их больше.
Для отрицательного b, кстати, все просто переворачивается, и инвариант становится:
0 >= r > b.
Итак, почему C не делает этого таким образом? Вероятно, аппаратное обеспечение не делало этого во время разработки C. И аппаратное обеспечение, вероятно, сделало это не так, потому что на самом старом оборудовании отрицательные числа были представлены как "знак + величина", а не как дополнение, используемое в наши дни (по крайней мере, для целых чисел). Мой первый компьютер был мэйнфреймом управляющих данных и использовал дополнение для целых чисел, а также чисел с плавающей точкой. Шаблон из 60 единиц означал отрицательный ноль!
Тим Питерс, который знает, где спрятаны все скелеты Python с плавающей запятой, выразил некоторое беспокойство по поводу моего желания расширить эти правила до значений с плавающей запятой по модулю. Вероятно, он прав; правило усечения в сторону отрицательной бесконечности может привести к потере точности для x%1.0, когда x - очень маленькое отрицательное число. Но для меня этого недостаточно, чтобы разбить целое число по модулю, и // тесно связан с этим.
PS. Обратите внимание, что я использую // вместо / -- это синтаксис Python 3, а также разрешено в Python 2 подчеркивать, что вы знаете, что вызываете целочисленное деление. Оператор / в Python 2 неоднозначен, поскольку он возвращает другой результат для двух целых операндов, чем для int и float или двух чисел с плавающей точкой. Но это совершенно отдельная история; см. PEP 238 .
Опубликовано Гвидо ван Россумом в 9: 49
Ответ 4
Модуль - это математическая операция, иногда называемая "тактовой арифметикой". Я нахожу, что описание его как простого остатка вводит в заблуждение, потому что оно маскирует реальную причину, по которой оно так часто используется в информатике. Он действительно используется для обтекания циклов.
Подумайте о часах: предположим, вы смотрите на часы по "военному" времени, где диапазон времени составляет от 0:00 до 23.59. Теперь, если бы вы хотели, чтобы что-то происходило каждый день в полночь, вы бы хотели, чтобы текущее значение времени mod 24 было равно нулю:
if (hour % 24 == 0):
Вы можете представить, что все часы в истории снова и снова повторяются по кругу из 24 часов, и текущий час дня - это бесконечно длинное число mod 24. Это гораздо более глубокое понятие, чем просто остаток, это математический способ работы с циклами, и он очень важен в информатике. Он также используется для обтекания массивов, позволяя вам увеличивать индекс и использовать модуль для обратного обтекания к началу после того, как вы дойдете до конца массива.