Есть ли преимущество в использовании одного над другим? В Python 2 они оба возвращают те же результаты:
>>> 6/3
2
>>> 6//3
2
Есть ли преимущество в использовании одного над другим? В Python 2 они оба возвращают те же результаты:
>>> 6/3
2
>>> 6//3
2
В Python 3.0 возвращается 5 / 2
2.5
и 5 // 2
вернет 2
. Первый представляет собой деление с плавающей запятой, а последнее - разделение полов, иногда также называемое целочисленным делением.
В Python 2.2 или более поздней версии в строке 2.x нет разницы для целых чисел, если вы не выполняете from __future__ import division
, что заставляет Python 2.x принимать поведение 3.0
Независимо от будущего импорта, 5.0 // 2
вернет 2.0
, так как это результат операции разделения пола.
Подробное описание вы можете найти на https://docs.python.org/whatsnew/2.2.html#pep-238-changing-the-division-operator
Это помогает уточнить для строки Python 2.x, /
не является ни разделением полов, ни истинным делением. Нынешний принятый ответ на это не ясен. /
- это разделение полов, когда оба args являются int, но являются истинным делением, когда один или оба аргумента являются float.
Вышеизложенное говорит намного больше правды и намного понятнее второго абзаца в принятом ответе.
//
реализует "разделение полов" независимо от вашего типа. Так
1.0/2.0
даст 0.5
, но оба 1/2
, 1//2
и 1.0//2.0
будут давать 0
.
Подробнее см. https://docs.python.org/whatsnew/2.2.html#pep-238-changing-the-division-operator
/ → Деление с плавающей запятой
// → Отдел пола
Давайте рассмотрим некоторые примеры как в python 2.7, так и в Python 3.5.
Python 2.7.10 vs. Python 3.5
print (2/3) ----> 0 Python 2.7
print (2/3) ----> 0.6666666666666666 Python 3.5
Python 2.7.10 vs. Python 3.5
print (4/2) ----> 2 Python 2.7
print (4/2) ----> 2.0 Python 3.5
Теперь, если вы хотите иметь (в python 2.7) тот же вывод, что и в python 3.5, вы можете сделать следующее:
Python 2.7.10
from __future__ import division
print (2/3) ----> 0.6666666666666666 #Python 2.7
print (4/2) ----> 2.0 #Python 2.7
Где нет различий между делением пола как в python 2.7, так и в Python 3.5
138.93//3 ---> 46.0 #Python 2.7
138.93//3 ---> 46.0 #Python 3.5
4//3 ---> 1 #Python 2.7
4//3 ---> 1 #Python 3.5
Как все уже ответили, //
- это разделение полов.
Почему это важно, так это то, что //
однозначно разделяет пол, во всех версиях Python от 2.2, включая версии Python 3.x.
Поведение /
может меняться в зависимости от:
__future__
импорт или нет (модуль-локальный)-Q old
, либо -Q new
>>> print 5.0 / 2
2.5
>>> print 5.0 // 2
2.0
Python 2.7 и другие будущие версии python:
/
)Делит левый операнд на правый операнд
Пример: 4/2 = 2
//
)Разделение операндов, где результатом является частное, в котором удаляются цифры после десятичной точки. Но если один из операндов отрицателен, результат получается беспорядочным, то есть округляется от нуля (в сторону отрицательной бесконечности):
Примеры: 9//2 = 4
и 9.0//2.0 = 4.0
, -11//3 = -4
, -11.0//3 = -4.0
Операторы /
Division и //
Floor Division работают одинаково.
Двойная косая черта //
- это разделение полов:
>>> 7//3
2
Пожалуйста, обратитесь Проблема с целым подразделением по причине введения оператора //
для выполнения целочисленного деления.
В этом ответе я расскажу не только ответ, но и преимущества //.
Большинство из вас, кто использует Python, должны знать об операторе деления пола (//) в Python. Для тех, кто не знает, этот оператор возвращает минимальное значение после деления. Например: 5/2 = 2,5, но 5//2 = 2 (2 - минимальное значение 2,5)
Но оператор деления обычно ведет себя ненормально для чисел больше 10 ^ 17.
x = 10000000000000000000006
if x / 2 == x // 2:
print("Hello")
else:
print("World")
Для приведенного выше кода World будет напечатан, а не Hello. Это связано с тем, что 10000000000000000000006/2 вернет 5e + 21, но 10000000000000000000006//2 вернет правильный ответ 5000000000000000000003. Даже int (10000000000000000000006/2) вернет 5000000000000000000000, что неверно.
Поэтому, даже если вы хотите разделить большие числа, используйте оператор //.
Например: если вы хотите найти сумму первых 100000000000000000000000010002 с формулой: n (n + 1)/2, обычный оператор деления (/) даст вам неправильный ответ, а оператор//даст вам правильный ответ.
//
- это разделение полов, оно всегда даст вам целое число результата. Другой - "регулярное" деление.
Ответ уравнения округляется до следующего меньшего целого числа или float с .0 как десятичная точка.
>>>print 5//2
2
>>> print 5.0//2
2.0
>>>print 5//2.0
2.0
>>>print 5.0//2.0
2.0
Приведенные выше ответы являются хорошими. Я хочу добавить еще один момент. До некоторых значений оба они приводят к одному и тому же частному. После этого оператор деления этажа (//
) работает нормально, но не оператор деления (/
).
- > int(755349677599789174/2)
- > 377674838799894592 #wrong answer
- > 755349677599789174 //2
- > 377674838799894587 #correct answer
//
деление по этажам, оно всегда даст вам минимальное значение результата./
является деление с плавающей точкой. Ниже приведены различия между /
и //
; Я выполнил эти арифметические операции в Python 3.7.2
>>> print (11 / 3)
3.6666666666666665
>>> print (11 // 3)
3
>>> print (11.3 / 3)
3.7666666666666667
>>> print (11.3 // 3)
3.0
5.0//2
приводит к 2.0
, а не к 2
потому что тип возвращаемого значения оператора //
следует правилам приведения (преобразования типов) в python.
Python способствует преобразованию младшего типа данных (целое число) в более высокий тип данных (число с плавающей запятой), чтобы избежать потери данных.