Поведение /, int() и // при делении отрицательных чисел в Python
@python_quizРазберем этот квиз
Код, который надо проанализировать:

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

Обратите внимание: divmod возвращает кортеж (частное, остаток). Первый элемент кортежа совпадает с результатом //.
Что делает каждая операция
/— обычное деление, всегда возвращает float. Для x = -5 и 2 это-2.5.int()— приводит float к целому, отбрасывая дробную часть в сторону нуля. Для-2.5это-2.//— целочисленное деление с округлением вниз (floor division). Для-2.5floor =-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).
Примеры для закрепления:
