Ma, se è ambiguo per voi - il programmatore - e deve essere perché dovete chiedere, allora aspettatevi che sia almeno altrettanto ambiguo per il lettore e sprecate un paio di ottetti per chiarezza.
Affidarsi alle regole di precedenza è ottimo se si è un compilatore.
aggiunto risposte alle osservazioni:
Per la persona che legge il codice che incontra un'ambiguità che richiede la consultazione di fuori per la garanzia, si deve supporre che il prossimo lettore sarà meno esperti di te e salvare loro la fatica e errore umano evitabile di analizzare lo stesso costrutto e aggiungere la parentesi per loro.
In questo caso, anche la risposta accettata era errata (in logica, non in effetto, si veda il suo primo commento) di cui non ero a conoscenza e nemmeno una frazione di coloro che l'avevano svalutato.
Per quanto riguarda la descrizione dell'algebra di base, l'esempio particolare utilizzato nell'OP è istruttivo. Indipendentemente dalla precedenza dell'operatore, l'espressione j * (j/m)
è algebricamente identica a (j * j)/m
. Sfortunatamente, l'algebra di Python è solo un'approssimazione dell'algebra "platonica ideale" che potrebbe dare risposte sbagliate per entrambe le forme a seconda della magnitudine di j
e m
. Per esempio:
>>> 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
così effettivamente la proprietà dell'identità di Python (e il mio FPU) quasi-algebra non regge. E questo può essere diverso sulla vostra macchina per le documentation notes: numeri in virgola
galleggianti sono implementati utilizzo di un doppio in C. Tutte le scommesse sul loro precisione sono fuori a meno che non vi capita di conoscere la macchina si sta lavorando .
si potrebbe affermare che non si ha affari di lavoro sul bordo pelosa di troppo pieno, e questo è vero in una certa misura, ma rimosso dal contesto l'espressione è indeterminato in un ordine delle operazioni e "corretta" sotto un'altra.
"Esplicito è meglio di implicito.", "Di fronte all'ambiguità, rifiuta la tentazione di indovinare." - PEP 20 – msw
british: Se stai leggendo "codice intero solo", hai un problema molto più grande: Quale versione di Python era destinata ad essere utilizzata per eseguirla? Il codice ha 'da __future__ import division' in primo piano? Dovrebbe questo '/' essere letto come e/o cambiato in '//'? –
@John Machin:/significa divisione integer in questo caso, è python 2.6 senza le cose future, ho notato che i codici come j * j/m (j * j)/m erano uguali, ma avevo paura della coerenza se questo comportamento –