Различие между реализацией модуля в Python по сравнению с Java

Я заметил отличающиеся реализации оператора модуля в Python и Java.

Например, в Python:

>>> print -300 % 800
>>> 500

Принимая во внимание, что в Java:

System.out.println(-300 % 800);
-300

Это застало меня врасплох, так как я думал что-то столь основное, как модуль универсально интерпретировался тот же путь. Я - поклонник интерпретации Python (который я предполагаю, одолжен от C), хотя я вижу логику позади реализации Java.

Который Вы обычно предпочитаете? Есть ли какая-либо определенная причина отличающихся интерпретаций? У меня нет намерения запустить войну языка, просто любопытную.

14
задан Cerin 7 February 2010 в 00:16
поделиться

4 ответа

Я предпочитаю интерпретацию языка C (также используемую в Python), где % действительно является оператором модуля. Хорошее обсуждение на странице википедии и ссылках на нее (включая один бит о том, почему принятие вместо знака дивиденда может привести к одной глупой ошибке, если не соблюдать осторожность ;-).

6
ответ дан 1 December 2019 в 15:12
поделиться

Подробные данные зависят от реализации, но обычно результаты буферизуются. Выполнение запроса к базе данных вернет некоторый результирующий набор. Если он достаточно мал, все результаты могут быть возвращены с начальным вызовом или некоторые из них могут быть и больше результатов возвращаются по мере итерации над объектом результата.

Подумайте о последовательности следующим образом:

  1. Вы открываете соединение с базой данных;
  2. Возможно, есть второй вызов для выбора базы данных или это может быть сделано в рамках (1);
  3. Этот этап аутентификации и соединения представляет собой (по крайней мере) один двухсторонний переход к серверу (игнорирование постоянных соединений);
  4. Вы выполняете запрос на клиенте;
  5. Этот запрос отправляется на сервер;
  6. Сервер должен определить, как выполнить запрос;
  7. Если сервер ранее выполнил запрос, план выполнения все еще может находиться в кэше запросов. Если не должен быть создан новый план;
  8. Сервер выполняет запрос как заданный и возвращает результат клиенту;
  9. Этот результат будет содержать некоторый буфер строк, зависящий от реализации. Это может быть не более 100 строк. Все столбцы возвращаются для каждой строки;
  10. По мере получения большего количества строк клиент будет запрашивать у сервера больше строк. Это может быть когда клиент заканчивается или это может быть сделано превентивно. Опять же, это зависит от реализации.

Идея всего этого состоит в том, чтобы свести к минимуму обратную связь с сервером, не возвращая слишком много ненужных данных, поэтому, если вы попросите миллион строк, вы не получите их все сразу.

clauses LIMIT - или любое предложение в факте - изменит результирующий набор.

Наконец, (7) является важным, поскольку SELECT * FROM table WHERE a = 'foo' и SELECT * FROM table WHERE a = 'bar' являются двумя различными запросами в отношении оптимизатора базы данных, поэтому план выполнения должен быть определен для каждого отдельно. Но параметризованный запрос ( SELECT * FROM table WHERE a =: param ) с различными параметрами является одним запросом и должен планироваться только один раз (по крайней мере, до тех пор, пока он не выпадет из кэша запросов).

-121--4617172-

На первый вопрос можно ответить, прочитав ресурсы

Так как Вы «*», каждый столбец возвращается для каждого mysql_fetch_object вызова. Просто посмотрите на print_r ($ row), чтобы увидеть.

-121--4617174-

Я предпочитаю x mod n давать числа между 0 и n-1 или между этажом (n/2) -n и полом (n/2); это облегчает математику в голове.

Пока все равноценно, мне все равно, когда речь идет о языках - хотя нужно знать о конвенции.

Между прочим, Java не может полностью составить свое мышление -% на отрицательных целых числах возвращает отрицательное значение, mod метод java.math.BigInteger возвращает значения между 0 и n-1 (включительно),и метод divideAndRemainder снова возвращает отрицательные величины для отрицательных целых чисел.

0
ответ дан 1 December 2019 в 15:12
поделиться

Теперь попробуйте следующее:

>>> print 300 % -800
-500

Причина разницы в том, что дизайнеры языка, кажется, не могут решить, должен ли остаток после деления иметь знак дивиденда или делитель . Некоторые языки даже не указывают тот или иной, так что это зависит от реализации.

На странице Википедии Операция Modulo есть список языков, оператор, и какой знак ожидать. Это хорошее место для начала, но я обычно просто запускаю несколько простых тестов, чтобы убедиться, что я точно знаю, как будет себя вести %, прежде чем использовать его на любом языке, на котором я его раньше не тестировал.

3
ответ дан 1 December 2019 в 15:12
поделиться

В стандарте C отрицательный модулор не определен, и многие компиляторы C дадут вам то же, что и Java. Однако в python вы всегда получите положительное число, что часто более полезно, потому что это означает, что вы можете выполнять сложение и вычитание по модулю. Если бы отрицательный модулор давал отрицательное число, он бы не работал должным образом.

Я понятия не имею, какие преимущества дает получение отрицательного числа по модулю.

1
ответ дан 1 December 2019 в 15:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: