Какие языки программирования, кроме Python, имеют разделение этажей как один оператор с точки зрения программистов? Почему оно вообще существует? Пожалуйста, не давайте мне ответ, потому что это возможно!
Сначала я поискал это в Google, но большинство результатов сводятся к одному и тому же с помощью комбинации оператора и вызова функции. Да!
@KonradRudolph Спасибо, но нет, это не тот ответ, которого я жду.
@KonradRudolph Я сомневаюсь, что большинство языков так делают. Можете ли вы назвать некоторые?
@nocomment C, C++, C#, Java и т. д. Мне следовало уточнить, что под «большинством» я имею в виду статически типизированные языки. Большинство динамически типизированных языков, вероятно, этого не делают.
@KonradRudolph Как это выглядит на Java? Я попробовал (-11) / 10
там и это дало -1
, а не -2
.
@nocomment О, это действительно хороший момент, я мысленно заменил «поэтажное деление» на «целочисленное деление», что, очевидно, не одно и то же. Теперь мне любопытно, действительно ли ОП действительно интересовался делением этажей, а не целочисленным делением.
Мы здесь обычно не просим список вещей, и это не очень продуктивно. Есть ли у вас более практический вопрос, на который можно ответить по этому поводу?
@deceze Судя по всему, списка пока нет. Это больше похоже на отсутствие. Также на момент публикации этого комментария не дан ответ на вопрос о его существовании.
Вот PEP Python, в котором представлен оператор деления этажей //
(возможно, это «самый официальный документ Python» по этой теме): peps.python.org/pep-0238 – он дает некоторое обоснование того, почему этот оператор представил. Вам это помогло или вы уже это нашли?
Немного справочной информации (я не знаю, как долго вы программируете на Python): до Python 2 включительно деление давало разные результаты в зависимости от того, были ли разделены целые числа или числа с плавающей запятой (например, 3/2 == 1
против 3./2. == 1.5
). Это было немного неожиданное поведение, учитывая, что Python обычно не особо заботится о числовых типах. Предоставление явного оператора деления нижнего предела помогает решить эту проблему: в Python 3, независимо от того, заданы ли целые числа или числа с плавающей запятой, /
всегда обеспечивает истинное деление. Чтобы сохранить поведение целочисленного деления Python 2, можно использовать //
.
@KonradRudolph Я имел в виду одного, а не ни одного. Виноват.
@nocomment Когда я говорил о двух операторах, я на самом деле имел в виду оператор и вызов функции. Я отредактировал вопрос.
@simon Я думаю, тебе следует переместить комментарий в ответ.
@KonradRudolph Я думаю, тебе следует поставить %/% в качестве ответа, чтобы я мог хотя бы проголосовать за него.
Вот частичный ответ, касающийся второй части вопроса: почему [явный оператор разделения этажей //
] вообще существует [в Python]? По сути, это краткое изложение соответствующих частей PEP 238, моими словами.
Вплоть до Python 2.X включительно деление с помощью оператора деления /
давало разные результаты в зависимости от того, были ли разделены значения целочисленных типов или типов с плавающей запятой (например, 3.0/2.0 == 1.5
; но 3/2 == 1
аналогично целочисленному делению, например, в C/C++, по крайней мере для положительные числа). Это было немного удивительное поведение, учитывая, что Python обычно не особо заботится о типах чисел (например, sqrt(2.0) == sqrt(2)
). Более того, в ситуациях, когда пользователь фрагмента кода Python контролировал типы входных данных для разделения, программисту этого фрагмента кода было очень утомительно следить за тем, чтобы использовалось предполагаемое разделение, что облегчало создать потенциальную ошибку (например, если программист функции неявно ожидал ввода с плавающей запятой и, следовательно, «истинного» деления, но пользователь функции предоставил целые числа, результат может быть совершенно неверным).
Таким образом, PEP 238 предложил путь разрешения этой далеко не идеальной ситуации, который был принят в спецификацию языка Python:
//
, позволяющий всегда вести себя так, как если бы в качестве входных данных для деления были предоставлены целые числа. Оператор деления /
на данный момент сохранил оригинальное (то есть неоднозначное/неинтуитивное) поведение. Однако, используя from __future__ import division
поверх своего модуля, программисты уже могли ввести другое поведение; а именно, всегда получать «истинное» деление с /
внутри своего модуля, независимо от того, были ли в качестве входных данных заданы целые числа или числа с плавающей запятой./
теперь всегда обеспечивает «истинное» деление. Чтобы сохранить поведение целочисленного деления Python 2, //
все еще можно использовать.Как уже было сказано, это всего лишь краткое изложение ПЭП моими словами. Для получения дополнительной информации я бы предложил прочитать исходный документ, ссылку на который я дал выше. Написано действительно хорошо и более подробно. Например, здесь также обсуждаются потенциальные (отклоненные) альтернативы разрешению предыдущего поведения оператора /
.
Большинство языков делают это при вызове целочисленных операндов. Но я думаю, это не тот ответ, который вы ищете. — В R есть специальный оператор, очень похожий на Python (
%/%
).