Яка різниця між '/' та '//' при використанні для поділу?


473

Чи є користь від використання одного над іншим? У Python 2 вони, схоже, повертають однакові результати:

>>> 6/3
2
>>> 6//3
2

1
Будь ласка, зверніться до Проблеми з// цілим поділом для причини введення оператора до цілого поділу.
Шрірам

Відповіді:


649

У Python 3.x 5 / 2повернеться 2.5і 5 // 2повернеться 2. Перший - це поділ з плаваючою комою, а останній - поділ на підлогу , іноді його також називають цілим поділом .

У Python 2.2 або пізнішої версії в рядку 2.x немає різниці для цілих чисел, якщо ви не виконаєте a from __future__ import division, що спричиняє Python 2.x прийняти поведінку 3.x.

Незалежно від майбутнього імпорту, 5.0 // 2повернеться, 2.0оскільки це результат підрозділу підлоги.

Детальний опис можна знайти на веб-сторінці https://docs.python.org/whatsnew/2.2.html#pep-238-changing-the-division-operator


відредаговано: Ви можете «виправити» поділ з Python 2.2! (Просто читайте пов'язаний PEP)
u0b34a0f6ae

2
також python -Qnew. інші варіанти розподілу: -Qold( по замовчуванню), -Qwarn,-Qwarnall
Джон Ла Роого

2
Варто зазначити, що 5.0 / 2повертається 2.5у всіх версіях, як і 5 / 2.0- стара поведінка відрізняється лише тоді, коли є обидва операнди int.
Кріс

2
Що робити, коли цифри від’ємні? Чи однакова поведінка для від'ємних цілих чисел?
Аарон Франке

1
@Srinivasu Ваш приклад не корисний. Краще було б 5 // 2 (що дає 2) і -5 // 2 (що дає -3).
Марвін

67

Пояснення Python 2.x:

Щоб уточнити лінію Python 2.x, / це не поділ підлоги, ані справжній поділ. Поточна прийнята відповідь на це не зрозуміла.

/це поділ на підлогу, коли обидва аргументи є int, але це істинне поділ, коли один або обидва аргументи єfloat .

Сказане розповідає більше правди і є більш зрозумілим, ніж 2-й абзац у прийнятій відповіді.


33

//реалізує "поділ підлоги", незалежно від вашого типу. Так 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 подробиці


Це хороша відповідь. Корисна посилання PEP. Крім того, подумайте про використання math.floor()або math.fmod()якщо ви не впевнені, що відбувається з одинарними операторами.
Скотт Лоурі

/і //є бі-ні краплі операторів (два операнда, лівий і правий, чисельник і знаменник)
іоносферні

28

/ -> Поділ з плаваючою комою

// -> Поділ підлоги

Розглянемо приклади як в python 2.7, так і в Python 3.5.

Python 2.7.10 проти Python 3.5

print (2/3)  ----> 0                   Python 2.7
print (2/3)  ----> 0.6666666666666666  Python 3.5

Python 2.7.10 проти Python 3.5

  print (4/2)  ----> 2         Python 2.7
  print (4/2)  ----> 2.0       Python 3.5

Тепер, якщо ви хочете мати (у python 2.7) такий же вихід, як у python 3.5, ви можете зробити наступне:

Пітон 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

це те саме, що int (5/2)?
PirateApp

Що робити, коли цифри від’ємні? Чи однакова поведінка для від'ємних цілих чисел?
Аарон Франке

1
Re: Негативи - поведінка однакова, але пам’ятайте, що результат - це підлога, тому округлення завжди знижується до більш негативного . Деякі приклади: -100 // 33=> -4 ; 100 // -33=> -4 ; але через напрямок округлення підлоги функціонал наступний може здатися протиінтуїтивним порівняно з попереднім: -100 // -33=> 3 .
Erdős-Bacon

22

Як уже всі відповіли, // це поділ підлоги.

Чому це важливо, це те, що // це однозначно поділ підлоги у всіх версіях Python з 2.2, включаючи версії Python 3.x.

Поведінка /може змінюватися залежно від:

  • Активний __future__імпорт чи ні (локальний модуль)
  • Параметр командного рядка Python, -Q oldабо-Q new


5

Python 2.7 та інша майбутня версія python:

  • Відділ ( /)

Лівий операнд ділиться на операнд правого

Приклад: 4 / 2 = 2

  • Підрозділ ( //)

Поділ операндів, де результатом є коефіцієнт, у якому цифри після десяткової точки видаляються. Але якщо один з операндів від'ємний, результат посилається, тобто округляється від нуля (до негативної нескінченності):

Приклади: 9//2 = 4і 9.0//2.0 = 4.0, -11//3 = -4,-11.0//3 = -4.0

І /дивізіон, і //оператор підрозділу підлоги працюють аналогічно.


2
До нескінченності та від нуля - це різні речі. Приклад для (-1.2 та 3.4): "підлога" спрямована до негативної нескінченності (-2 і 3), "обрізання" - до нуля (-1 і 3), "насичення" - від нуля (-2 і 4), а "стеля" спрямована на позитивну нескінченність (-1 і 4).
Phernost


3

//це поділ підлоги, він завжди дасть вам цілий рівень результату. Інший - «регулярний» поділ.


2

Відповідь рівняння округляється до наступного меншого цілого чи плаваючого знака .0 у вигляді десяткової крапки.

>>>print 5//2
2
>>> print 5.0//2
2.0
>>>print 5//2.0
2.0
>>>print 5.0//2.0
2.0

2

Наведені вище відповіді хороші. Я хочу додати ще один момент. До деяких значень обидва вони призводять до одного коефіцієнта. Після цього оператор ділення підлоги ( //) працює нормально, але не /оператор поділу ( ).

 - > int(755349677599789174/2)
 - > 377674838799894592      #wrong answer
 - > 755349677599789174 //2
 - > 377674838799894587      #correct answer

-1

5.0//2призводить до 2.0, а не 2тому, що тип повернення значення, що повертається з// оператора дотримується правил примусу python (тип кастингу).

Python сприяє перетворенню нижчого типу даних (цілого) у вищий тип даних (float), щоб уникнути втрати даних.


-1
  • // це поділ підлоги, він завжди надасть вам значення підлоги результату.
  • А інший /- поділ з плаваючою комою.

Далі - різниця між /та //; Я виконував ці арифметичні операції в 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

2
Як ця відповідь додає все, що не стосується інших ідей? Або як ця відповідь краще будь-яким чином, ніж інші відповіді?
Rory Daulton

2
Далі наведено вихід програми. Це нічого не пояснює.
Маркіз Лорн
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.