Что значит % и // в Python (остаток и целочисленное деление)?
Запутался в операторах. Обычное деление / понятно, а вот % и // — нет. Например 7 % 3 даёт 1, а 7 // 3 даёт 2. И совсем сломался на отрицательных:
print(-7 % 3) # ожидал -1, а вышло 2
print(-7 // 3) # -3, а думал -2
Почему так? И как через это проверить, чётное число или нет?
2 ответа
Два оператора, которые ходят парой:
//— целочисленное деление (floor division), округляет результат ВНИЗ до ближайшего целого.%— остаток от деления.
print(7 / 3) # 2.3333... обычное деление, всегда float
print(7 // 3) # 2 целая часть
print(7 % 3) # 1 остаток (7 = 3*2 + 1)
Они связаны тождеством: a == (a // b) * b + (a % b). Запомни его — оно объясняет «странные» отрицательные.
Про знаки. В Python // округляет именно ВНИЗ (к минус бесконечности), а не «отбрасыванием дробной части». Поэтому:
print(-7 // 3) # -3, потому что -2.33 округляем ВНИЗ до -3 (не до -2)
А % подстраивается под тождество и поэтому имеет знак ДЕЛИТЕЛЯ:
print(-7 % 3) # 2 проверка: (-3)*3 + 2 = -7 ✓
print(7 % -3) # -1 знак как у -3
Это отличается от C/Java, где остаток берёт знак делимого. В Python результат % всегда в диапазоне [0, b) для положительного b — удобно для индексов по кругу.
Проверка чётности — классика через остаток от деления на 2:
n = 10
if n % 2 == 0:
print("чётное")
else:
print("нечётное")
Работает и для отрицательных: -4 % 2 == 0.
Бонус — divmod, отдаёт частное и остаток за один раз:
q, r = divmod(17, 5)
print(q, r) # 3 2
Удобно, например, переводить секунды в минуты и секунды: mins, secs = divmod(total, 60).
Ещё пара практичных мест, где % и // выручают.
Достать последнюю цифру числа и «откусить» её:
n = 1234
print(n % 10) # 4 последняя цифра
print(n // 10) # 123 без последней цифры
На этом строится разбор числа по цифрам в цикле. И обрати внимание на тип результата: // между двумя int даёт int, а если хоть один float — будет float (7.0 // 2 → 3.0). А / всегда возвращает float, даже 4 / 2 это 2.0, а не 2. Если нужно именно целое — бери //.