Деление — стандартная математическая операция в любом языке программирования, и Python не исключение. Однако в Python 2 существует только один тип деления, называемый целочисленным делением.
В общем, определение деления (/) в Python зависело исключительно от аргументов. Например, в Python 2.7 деление 11/4 равнялось 2, потому что оба аргумента были целыми числами.
Однако 20.0/7 будет генерировать 2,857142857142857 на выходе, потому что аргументы были числами с плавающей запятой.
Приведенное выше определение ‘/’ часто вызывало проблемы для приложений, в которых использовались типы данных, которые автор не ожидал.
В данном руководстве рассмотрим операторы деления в Python.
Виды деления в Python
Python 3 имеет два вида деления:
- Integer Division( // ) — целочисленное деление
- Float Division( / ) — деление с плавающей запятой
Стандартный символ деления(/) работает по-разному в Python 3 и Python 2 при применении к целым числам. Например, при делении целого числа на другое целое число в Python 3 операция деления x/y представляет собой истинное деление(использует метод __truediv__) и дает результат с плавающей запятой.
Между тем, та же операция в Python 2 представляет собой классическое деление, которое округляет результат до отрицательной бесконечности(также известное как «floor»).
Python float division
Python 3 предоставляет оператор ‘/’, который выполняет деление с плавающей запятой как для аргументов типа int, так и для аргументов с плавающей запятой.
|
1 |
print(42 / 2) |
Вывод:
|
1 |
21.0 |
Вы можете видеть, что вывод находится в формате с плавающей запятой. Это связано с тем, что во времена Python 2, когда вы делили одно целое число на другое целое число, несмотря ни на что, результатом всегда было бы целое число.
Теперь давайте посмотрим на следующий код.
|
1 |
print(41 / 2) |
Вывод:
|
1 |
20.5 |
Теперь мы разделили 2 на нечетное число, поэтому получили значение с плавающей запятой.
В Python 2
В Python 2.2 или более поздних версиях в строке 2.x нет разницы для целых чисел, если только вы не выполняете деление импорта from __future__, что приводит к тому, что Python 2.x принимает поведение 3.x.
Чтобы уточнить для строки Python 2.x, / не является ни floor division, ни true division. Принятый в настоящее время ответ не ясен. / является floor division, когда оба аргумента являются целыми, но является true division, когда один или оба аргумента являются плавающими.
|
1 2 3 |
from operator import truediv, floordiv print(truediv(10, 8) == 1.25) # equivalent to `/` in Python 3 print(floordiv(10, 8) == 1) |
Вывод:
|
1 2 |
True True |
Целочисленное деление Python
Поскольку Python не объявляет типы данных заранее, вы никогда не знаете, когда хотите использовать целые числа, а когда хотите использовать число с плавающей запятой. Кроме того, поскольку числа с плавающей запятой теряют точность, не рекомендуется использовать их в интегральных вычислениях.
Чтобы решить эту проблему, будущие модули Python будут включать новый тип деления, называемое целочисленным делением, задаваемым оператором нижнего деления(//).
Теперь / выполняет деление с плавающей запятой, а // выполняет целочисленное деление.
В Python 3 вы можете выполнять целочисленное деление с помощью оператора(//).
|
1 |
print(42 // 2) |
Вывод:
|
1 |
21 |
Вы можете видеть, что возвращаемое значение является целым числом, а не числом с плавающей запятой.
Теперь давайте разделим нечетное значение на 2 и посмотрим на результат.
|
1 |
print(41 // 2) |
Вывод:
|
1 |
20 |
Здесь вы можете видеть, что оно округляется до 20. Это потому, что деление с плавающей запятой округляется до ближайшего целого числа.
Деление с отрицательными значениями
Некоторые другие языки программирования используют округление до нуля(усечение), а не округление до отрицательной бесконечности, как это делает Python(т. е. в этих языках -3 / 2 == -1). Такое поведение может создать путаницу при переносе или сравнении кода.
|
1 |
print(-3 // 2) |
Вывод:
|
1 |
-2 |
Если мы попробуем деление с плавающей запятой, то вы увидите другие результаты.
|
1 |
print(-3 / 2) |
Вывод:
|
1 |
-1.5 |
Заключение
Если вам нужно число с плавающей запятой в результате деления, вы можете использовать деление с плавающей запятой( / ), или если вы хотите целочисленное деление, вы можете использовать оператор( // ) в Python. Вы должны позаботиться о преобразовании типов данных в длинной программе, чтобы избежать ошибок или неожиданного поведения.
