Поведение /, int() и // при делении отрицательных чисел в Python

Поведение /, int() и // при делении отрицательных чисел в Python

@python_quiz

Разберем этот квиз

Код, который надо проанализировать:

python

Коротко: вывод этой программы — строка с тремя числами. Разберём по шагам, почему именно такие значения появляются.

Быстрая демонстрация

python

Обратите внимание: divmod возвращает кортеж (частное, остаток). Первый элемент кортежа совпадает с результатом //.

Что делает каждая операция

  • / — обычное деление, всегда возвращает float. Для x = -5 и 2 это -2.5.
  • int() — приводит float к целому, отбрасывая дробную часть в сторону нуля. Для -2.5 это -2.
  • // — целочисленное деление с округлением вниз (floor division). Для -2.5 floor = -3.
  • divmod(a, b) возвращает (q, r), где a == b*q + r и 0 <= r < abs(b) (при положительном делителе). Для divmod(-5, 2) это (-3, 1), то есть частное -3 и остаток 1.

Итого: x // 2 → -3, int(x / 2) → -2, divmod(x, 2)[0] → -3.

Анализ вариантов ответа

Варианты:

  • "-3 -2 -3" — совпадает с выводом программы.
  • "-3 -3 -3" — неверно: второй элемент здесь был бы int(-2.5), а int даёт -2, не -3.
  • "-2 -2 -2" — неверно: // для отрицательного числа даёт -3, а не -2.
  • "-2 -3 -2" — неверно по той же причине и из-за порядка значений.

Выводы и правило на будущее

  • Деление / даёт float; int() отбрасывает дробную часть в сторону нуля.
  • // и первый элемент divmod(...)[0] используют floor-деление — результат округляется вниз (к -∞), что отличает их от int(x / y) для отрицательных результатов.
  • При работе с отрицательными числами важно различать «усечение к нулю» (int) и «округление вниз» (floor).

Примеры для закрепления:

python

Report Page