Ціле ділення Python дає поплавок


223
Python 3.1 (r31:73574, Jun 26 2009, 20:21:35) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> 2/2
1.0

Це призначено? Я сильно пам'ятаю, як верталися попередні версії int/int=int? Що мені робити, чи є новий оператор поділу чи я повинен завжди робити це?


31
Так, поділ працює в 3.x.
hughdbrown

2
Ось допис автора творчості Python, який розповідає про те, як працює округлення, він є ортогональним для вашого запитання, але мені це було цікаво: python-history.blogspot.com/2010/08/…
Aaron D

@hughdbrown так що по суті означає для всіх версій python 3?
Чарлі Паркер

@hughdbrown: так, PEP є остаточним , тобто , як прийнято та здійснено.
Йонас Бистрем

Відповіді:


285

Погляньте на PEP-238 : Зміна оператора відділу

// Оператор буде доступний для однозначного запиту про поділ підлоги.


10
@JonathanSternberg за винятком всього коду, який був написаний для python 2.0. Я відчуваю, що роль / і // слід змінити, щоб зберегти зворотну сумісність. Крім того, майже у всіх інших мовах / типів збереження. я мав би більше сенсу, ніж для // автоматично перетворювати в плавати, а не /.
thang

1
Друга частина (після "Також") має сенс (схожість з іншими мовами), але стосовно першої частини вся точка Python 3 повинна була НЕ бути назад сумісною з Python 2, а скоріше виправити купу проблем з Python 2. Достатньо людей визнали неоднозначність /достатньою для "мовної конструкції" помилки, яку потрібно було виправити в Python 3. Це може бути суперечливим рішенням, але достатньо людей вважає, що це правильне. Порахуйте мене в групі, яка любить зміни. Приємно, що ми всі можемо погодитись. Ура. :)
Ray Toal

59

Ой, негайно знайдено 2//2.


5
Не могли б ви детальніше?
blueFast

4
Використовуючи це, виведете int, а не float @dangonfast.
Ашиш Ахуджа

Це, здається, не працює для від'ємних чисел. -1 // 5 повернення -1 і -5 // 5 повернення -1.
mschuett

@mschuett: цього варто очікувати, і це такий же результат, як і для Python 2.
Jonas

1
Так, я ще трохи копав і виявив це. Однак я думаю, що пристойна кількість людей не усвідомлює цього в залежності від мови, з якої вони походять.
mschuett

45

Сподіваюся, це може допомогти комусь миттєво.

Поведінка оператора відділу в Python 2.7 та Python 3

У Python 2.7: за замовчуванням оператор поділу поверне цілий вихід.

щоб отримати результат у подвійному кратному 1,0 на "дивіденд або дільник"

100/35 => 2 #(Expected is 2.857142857142857)
(100*1.0)/35 => 2.857142857142857
100/(35*1.0) => 2.857142857142857

У Python 3

// => used for integer output
/ => used for double output

100/35 => 2.857142857142857
100//35 => 2
100.//35 => 2.0    # floating-point result if divsor or dividend real

1
До речі, не потрібно множувати на 1,0. Досить, що одне з чисел - поплавок. Наприклад, 100 / 35.0 = 100.0 / 35 = 2.857142857142857
Тал Дж. Леві

21

У прийнятій відповіді вже згадується PEP 238 . Я просто хочу додати швидкий погляд за лаштунками для тих, хто цікавиться тим, що відбувається, не читаючи цілого PEP.

Python карти операторів , як +, -, *і /до спеціальних функцій, таким чином, що , наприклад , a + bеквівалентно

a.__add__(b)

Що стосується поділу в Python 2, то за замовчуванням існує лише те, на /яке відображається, __div__а результат залежить від типів введення (наприклад int, float).

Python 2.2 представив __future__функцію division, яка змінила семантику поділу наступним чином (TL; DR PEP 238):

  • /карти, до __truediv__яких має "повернути розумне наближення математичного результату поділу" (цитата з PEP 238)
  • //карти в __floordiv__, які повинні повернути floored результат/

З Python 3.0 зміни PEP 238 стали поведінкою за замовчуванням, і більше немає спеціального методу __div__в об'єктній моделі Python.

Якщо ви хочете використовувати один і той же код у Python 2 та Python 3, використовуйте

from __future__ import division

і дотримуватися PEP 238 семантики /та //.


0

Згідно з документацією Python3, python, розділений на ціле число, генерує float, незважаючи на те, що очікується, що буде цілим.

Для виключно цілого друку використовуйте floor division method. Поділ підлоги округляється до нуля і видаляється десяткової крапки.Represented by //

Отже, замість 2/2 використовуйте 2//2

Ви також можете імпортувати поділ __future__незалежно від використання python2 або python3.

Сподіваюся, це допомагає!

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