← Все вопросы

Что значит % и // в Python (остаток и целочисленное деление)?

Задан 14 дней назад265 просмотров2 ответа
1

Запутался в операторах. Обычное деление / понятно, а вот % и // — нет. Например 7 % 3 даёт 1, а 7 // 3 даёт 2. И совсем сломался на отрицательных:

print(-7 % 3)    # ожидал -1, а вышло 2
print(-7 // 3)   # -3, а думал -2

Почему так? И как через это проверить, чётное число или нет?

2 ответа

3
✓ Принятый ответ — помог автору

Два оператора, которые ходят парой:

  • // — целочисленное деление (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).

2

Ещё пара практичных мест, где % и // выручают.

Достать последнюю цифру числа и «откусить» её:

n = 1234
print(n % 10)    # 4   последняя цифра
print(n // 10)   # 123 без последней цифры

На этом строится разбор числа по цифрам в цикле. И обрати внимание на тип результата: // между двумя int даёт int, а если хоть один float — будет float (7.0 // 23.0). А / всегда возвращает float, даже 4 / 2 это 2.0, а не 2. Если нужно именно целое — бери //.

Ваш ответ

Войдите, чтобы ответить на вопрос.
Поддержать проект