divmod с float и int — почему вывод (2.0, 0.5)
@python_quizРазберем этот квиз
Код из квиза:

Коротко: a / b даёт 2.5 (float), b // 2 даёт 1 (int), поэтому divmod(2.5, 1) возвращает (2.0, 0.5). Ниже разберём подробно и сравним варианты ответов.
Как работает divmod(x, y)
- Для чисел divmod(x, y) возвращает пару (q, r), где q — целая часть частного (floor(x / y)), а
r = x- y * q. - Если любой из аргументов — float, результат будет в плавающей форме: q будет представлен как float (например, 3.0), а r тоже как float.
- Для целых аргументов вернётся пара (целочисленный частное, остаток).
Формула на практике:q = floor(x / y)r = x - y * q
Шаги вычисления для данного выражения
- a /
b = 5/ 2 = 2.5 (тип float) - b // 2 = 2 // 2 = 1 (тип int)
- divmod(2.5, 1):
- q = floor(2.5 / 1) = 2 → представляется как 2.0
- r = 2.5 - 1 * 2 = 0.5
→ результат: (2.0, 0.5)
Демонстрация в Python:

Дополнительные примеры (чтобы понять поведение)

Иллюстрация формулы:

Обратите внимание: math.floor возвращает int, тогда как divmod возвращает q в виде float, если аргументы содержат float.
Анализ вариантов из квиза
- "(2.0, 0.5)" — соответствует разложению divmod(2.5, 1) по формуле floor и остаток; совпадает с результатом.
- "(2.5, 1.0)" — неверно: это выглядит как (x, y) или как будто кто-то перепутал входные значения с результатом.
- "(2.0, 1.0)" — неверно: остаток 1.0 не соответствует x - y * floor(x / y) для
x = 2.5,y = 1. - "
TypeError" — неверно: divmod поддерживает комбинацию float и int,TypeErrorне возникает.
Вывод
divmod корректно работает с float и int: при делении 5/2 получается 2.5, при целочисленном делении b//2 получается 1, а divmod(2.5, 1) даёт (2.0, 0.5) — частное в виде float и соответствующий остаток.