Но, если это неоднозначно для вас - кодер - и это должно быть потому, что вы должны спросить, тогда ожидайте, что он будет как минимум столь же неоднозначным для читателя и потратит пару октетов для ясности.
Опираясь на правила приоритета, отлично, если вы являетесь компилятором.
добавлены ответы на комментарии:
Для человека, читающего код, который встречает неоднозначность, которая требует вне консультации для обеспечения, следует предположить, что следующий читатель будет меньше здравым смыслом, чем вы и сохранить их усилия и избегаемая человеческая ошибка разбора одной и той же конструкции и добавление к ней скобки.
Как бы то ни было, даже принятый ответ был неправильным (в обосновании, а не эффекте, см. Его первый комментарий), о котором я не знал, и ни одна из них не была частью тех, кто его поддержал.
Что касается утверждения об основной алгебре, то конкретный пример, используемый в ОП, является поучительным. Независимо от приоритета оператора выражение j * (j/m)
алгебраически идентично (j * j)/m
. К сожалению, алгебра Питона является лишь приближением алгебры платоновского идеала, которая может давать неверные ответы для любой формы в зависимости от величин j
и m
. Например:
>>> m = 1e306
>>> m
1e+306
>>> j = 1e307
>>> j
9.9999999999999999e+306
>>> j/m
10.0
>>> j*j
inf
>>> j * (j/m)
1e+308
>>> (j * j)/m
inf
>>> ((j * j)/m) == (j * (j/m))
False
Так действительно свойство личности Python (и мой FPU) квази-алгебры не имеет. И это может отличаться на вашей машине по documentation notes в:
Числа с плавающей точкой выполняются с использованием двойной в C. Все ставки на их точности выключены, если не случится знаю машину вы работаете ,
Это можно утверждать, что один не имеет никакого бизнеса, работая на волосистой края перелива, и это верно в некоторой степени, но удаляется из контекста выражение неопределенными дается один порядок операций и «правильной» под другим.
«Явный лучше, чем неявный». «Перед лицом двусмысленности отказывайтесь от соблазна угадать». - PEP 20 – msw
британский: Если вы читали «целочисленный код», у вас есть гораздо большая проблема: Какую версию Python планировали использовать для ее запуска? У кода есть 'from __future__ import division' спереди? Должно ли это '/' быть прочитано как и/или изменено на '//'? –
@John Machin:/означает целочисленное деление в этом случае, является python 2.6 без будущего материала, я заметил, что коды, такие как j * j/m (j * j)/m, равные, но боялись о согласованности if это поведение. –