演算子の優先順位とは
Pythonで利用できる演算子には、どの演算子が先に処理されるかが決められており、その優先順位に従って演算されます。
全ての演算子には優先順位が設定されています。
演算子の優先順位で分かりやすいものと言えば、算数の掛け算と足し算です。算数では先に掛け算を計算して、そのあとに足し算を行います。これは、掛け算は足し算よりも優先度が高いためです。そしてこの法則はPythonの演算子でも同じです。
Pythonの演算子については「Pythonの演算子の一覧」をご参照ください。
演算子の優先順位の一覧
以下に演算子の優先順位が高いものから順に並べています。一番上が優先順位が最も高く、一番下が最も低い優先順位になります。
同じ優先順位の演算子が1つの式で同時に利用されている場合は、式の中でより左にある演算子から演算されます。
例えば、「1 + 2 + 4」の場合は、まず「1 + 2」が演算され、その結果の「3」と次の「4」の「3 + 4」が演算されます。(1 + 2→3、3 + 4→7)
優先度 | 演算子 | 内容 |
---|---|---|
1 | (式) | 丸括弧 |
[リスト] | リスト | |
{辞書} | 辞書 | |
{セット} | セット | |
2 | x[index] | 添え字 |
x[index:index] | リストのスライス指定 | |
x(引数) | 関数呼び出し | |
x.属性 | クラスの属性(プロパティ)の参照 | |
3 | await x | Await式 |
4 | xx | べき乗 |
5 | +x | 正数 |
-x | 負数 | |
~x | ビット反転 | |
6 | * | 乗算 |
/ | 除算 | |
// | 余り切り捨て除算 | |
% | 剰余(除算の余り) | |
% | 文字列のフォーマット | |
7 | + | 加算 |
– | 減算 | |
8 | << | 左ビットシフト |
>> | 右ビットシフト | |
9 | & | ビット単位の論理積 |
10 | ^ | ビット単位の排他的論理和 |
11 | | | ビット単位の論理和 |
12 | is | 「x is y」の場合に、x と y のオブジェクトが同じ場合に「真(True)」になる。 |
is not | 「x is not y」の場合に、x と y のオブジェクトが異なる場合に「真(True)」になる。 | |
in | 「x in y」の場合に、x が y にが含まれている場合は真 | |
not in | 「x not in y」の場合に、x が y に含まれていない場合は真 | |
== | 左辺と右辺が等しい | |
!= | 左辺と右辺が異なる | |
<> | 左辺と右辺が異なる | |
< | 右辺が左辺より大きい | |
<= | 右辺が左辺以上 | |
> | 左辺が右辺より大きい | |
>= | 左辺が右辺以上 | |
13 | not x | xの真偽を反転 |
14 | and | 左辺と右辺がどちらも真 |
15 | or | 左辺と右辺のどちらかが真 |
16 | if、elif、else | 条件式 |
17 | lambda | ラムダ式 |
18 | = | 式の中での代入(ウォルラス演算子) |
優先順位に従うよりも丸括弧()を使う
上の表のとおり、演算子の優先順位は「丸括弧()」が最も高くなります。
複雑に感じる条件文や式の場合は、この丸括弧()を使って演算子の優先順位を明示することをお勧めします。
例えばこんな式があるとします。
1 |
「1 + 2 * 3 / 4 - 5 + 6 * 7」 |
算数の通りの演算でよければ上の式のままでも演算子の優先順位に従って演算されますが、以下のように実装したかった演算順序に丸括弧()を付けておけば、別の人がプログラムを見たときに当初書いた人の意図を読み取りやすくなります。
1 |
「(1 + ((2 * 3) / 4)) - (5 + (6 * 7))」 |
丸括弧()が多くなると読みづらくなるという人もいますが、それはコードの書き方に重点を置いた視点に過ぎません。
それよりも、そのプログラムが意図したとおりに動くこと、そしてそれをプログラマーが理解できることの方が重要です。
演算子の優先順位を駆使したコードを書くよりも、丸括弧()を使って何をしたいコードなのかを明確にすることを大事にしてください。
インクリメントの++やデクリメントの–
他のプログラミング言語にある「++」や「–」といったインクリメント(1加算)やでデクリメント(1減算)する演算子はPythonには存在しません。
そのため、Pythonでインクリメントやデクリメントをしたい場合は、「+=」や「-=」演算子を使って「i += 1」や、加算減算演算子を使って「i = i + 1」「i = i – 1」などの書き方をします。
では、なぜPythonには「++」と「–」の演算子がないのでしょうか。
それは、「++i」「i++」といった前置法と後置法による混乱や読み間違いを無くしたいという意図があるのではないかと思います。
C言語やJava言語を理解されてある方であれば、例えば条件文の中に含まれるインクリメントの「++i」と「i++」の違いによる影響の大きさと、それがバグであった場合の検出の困難さは分かると思います。
便利な機能ではありますが、問題が起きたときの影響の方が大きい、と判断をして実装しなかったのではないかと思います。