Горячее
Лучшее
Свежее
Подписки
Сообщества
Блоги
Эксперты
Войти
Забыли пароль?
или продолжите с
Создать аккаунт
Я хочу получать рассылки с лучшими постами за неделю
или
Восстановление пароля
Восстановление пароля
Получить код в Telegram
Войти с Яндекс ID Войти через VK ID
Создавая аккаунт, я соглашаюсь с правилами Пикабу и даю согласие на обработку персональных данных.
ПромокодыРаботаКурсыРекламаИгрыПополнение Steam
Пикабу Игры +1000 бесплатных онлайн игр
🔮✨Волшебство, любовь… и шерсть на одежде!
Ищи улики, решай головоломки — и помни: каждый твой шаг меняет ход сюжета.

Мой Любимый Кот

Новеллы, Головоломки, Коты

Играть

Топ прошлой недели

  • Rahlkan Rahlkan 1 пост
  • Tannhauser9 Tannhauser9 4 поста
  • alex.carrier alex.carrier 5 постов
Посмотреть весь топ

Лучшие посты недели

Рассылка Пикабу: отправляем самые рейтинговые материалы за 7 дней 🔥

Нажимая кнопку «Подписаться на рассылку», я соглашаюсь с Правилами Пикабу и даю согласие на обработку персональных данных.

Спасибо, что подписались!
Пожалуйста, проверьте почту 😊

Помощь Кодекс Пикабу Команда Пикабу Моб. приложение
Правила соцсети О рекомендациях О компании
Промокоды Биг Гик Промокоды Lamoda Промокоды МВидео Промокоды Яндекс Директ Промокоды Отелло Промокоды Aroma Butik Промокоды Яндекс Путешествия Постила Футбол сегодня
0 просмотренных постов скрыто
56
YtYt.Pikabu
YtYt.Pikabu
2 года назад
Программирование на python

Нюансы Python #2: деление и остаток⁠⁠

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

5 // -2
-5 // 2
5 % -2
-5 % 2


Если у вас получилось -3, -3, -1 и 1, то снимаю перед вами шляпу. А если нет, то добро пожаловать в основную часть поста, где мы подробно разберём, почему получился именно такой результат.

Нюансы Python #2: деление и остаток Python, Программирование, Обучение, IT, Деление, Длиннопост
Прочитать материал в более удобном виде, с форматированием и интерактивными примерами кода, можно здесь.

Про разные подходы

В математике «поделить a на b с остатком» означает «найти такие числа q и r, что будет выполняться равенство b*q + r = a».


a - делимое;

b - делитель;

q - неполное частное;

r - остаток.


Например:

11 / 4 = 2, остаток 3.
4 * 2 + 3 = 11
7 / 2 = 3, остаток 1.
2 * 3 + 1 = 7
14 / 5 = 2, остаток 4.
5 * 2 + 4 = 14

А если остаток отрицательный?

В математике принято считать, что остаток должен быть неотрицательным, то есть должно выполняться неравенство 0 <= r < b. Но ведь физически никто не мешает нам сделать так:


11 / 4 = 2, остаток 3
11 / 4 = 3, остаток -1

Равенство b*q + r = a по-прежнему выполняется, а остаток по модулю по-прежнему меньше делителя.


Конечно, если делимое и делитель положительные, то такой выбор остатка выглядит странновато. Но давайте поработаем с отрицательными числами:


11 / -4 = -2, остаток 3
11 / -4 = -3, остаток -1

Какой из этих вариантов правильный? На самом деле, оба. Просто существуют разные подходы к делению с остатком:


- деление с округлением к нулю;

- деление с округлением вниз;

- евклидово деление (привычное, как в математике).


Деление с округлением к нулю

«Округлить a к нулю» означает взять первое целое число, которое идёт на числовой прямой сразу после a по направлению к нулю.

Нюансы Python #2: деление и остаток Python, Программирование, Обучение, IT, Деление, Длиннопост

Давайте поделим 11 на -4 и -11 на 4. В обоих случаях получится -2.75. Если округлить к нулю, то будет -2.


Теперь посчитаем остаток. Из формулы b*q + r = a выводится, что r = a - b*q. В первом случае: r = 11 - (-4)*(-2) = 11 - 8 = 3, во втором случае: r = -11 - 4*(-2) = -11 - (-8) = -3.


То есть если мы округляем результат деления к нулю, то получаем следующую картину:


11 / -4 = -2, остаток 3
-11 / 4 = -2, остаток -3

При делении с округлением к нулю знак остатка всегда совпадает со знаком делимого, а от знака делителя вообще никак не зависит.


Деление с округлением вниз

«Округлить a вниз» означает взять первое целое число, которое идёт на числовой прямой сразу после a по направлению к минус бесконечности.

Нюансы Python #2: деление и остаток Python, Программирование, Обучение, IT, Деление, Длиннопост

Если мы округляем результат деления вниз, то получаем следующую картину:


11 / -4 = -3, остаток -1
-11 / 4 = -3, остаток 1

Теперь знак остатка совпадает со знаком делителя, а от знака делимого не зависит.


Евклидово деление

Это классический подход, который используется в математике. В нём остаток должен всегда быть положительным, а куда для этого нужно округлять неполное частное - уже не имеет значения.


11 / -4 = -2, остаток 3
-11 / 4 = -3, остаток 1

Какой подход используется в Python?

На интуитивном уровне многие считают, что деление нацело (оператор //) сводится к отбрасыванию дробной части. То есть из 2.4 получаем 2, а из -2.4 получаем -2. Это деление с округлением к нулю, и остаток считается соответствующим образом, то есть его знак совпадает со знаком делимого. Во многих языках, от Pascal до C#, используется именно этот подход.


Но создатель Python, Гвидо ван Россум, выбрал другой подход: результат целочисленного деления всегда округляется вниз. За использование деления с округлением вниз в информатике также выступал Дональд Кнут, известный математик и автор книги «Искусство программирования».


Соответственно, в Python -5 // 2 - это -3, а не -2. Знак остатка при этом совпадает со знаком делителя.

Почему именно деление с округлением вниз?

Всё дело в ситуациях, в которых на практике используются операторы // и %.


Например, представьте себе поле размером NxM пикселей. Оно разбито на блоки размером 4х4 точки каждый.

Нюансы Python #2: деление и остаток Python, Программирование, Обучение, IT, Деление, Длиннопост

Будем работать со следующими сущностями:

1. Координаты конкретной точки на поле, например, (-38, 11);

2. Номер конкретного блока. Например, блок (0, 0) - это тот, в левом нижнем углу которого находится начало координат. Справа от него блок с позицией (1, 0), а сверху - (0, 1);

3. Координаты точки внутри блока. Если ширина блока - 4х4, то координаты точки внутри блока могут меняться от (0, 0) (нижний левый угол) до (3, 3) (верхний правый угол).


И теперь представим, что у нас есть координаты какой-то точки на поле, например, (-38, 11). Как узнать, в каком блоке находится эта точка и какую конкретно позицию внутри блока она занимает? Довольно легко, если в языке используется деление с округлением вниз:

Нюансы Python #2: деление и остаток Python, Программирование, Обучение, IT, Деление, Длиннопост

Все результаты не влезли в скриншот, к сожалению. Запустить этот код онлайн можно здесь.


Обратите внимание на то, что с отрицательными координатами всё работает абсолютно корректно. А если бы использовалось деление с округлением к нулю, то для координат (-6, -8) мы получили бы некорректные результаты:

Координаты: (-6, -8)
Позиция блока: (-1, -2)
Позиция пикселя в блоке: (2, 0)

Очевидно, что координата x: -6 никак не может находиться в блоке, имеющем позицию x: -1, потому что ширина блока - 4 пикселя.

Какой подход лучше?

Любой.


Цель статьи не в том, чтобы сказать, что в Python используется хороший или плохой подход. Споры на тему того, как нужно правильно делить, идут уже давно, и навряд ли завершатся в обозримом будущем. Гвидо ван Россум и Дональд Кнут считают, что в программировании удобнее использовать деление с округлением вниз, а другие не менее именитые программисты могут считать, что лучше использовать деление с округлением к нулю или даже евклидово деление.


Поэтому просто запомните, что в Python при делении с остатком результат округляется в меньшую сторону, а не к нулю, и что остаток всегда имеет тот же знак, что и делитель.

Показать полностью 5
Python Программирование Обучение IT Деление Длиннопост
6
Grax1
2 года назад
Школьный уголок

Проблемы с делением⁠⁠

Сын считает уже достаточно хорошо в уме, сам себя перепроверяет (в т.ч. и на калькуляторе).

Сложение, умножение, вычитание - всё отлично, но с делением проблемы.
Что делать? Как побыстрее научить?


*В первый класс через неделю пойдёт. ;-)

Проблемы с делением Школа, Математика, Обучение, Деление, Длиннопост
Проблемы с делением Школа, Математика, Обучение, Деление, Длиннопост
Проблемы с делением Школа, Математика, Обучение, Деление, Длиннопост
Показать полностью 3
[моё] Школа Математика Обучение Деление Длиннопост
41
64
mberkut
mberkut
2 года назад

Делим на равные части⁠⁠

TikTok Деление Лайфхак Проще Видео Вертикальное видео
21
84
moredarker
moredarker
3 года назад
IT-юмор

Питонисты vs сишники⁠⁠

Питонисты vs сишники
[моё] Python C++ Деление Остаток Программирование Математика Картинка с текстом
19
6679
DenimDef
DenimDef
3 года назад
Скриншоты комментов
Серия Screen

Точность - вежливость королей⁠⁠

Точность - вежливость королей
Картинка с текстом Детство Справедливость Шоколад Сникерс Атом Воспоминания из детства Деление
236
Eshkobar
Eshkobar
3 года назад

Типа головоломка⁠⁠

Типа головоломка Загадка, Задача, Арифметика, Умножение, Деление, Математика
Показать полностью 1
Загадка Задача Арифметика Умножение Деление Математика
51
1634
Lormy
Lormy
3 года назад
Юмор для всех и каждого

Прям как я⁠⁠

Ленивый калькулятор

Прям как я Картинка с текстом, Мемы, Калькулятор, Лень, Деление
Показать полностью 1
Картинка с текстом Мемы Калькулятор Лень Деление
41
Партнёрский материал Реклама
specials
specials

Сколько кнопок было на вашем тамагочи: три или четыре?⁠⁠

Четыре — это на богатом, три — это на каноничном. В нашем тамагочи, конечно, три. Заходите в игру и вырастите очаровательную квокку.

Игры Тамагочи Награда Ностальгия
18
Pensive.horse
Pensive.horse
3 года назад

Довольно-таки не неприятный факт, но Скелетору виднее⁠⁠

Довольно-таки не неприятный факт, но Скелетору виднее Комментарии на Пикабу, Деление, Математика, Длиннопост
Довольно-таки не неприятный факт, но Скелетору виднее Комментарии на Пикабу, Деление, Математика, Длиннопост
Довольно-таки не неприятный факт, но Скелетору виднее Комментарии на Пикабу, Деление, Математика, Длиннопост
Довольно-таки не неприятный факт, но Скелетору виднее Комментарии на Пикабу, Деление, Математика, Длиннопост

#comment_224028072

Показать полностью 4
Комментарии на Пикабу Деление Математика Длиннопост
3
Посты не найдены
О нас
О Пикабу Контакты Реклама Сообщить об ошибке Сообщить о нарушении законодательства Отзывы и предложения Новости Пикабу Мобильное приложение RSS
Информация
Помощь Кодекс Пикабу Команда Пикабу Конфиденциальность Правила соцсети О рекомендациях О компании
Наши проекты
Блоги Работа Промокоды Игры Курсы
Партнёры
Промокоды Биг Гик Промокоды Lamoda Промокоды Мвидео Промокоды Яндекс Директ Промокоды Отелло Промокоды Aroma Butik Промокоды Яндекс Путешествия Постила Футбол сегодня
На информационном ресурсе Pikabu.ru применяются рекомендательные технологии