Вопрос-Ответ

What is the result of % in Python?

Каков результат % в Python?

Что % делает в вычислении? Кажется, я не могу понять, что он делает.

Получается ли процент от вычисления, например: 4 % 2 очевидно, равен 0. Каким образом?

Переведено автоматически
Ответ 1

Оператор % (по модулю) выдает остаток от деления первого аргумента на второй. Числовые аргументы сначала преобразуются в обычный тип. Аргумент zero right вызывает исключение 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 потому что остается остаток от 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 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 это оператор "модуля" (clock math).

Вы можете получить объяснение непосредственно из GvR:



Редактировать - dahiya_boy


В 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 это дает модуль синхронизации. И его работа с приведенной ниже формулой

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.

введите описание изображения здесь



Почему в Python используется целочисленное деление по этажам


Сегодня меня попросили (снова) объяснить, почему целочисленное деление в 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 . [обновление: исправлено этот пункт]


В математической теории чисел математики всегда предпочитают последний вариант (см., Например, Википедия ). Для 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. Это гораздо более глубокое понятие, чем просто остаток, это математический способ работы с циклами, и он очень важен в информатике. Он также используется для обтекания массивов, позволяя вам увеличивать индекс и использовать модуль для обратного обтекания к началу после того, как вы дойдете до конца массива.

python