Pythonのドキュメントによると*
、/
同じ優先順位があります。
Pythonの式は左から右に評価されることを私は知っています。
私はそれを信頼して、それが常に
括弧を避けることにj*j/m
等しいと仮定できますか?
これが事実である場合、これは一般的に同じ優先順位を持つ演算子に当てはまると仮定できますか?(j*j)/m
ps:質問は私の目的には問題ないので、括弧なしの整数のみのコード(上記の例のような)を読んでいるときに思いついたのですが、当時は非常に疑わしいようでした。
Pythonのドキュメントによると*
、/
同じ優先順位があります。
Pythonの式は左から右に評価されることを私は知っています。
私はそれを信頼して、それが常に
括弧を避けることにj*j/m
等しいと仮定できますか?
これが事実である場合、これは一般的に同じ優先順位を持つ演算子に当てはまると仮定できますか?(j*j)/m
ps:質問は私の目的には問題ないので、括弧なしの整数のみのコード(上記の例のような)を読んでいるときに思いついたのですが、当時は非常に疑わしいようでした。
はい-同じ優先順位を持つ異なる演算子は左結合です。つまり、左端の2つのアイテムが操作され、次に結果と3番目のアイテムというように操作されます。
例外は**
演算子です:
>>> 2 ** 2 ** 3
256
また、比較演算子(==
、、>
など)は結合法則で動作しませんが、代わりにに変換x [cmp] y [cmp] z
され(x [cmp] y) and (y [cmp] z)
ます。
しかし、それがあなた(コーダー)にとって曖昧であり、それはあなたが尋ねなければならないためでなければならない場合、それは少なくとも読者にとって曖昧であり、明確にするために数オクテットを浪費することを期待してください。
あなたがたまたまコンパイラーであるなら、優先順位規則に頼ることは素晴らしいことです。
コメントへの追加の応答:
保証のために外部との協議が必要なあいまいさに遭遇したコードを読んでいる人にとって、次の読者はあなたよりも知識が少ないと想定し、同じ構造を解析する労力と回避可能な人為的エラーを節約し、括弧を追加する必要があります。
たまたま、受け入れられた答えでさえ、私が気付いていなかった間違ったものであり(理論的には、効果ではなく、最初のコメントを参照)、どちらもそれを賛成した人の一部ではありませんでした。
基本的な代数についてのステートメントに関しては、OPで使用される特定の例は有益です。演算子の優先順位に関係なく、式j * (j / m)
は代数的に。と同じです(j * j) / m
。残念ながら、Python代数は「プラトン的観念」代数の近似にすぎず、との大きさに応じてどちらの形式でも誤った答えが得られる可能性が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)の準代数の単位元プロパティは保持されません。そして、これはドキュメントノートのようにあなたのマシンで異なるかもしれません:
浮動小数点数は、Cでdoubleを使用して実装されます。使用しているマシンを知らない限り、精度に対するすべての賭けは無効になります。
オーバーフローのヘアリーエッジに取り組んでいるビジネスはないと主張することもできますが、それはある程度真実ですが、ある操作の順序が与えられた場合、式は不確定であり、別の順序では「正しい」ものです。
簡単な答え:はい。
Pythonのドキュメントには次のように書かれています。
同じボックス内の演算子の優先順位は同じです。構文が明示的に指定されていない限り、演算子はバイナリです。同じボックス内の演算子は左から右にグループ化されます(すべて同じ優先順位と左から右へのチェーンを持つテストを含む比較と、右から左にグループ化されるべき乗を除く)。
つまり、あなたの質問に対する答えは「はい」です。同じ優先順位を持つ演算子は、グループ化ではなく連鎖する比較とは別に、左から右にグループ化されます。
>>> x = 0
>>> y = 0
>>> x == y == True
False
>>> (x == y) == True
True
>>> x == (y == True)
True
と指数:
>>> 2 ** 2 ** 3
256
>>> (2 ** 2) ** 3
64
>>> 2 ** (2 ** 3)
256
また、割り当てでは、右側が左側の前に評価されます。
>>> x = 1
>>> y = x = 2
>>> y
2