% (остаток)
Оператор работает с двумя операндами: делимым и делителем.
Числовые операнды сначала приводятся к общему типу. Операнды могут быть числами с плавающей запятой.
Если второй операнд наверен 0 (нулю), возбуждается ZeroDivisionError
Начиная с +py2.3 оператор не поддерживается комплексными числами. В таких случаях, если применимо, следует получить сначала число с плавающей запятой при помощи функции abs().
Оператор всегда выдаёт результат с тем же знаком, какой имеет его второй операнд (либо нуль). При этом абсолютная величина результата строго меньше абсолютной величены второго операнда.
1 % 2 # 1
1.0 % 2 # 1.0
-1 % 2 # 1
-1 % -2 # -1
2 % 10 # 2
2 % 0 # ZeroDivisionError
На заметку
Похожие функции: divmod() и math.reminder() .
На заметку
Помимо того, что % возвращает остаток от деления для чисел, он же используется для форматирования строк.
% (Modulo) operator
Находит остаток (по модулю) первого растра при делении на второй растр по принципу ячейка-за-ячейкой.
Иллюстрация
Обсуждение
При использовании оператора со входным растром на выходе также будет растр. Если же все входные данные являются числами, на выходе также будет число.
Если в выражении используется несколько операторов, их необязательно выполнять слева направо. Оператор с наивысшим значением приоритета будет выполнен первым. Более подробно см. таблицу приоритета операторов в разделе Работа с операторами в Алгебре карт. Порядок выполнения операторов можно изменить с помощью скобок.
Для этого оператора важен порядок растров во входном списке.
Любому значению для которого выполнена операция деления с остатком на ноль присваивается значение NoData на выходе; следовательно, любой ячейке, значение которой во вторых входных данных – ноль или NoData, в выходных данных будет присвоено значение NoData.
Оператор Остаток от деления предполагает, что оба входных набора данных являются целочисленными. Если один из наборов не является целочисленным, эти данные будут преобразованы в целые числа посредством округления. Выходные значения всегда целочисленные.
Другой способ выполнить вычитание – a %= b , что иным способом может быть записано как a = a % b .
Если оба входных растра являются одноканальными или на входе имеется константа, на выходе получится одноканальный растр.
Если оба входных растра являются многоканальными, оператор будет выполнен для каждого канала, а выходной растр будет многоканальным. Число каналов всех многоканальных растров должно быть одинаковым.
Если один из входных растров является многоканальным, а другие входные данные — константами, оператор выполнится с постоянным значением для каждого канала многоканального входного растра, а выходной растр будет многоканальным.
Если все входные данные являются многомерными растрами с одинаковым количеством переменных, оператор будет выполнен для всех срезов с одинаковым значением измерения, а на выходе будет получен многомерный растр. У переменных во входных данных должны быть одинаковые или общие размерности.
Если у обоих входных данных одна переменная, но разные имена, установите False для среды геообработки matchMultidimensionalVariable , чтобы выполнить операцию.
Если одними из входных данных является многомерный растр, а другие — константой, оператор будет выполнен для всех срезов для всех переменных с постоянным значением, и на выходе будет получен многомерный растр.
Параметры
in_raster_or_constant1
Входные данные числителя.
Если первый набор входных значений является растром, а второй – скаляром, то выходной растр создается со значениями остатка, вычисленным для каждого значения, после деления его на значение скаляра.
in_raster_or_constant2
Входные данные знаменателя.
Если первый набор входных значений является скаляром, а второй – растром, то выходной растр создается с остатком, вычисленным для каждого значения, после деления на него значения скаляра.
Пример кода
% (Остаток от деления) Пример 1 (окно Python)
В этом примере выдается значение остатка (модуля) деления ячеек в первом растре на ячейки во втором.
import arcpy from arcpy import env from arcpy.ia import * env.workspace = "C:/iapyexamples/data" outMod = Raster("degs") % Raster("negs") outMod.save("C:/iapyexamples/output/outmod.tif")
% (Остаток от деления), пример 2 (автономный скрипт)
В этом примере выдается значение остатка (модуля) деления ячеек в первом растре на ячейки во втором.
# Name: Op_Mod_Ex_02.py # Description: Finds the remainder of the first raster when divided by # the second raster on a cell-by-cell basis # Requirements: Image Analyst Extension # Import system modules import arcpy from arcpy import env from arcpy.ia import * # Set environment settings env.workspace = "C:/iapyexamples/data" # Set local variables inRaster1 = Raster("degs") inRaster2 = Raster("negs") # Execute Mod outMod = inRaster1 % inRaster2 # Save the output outMod.save("C:/iapyexamples/output/outmod")
Параметры среды
Связанные разделы
Оператор модуля Python
Операция по модулю — это арифметическая операция, которая находит остаток от деления одного числа на другое. Остаток называется модулем операции.
Например, 5, разделенное на 3, равно 1 с остатком 2, а 8, разделенное на 4, равно 2, с остатком 0.
Оператор модуля Python
В Python оператор по модулю представлен знаком процента ( % ). Синтаксис следующий:
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 без напоминания. Если ни одно из условий не выполняется, число простое.
Оператор по модулю также может использоваться для преобразования единиц измерения. В следующем примере показано, как преобразовать секунды в минуты:
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 по модулю.
Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.
Деление с остатком преподнесло сюрприз
Деление с остатком – часто используемая операция в программировании. Начиная от классических заданий для начинающих на вычисление минут и секунд:
total_seconds = 119 seconds = total_seconds % 60 minutes = total_seconds // 60 print(f':') # 1:59
Заканчивая тем, что на остатках построена львиная доля криптографии. Нахождения остатка часто называют modulo (или коротко mod).
При делении a на b неполное частное q и остаток r связаны формулой:
В Python 3 частное и остаток вычисляются операторами:
q = a // b r = a % b
Именно двойной слэш, одинарный слэш – деление без остатка (до конца). Иногда двойной слэш называют целочисленным делением, что не очень справедливо, потому что мы можем без проблем делить числа с запятой. Если оба числа целые (int), то частное будет тоже целым числом (int), иначе float. Посмотрите примеры:
10 / 3 == 3.3333333333333335 10 // 3 == 3 10.0 / 3.0 == 3.3333333333333335 10.0 // 3.0 == 3.0 10.0 % 3.0 == 1.0 10 % 3 == 1 2.4 // 0.4 == 5.0 2.4 / 0.4 == 5.999999999999999 2.4 % 0.4 == 0.3999999999999998
Последние три примера немного обескураживают из-за особенностей вычислений с плавающей точкой на компьютере, но формула a = b · q + r всегда остается справедлива.
a, b = [10, -10], [3, -3] for x in a: for y in b: print(f' // = ') print(f' % = ') print() 10 // 3 = 3 10 % 3 = 1 10 // -3 = -4 10 % -3 = -2 -10 // 3 = -4 -10 % 3 = 2 -10 // -3 = 3 -10 % -3 = -1
Формула выполняется всегда, но результаты отличаются для С++ и Python, где при делении на положительное число – остаток всегда положителен, а на отрицательное число – отрицателен. Если бы мы сами реализовали взятие остатка, то получилось бы так:
def mod_python(a, b): return int(a - math.floor(a / b) * b) # на С++ работает так: def mod_cpp(a, b): return int(a - math.trunc(a / b) * b)
Где floor – ближайшее целое число не превышающее аргумент: floor(-3.3) = -4 , а trunc – функция отбрасывания целой части: trunc(-3.3) = -3 . Разница проявляется между ними только для отрицательных чисел. Отсюда и разные остатки и частные – все зависит от того, с какой стороны числовой оси мы приближаемся к частному.
Вывод: если вам доведется писать или портировать код, где возможно деление отрицательных чисел с остатком, будьте предельно аккуратны, и помните про разницу поведения деления в разных языках.
Специально для канала @pyway. Подписывайтесь на мой канал в Телеграм @pyway
