Я читаю http://learnpythonthehardway.org/book/ex37.html, но я не понимаю, что делает символ //=
. /=
имеет смысл для меня:Что делает // = в python?
a = 9
a /= 3
a == 3 # => True
Но //=
a = 9
a //= 3
a == 3 # => Also True
Спасибо.
Я читаю http://learnpythonthehardway.org/book/ex37.html, но я не понимаю, что делает символ //=
. /=
имеет смысл для меня:Что делает // = в python?
a = 9
a /= 3
a == 3 # => True
Но //=
a = 9
a //= 3
a == 3 # => Also True
Спасибо.
//
работает как «целочисленное разделение» в python3, взгляните на this answer.
В C раздел с /
на целые числа работает как «разделение с полом» или «целочисленное разделение». Для обеспечения этой возможности python предоставляет оператор //
, в отличие от /
, который даст результат с плавающей запятой.
Официальная ссылка, безусловно, pep-238.
С версии командной строки (полезно, когда вы пытаетесь понять, что-то вроде этого):
Python 3.2.3 (default, Apr 11 2012, ...
Type "help", "copyright", "credits" or "license" for more information.
>>> a = 10
>>> a/3
3.3333333333333335
>>> a//3
3
>>>
/
, как вы знаете, делает классическое разделение. //
оператор был добавлен в Python 2.2, который делает этажное подразделение, и с добавлением этого оператора вы можете использовать from __future__ import division
, чтобы сделать /
оператором do true
подразделением.
a //= 3
эквивалентен a = a // 3
.
Итак, вот резюме:
Python Version operator/ operator //
-------------------------------------------------
2.1x and older classic Not Added
2.2 and newer classic floor
(without import)
2.2 and newer true floor
(with import)
//
является пол деление: он делит и округляет вниз, хотя она по-прежнему производит поплавок, если операнды поплавки. В Python 2 это то же самое, что и регулярное деление для целых чисел, если вы не используете from __future__ import division
, чтобы получить «истинное» поведение деления Python 3.
Итак, да, это немного сложно. По существу он существует, чтобы воссоздать поведение, которое вы получаете в Python 2, разделив два целых числа, поскольку это изменяется в Python 3.
В Python 2:
11/5
→ 2
11.0/5.0
→ 2.2
11 // 5
→ 2
11.0 // 5.0
→ 2.0
В Python 3, или Python 2 с from __future__ import division
, или Python 2 запустить с -Q new
:
11/5
→ 2.2
11.0/5.0
→ 2.2
11 // 5
→ 2
11.0 // 5.0
→ 2.0
И, конечно же, добавление =
просто превращает его в оператор сочетания, такой как /=
.
Для nitpick это эквивалентно 'a = a .__ ifloordiv __ (3)', если этот метод определен (см. Http://docs.python.org/2/reference/datamodel.html#object.__ifloordiv__). Я думаю, что некоторые типы (возможно, массивы NumPy?) Переопределяют этот оператор, чтобы действовать на месте. Тем не менее, это редко имеет значение. – delnan
@delnan - для типов, которые изменяются, api ожидает, что он действует на месте, хотя на самом деле это не так. – mgilson