演算子優先順位
演算子優先順位 とは
演算子の優先順位を意識して、与式の値を正しく計算します。本レッスンでは、演算子優先順位 の基本から実際の使いどころまでを整理し、現場で迷わず使える形に落とし込みます。
演算子の優先順位を意識する
Python は多くの演算子を持ち、それぞれに優先順位 (precedence) が決められています。優先順位とは「同じ式の中で複数の演算子があるときに、どの順番で評価されるか」を決めるルールのことです。たとえば 2 + 3 * 4 は 20 ではなく 14 になります。これは * のほうが + より優先順位が高く、先に 3 * 4 が計算されるからです。
優先順位を意識せずにコードを書くと、自分の意図と違う結果が出てバグの原因になります。逆に、優先順位を理解して括弧 ( ) を上手に使えば、複雑な式でも読みやすく安全に書けます。Python の優先順位は公式ドキュメントに表で載っており、丸暗記する必要はありませんが、「算術 > 比較 > 論理」という大まかな順序だけは押さえておきましょう。
迷ったら括弧をつける。これが優先順位事故を防ぐ一番の方法です。
主な優先順位
Python の演算子を優先順位の高い順に並べると、おおよそ次のような階層になります。ここでは代表的なものだけ示します。
**(べき乗)- 単項
+x-x~x *///%+-(二項)<<=>>===!=innot inisis notnotandor
つまり、算術演算子 (* + など) のほうが比較演算子よりも先に評価され、比較演算子は論理演算子よりも先に評価されます。次の例で確認します。
Python
print(2 + 3 * 4) # 14 (3 * 4 が先)
print((2 + 3) * 4) # 20 (括弧で優先度を上げた)
print(2 ** 3 ** 2) # 512 (** は右結合、3 ** 2 が先)
print(10 - 3 - 2) # 5 (- は左結合、(10 - 3) - 2)べき乗 ** は右結合 (right-associative) という珍しい性質を持ちます。2 ** 3 ** 2 は 2 ** (3 ** 2) と評価され、結果は 2 ** 9 = 512 になります。一方、- や / は左結合なので、左から順に評価されます。
べき乗
**の右結合は他の演算子と違うので注意。迷ったら括弧で意図を明示しましょう。
比較と論理の組み合わせ
比較演算子は論理演算子より優先順位が高いので、a == b and c == d は (a == b) and (c == d) と解釈されます。これはほぼ直感どおりですが、not の位置は注意が必要です。not a == b は not (a == b) と評価され、これは a != b と同じ意味になります。
Python
x, y = 3, 4
print(x == 3 and y == 4) # True
print(not x == 3) # False (not (x == 3))
print(x + 1 == 4 or y - 1 == 2) # True (算術 → 比較 → or)ビット演算子 & | は比較演算子よりも優先順位が高いので、a == 1 & b == 2 のように書くと意図せず a == (1 & b) == 2 と評価されて思わぬ結果になります。bool の論理演算は必ず and or を使いましょう。
よくある間違い
優先順位でつまずきやすいのは次の 3 点です。1 つめは「a or b and c」を「(a or b) and c」と読んでしまうケースで、実際は a or (b and c) です。2 つめは「-2 ** 2」を 4 だと思うケースで、** のほうが単項 - より優先度が高いため -(2 ** 2) = -4 になります。3 つめは、括弧を省きすぎて自分でも読めなくなるケースで、「複雑な式は括弧で意図を明示する」のが正解です。
Python
print(-2 ** 2) # -4 (** が先)
print((-2) ** 2) # 4 (括弧で意図を明示)
print(True or False and False) # True (and が先)
print((True or False) and False) # False「
-2 ** 2が-4になる」は試験でも頻出のひっかけポイントです。
やってみよう
今回の課題は、整数 a b c を受け取り、式 a + b * c の結果を返す関数 compute(a, b, c) を書くことです。これは「* のほうが + より優先される」という基本ルールを確認するためのシンプルな課題です。中身は return a + b * c の 1 行で書けます。書けたら、括弧の有無で結果が変わる例 ((a + b) * c など) も試してみると、優先順位の感覚が身体に染みつきます。実務では複雑な式の優先順位を暗記するより、括弧で意図を明示するほうが安全です。
よくある質問
Q. このトピックは Python 以外の言語でも同じ書き方ですか?
A. 考え方は他言語と共通ですが、構文や標準ライブラリは異なります。Python はインデントでブロックを表し、コロン + 改行で構造を作るのが特徴です。他言語に移行する際は基本概念を維持しつつ、構文の差分を意識して書き換えると混乱が少ないです。
Q. 実行してエラーが出た場合の対処は?
A. エラーメッセージの最後の行(TypeError や NameError などの型)から原因と該当行を確認します。Python はトレースバックが下から上に読むと「呼び出し元 → 内部」の順で辿れます。print や IDE のデバッガで途中の変数を確認すると原因が見えてきます。
Q. 次のステップで何を学ぶべきですか?
A. 本レッスンの内容を理解できたら、本文の「やってみよう」を実装し、章末クイズに進むのがおすすめです。さらに自分のミニアプリ(電卓・todo・スコア集計など)に応用するとスキルが定着します。詰まったら本文の H2 セクションに戻って読み返してください。
次のレッスン
次は 第3章クイズ で、演算子の優先順位を意識して、与式の値を正しく計算します を学びます。
事前確認 — 進む前に次の 3 つができることを確認しましょう。
- 演算子優先順位 の要点を自分の言葉で説明できる
- このレッスンの最小コード (または操作手順) を見ずに書ける
- 練習問題やクイズで間違えた箇所を読み直して理解した
理解度チェック (30 秒)
Q. 演算子優先順位 とは何か、1 文で説明してください。
A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。
関連レッスン
要件
- a + b * c の優先順位を活用する
- 括弧で順序を変えない
- 戻り値は整数
入出力例
test-cases.txt
compute(2, 3, 4) → 14
compute(0, 5, 5) → 25
compute(10, 0, 100) → 10
compute(1, -2, 3) → -5
compute(100, 1, 1) → 101