Я заметил отличающиеся реализации оператора модуля в Python и Java.
Например, в Python:
>>> print -300 % 800
>>> 500
Принимая во внимание, что в Java:
System.out.println(-300 % 800);
-300
Это застало меня врасплох, так как я думал что-то столь основное, как модуль универсально интерпретировался тот же путь. Я - поклонник интерпретации Python (который я предполагаю, одолжен от C), хотя я вижу логику позади реализации Java.
Который Вы обычно предпочитаете? Есть ли какая-либо определенная причина отличающихся интерпретаций? У меня нет намерения запустить войну языка, просто любопытную.
Я предпочитаю интерпретацию языка C (также используемую в Python), где %
действительно является оператором модуля. Хорошее обсуждение на странице википедии и ссылках на нее (включая один бит о том, почему принятие вместо знака дивиденда может привести к одной глупой ошибке, если не соблюдать осторожность ;-).
Подробные данные зависят от реализации, но обычно результаты буферизуются. Выполнение запроса к базе данных вернет некоторый результирующий набор. Если он достаточно мал, все результаты могут быть возвращены с начальным вызовом или некоторые из них могут быть и больше результатов возвращаются по мере итерации над объектом результата.
Подумайте о последовательности следующим образом:
Идея всего этого состоит в том, чтобы свести к минимуму обратную связь с сервером, не возвращая слишком много ненужных данных, поэтому, если вы попросите миллион строк, вы не получите их все сразу.
clauses LIMIT - или любое предложение в факте - изменит результирующий набор.
Наконец, (7) является важным, поскольку SELECT * FROM table WHERE a = 'foo'
и SELECT * FROM table WHERE a = 'bar'
являются двумя различными запросами в отношении оптимизатора базы данных, поэтому план выполнения должен быть определен для каждого отдельно. Но параметризованный запрос ( SELECT * FROM table WHERE a =: param
) с различными параметрами является одним запросом и должен планироваться только один раз (по крайней мере, до тех пор, пока он не выпадет из кэша запросов).
На первый вопрос можно ответить, прочитав ресурсы
Так как Вы «*», каждый столбец возвращается для каждого 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
снова возвращает отрицательные величины для отрицательных целых чисел.
Теперь попробуйте следующее:
>>> print 300 % -800
-500
Причина разницы в том, что дизайнеры языка, кажется, не могут решить, должен ли остаток после деления иметь знак дивиденда или делитель . Некоторые языки даже не указывают тот или иной, так что это зависит от реализации.
На странице Википедии Операция Modulo есть список языков, оператор, и какой знак ожидать. Это хорошее место для начала, но я обычно просто запускаю несколько простых тестов, чтобы убедиться, что я точно знаю, как будет себя вести %
, прежде чем использовать его на любом языке, на котором я его раньше не тестировал.
В стандарте C отрицательный модулор не определен, и многие компиляторы C дадут вам то же, что и Java. Однако в python вы всегда получите положительное число, что часто более полезно, потому что это означает, что вы можете выполнять сложение и вычитание по модулю. Если бы отрицательный модулор давал отрицательное число, он бы не работал должным образом.
Я понятия не имею, какие преимущества дает получение отрицательного числа по модулю.