Divmod: примеры (PYTHON)

Использование функции divmod для получения частного и остатка в Python
Раздел: Встроенные функции, Математические
divmod(a: number, b: number): tuple

Описание функции divmod

Функция divmod() в Python возвращает кортеж, состоящий из частного и остатка от деления двух аргументов. Она используется в ситуациях, когда требуется одновременно получить результат целочисленного деления (частное) и остаток от этого деления.

Синтаксис: divmod(a, b).

Аргументы:

  • a (обязательный) – делимое (число). Может быть целым числом (int) или числом с плавающей точкой (float).
  • b (обязательный) – делитель (число). Также может быть int или float.

Возвращаемое значение:

  • Кортеж из двух элементов (q, r), где q = a // b (частное, результат целочисленного деления), а r = a % b (остаток от деления). Для целых чисел это следует математическому соотношению: a = b * q + r. Для чисел с плавающей точкой результат определяется как q = math.floor(a / b).

Короткие примеры использования

Работа с целыми числами:

divmod(20, 3)
(6, 2)

Работа с числами с плавающей точкой:

divmod(7.5, 2.5)
(3.0, 0.0)

Отрицательные числа:

divmod(-10, 3)
(-4, 2)

Второй аргумент отрицательный:

divmod(10, -3)
(-4, -2)

Похожие функции в Python

Прямыми альтернативами для получения отдельных компонентов являются операторы:

  • // (целочисленное деление):
    20 // 3
    6
  • % (остаток от деления):
    20 % 3
    2

divmod() предпочтительнее, когда нужны оба значения сразу, так как это предотвращает повторное вычисление одного и того же деления и повышает читаемость кода.

Аналоги функции в других языках

JavaScript: Отдельные операторы ~~(a/b) (или Math.floor()) и %.

let a = 20, b = 3;
console.log(Math.floor(a/b), a % b);
6 2

PHP: Функции intdiv() и оператор %.

$q = intdiv(20, 3);
$r = 20 % 3;
echo "$q, $r";
6, 2

Java: Для целых чисел операторы / и %, для получения частного как целого числа тип аргументов должен быть целым.

int q = 20 / 3;
int r = 20 % 3;
System.out.println(q + " " + r);
6 2

Golang: Операторы / и % для целых чисел. Для одновременного получения есть возможность множественного присваивания.

q, r := 20/3, 20%3
fmt.Println(q, r)
6 2

В отличие от Python, во многих языках нет встроенной функции, возвращающей кортеж, и требуется использовать два оператора.

Типичные ошибки

Деление на ноль:

divmod(10, 0)
ZeroDivisionError: integer division or modulo by zero

Передача нечисловых аргументов:

divmod('10', 2)
TypeError: unsupported operand type(s) for divmod(): 'str' and 'int'

Передача только одного аргумента:

divmod(10)
TypeError: divmod expected 2 arguments, got 1

Изменения в последних версиях

В Python 3.x функция divmod() для комплексных чисел была удалена и вызывает TypeError. В Python 2 она поддерживалась. В остальном поведение функции стабильно на протяжении многих версий.

Расширенные примеры применения

Преобразование секунд в минуты и секунды:

Пример python
seconds = 3678
minutes, remaining_seconds = divmod(seconds, 60)
print(f'{minutes} минут {remaining_seconds} секунд')
61 минут 18 секунд

Преобразование общего количества сантиметров в метры и сантиметры:

Пример python
total_cm = 325
meters, cm = divmod(total_cm, 100)
print(f'{meters} м {cm} см')
3 м 25 см

Разбиение числа на разряды для вывода с разделителями (например, для денежных сумм):

Пример python
def format_number(num):
    result = []
    while num > 0:
        num, remainder = divmod(num, 1000)
        result.append(str(remainder).zfill(3) if num > 0 else str(remainder))
    return ' '.join(reversed(result))

print(format_number(1234567))
1 234 567

Проверка делимости и получение неполного частного в одной операции для обработки пагинации:

Пример python
total_items = 47
items_per_page = 10
full_pages, items_on_last_page = divmod(total_items, items_per_page)
num_pages = full_pages + (1 if items_on_last_page else 0)
print(f'Полных страниц: {full_pages}, элементов на последней: {items_on_last_page}, всего страниц: {num_pages}')
Полных страниц: 4, элементов на последней: 7, всего страниц: 5

Обработка координат при работе с графикой или игровыми картами (перевод линейного индекса в строку и столбец):

Пример python
def index_to_coords(index, width):
    row, col = divmod(index, width)
    return row, col

print(index_to_coords(17, 5))
(3, 2)

питон divmod function comments

En
Divmod Return the quotient and remainder of division