divmod с float и int — почему вывод (2.0, 0.5)

divmod с float и int — почему вывод (2.0, 0.5)

@python_quiz

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

Код из квиза:

python

Коротко: 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

Шаги вычисления для данного выражения

  1. a / b = 5 / 2 = 2.5 (тип float)
  2. b // 2 = 2 // 2 = 1 (тип int)
  3. divmod(2.5, 1):

- q = floor(2.5 / 1) = 2 → представляется как 2.0
- r = 2.5 - 1 * 2 = 0.5
→ результат: (2.0, 0.5)

Демонстрация в Python:

python

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

python

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

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 и соответствующий остаток.

Report Page