論理演算子

生田 陸人
LuaGate エンジニア / 現役エンジニア
編集 LuaGate編集部

このレッスンで分かること

  • and / or / not で複数の比較条件を 1 つの式にまとめられます
  • and は両方真、or はどちらか真、not は反転
  • 最小例は 0 <= x and x <= 100 and x % 2 == 0

論理演算子 とは

and / or / not を組み合わせて複雑な条件を組み立てます。本レッスンでは、論理演算子 の基本から実際の使いどころまでを整理し、現場で迷わず使える形に落とし込みます。

論理演算子で条件をつなぐ

比較演算子だけでは「2 つ以上の条件を同時に満たすか」を素直に書けません。そこで使うのが and or not という論理演算子です。論理演算子は bool を受け取り bool を返す道具で、複数の条件を 1 つの式にまとめるための糊の役割を果たします。Python の論理演算子は他の言語の && || ! とは見た目が異なり、英単語そのものを書く点が特徴です。読みやすさを重視する Python らしいデザインといえます。

論理演算子は、現場では「ユーザーがログイン済み かつ 管理者である」「在庫がゼロ または 入荷予定がない」など、条件の組み合わせを表現するのに大活躍します。覚えるべき演算子は 3 つだけなので、まずは真理値表を頭に入れるところから始めましょう。

and or not は予約語なので、変数名としては使えません。and_value のようにアンダースコアを付ければ別名にできます。

真理値表で動きを確認

論理演算子の動きは「真理値表」と呼ばれる表で網羅できます。a and b は両方が True のときだけ Truea or b はどちらかが True なら Truenot aTrueFalse を反転します。

aba and ba or bnot a
TrueTrueTrueTrueFalse
TrueFalseFalseTrueFalse
FalseTrueFalseTrueTrue
FalseFalseFalseFalseTrue

Python

print(True and True) # True print(True and False) # False print(False or True) # True print(False or False) # False print(not True) # False print(not False) # True

論理演算子の戻り値は bool ですが、Python では「短絡評価」と呼ばれる仕組みがあり、a and baFalse のときは b を見ずに結果が決まります。これは無駄な評価を省くだけでなく、エラーを防ぐ用途にも使えます。

diagram (will load when visible)

図 (and の判定) の流れを順序リストで書き直すと、次の通りです。

  1. a を評価する
  2. aFalse なら、b を見ずに False を返す (短絡評価)
  3. aTrue であれば b を評価する
  4. bTrue であれば True を返す
  5. bFalse であれば False を返す

and は「両方とも真」、or は「少なくとも片方が真」と覚えると忘れません。

比較演算子と組み合わせる

論理演算子の真価は、比較演算子と組み合わせたときに発揮されます。たとえば「0 以上 100 以下の数か」を判定するには 0 <= x and x <= 100 のように書けます。これは前のレッスンで触れた連鎖比較 0 <= x <= 100 と同じ意味です。さらに or を組み合わせれば、x == 0 or x == 100 のように特定値だけを許可する条件も書けます。

Python

x = 50 is_in_range = 0 <= x and x <= 100 is_edge = x == 0 or x == 100 print(is_in_range, is_edge) # True False

論理演算子は左から評価されるため、not (x < 0)x >= 0 は同じ意味です。読みやすさで使い分けますが、not を多用すると意味が反転して読みづらくなるので、できるだけ「肯定形」で書くのがコツです。

条件式が長くなるときは括弧で意図を明示しましょう。(a and b) or ca and (b or c) では結果が異なります。

よくある間違い

論理演算子で初心者がつまずくのは次の通りです。

  1. Python&& || を書いてしまう (構文エラーになります)
  2. andor の優先順位を勘違いする (and のほうが or より優先度が高い)
  3. x == 1 or 2 のように書いてしまう (x == 1 または 2 (truthy) と解釈されます)

Python

# NG (常に True になる) x = 5 print(x == 1 or 2) # 2 が truthy なので True # OK print(x == 1 or x == 2) # False

短絡評価を活かせば、None チェックと属性アクセスを安全に書くこともできます。たとえば user is not None and user.is_admin と書けば、userNone のときに user.is_admin を評価せずに済むので AttributeError を防げます。これは実務で頻出のパターンなので、and の左右の順序を意識しておきましょう。

短絡評価を覚えると、不要な評価を省きつつエラーも避けられます。

この章のポイント

ここまでの要点 and or not の真理値表を覚える。&& || ! ではなく英単語を使う。短絡評価で None チェックを安全に書ける。

やってみよう

今回の課題は、整数 x を受け取り、x0 以上 100 以下、かつ偶数であるかを判定する関数 is_in_range_even(x) を書くことです。and を使って 0 <= xx <= 100x % 2 == 0 の 3 つの条件を 1 つの式にまとめましょう。後のレッスンで % (剰余) を詳しく扱いますが、ここでは x % 2 == 0 で偶数判定ができることを使ってください。境界値 0100 も「以下」「以上」に含まれることに注意しましょう。

よくある質問

Q. && と || はどんな順序で評価されますか?

A. && は左から評価し、最初に false が出た時点で残りをスキップします(短絡評価)。|| は最初に true が出た時点でスキップします。これを使うと if (obj && obj.value) のように null チェックと値参照を 1 行で書けます。

Q. and / or の戻り値は true / false ですか?

A. Python の and / or は短絡評価し、真偽ではなく実際の値を返します。例えば 0 or 'default' は 'default'、'name' and 'value' は 'value' です。JavaScript も同様で、a || b はデフォルト値の代入によく使われます(nullish 合体 ?? の方が安全な場面もあり)。

Q. not と != はどう違いますか?

A. not は真偽の反転(not True → False)で、!= は不等値の判定です。x != 0 と not (x == 0) は同じ結果ですが、後者は二重否定で読みにくくなるため != を使うのが基本です。条件全体を反転したいときだけ not を使ってください。

次のレッスン

次は 三項演算子 で、and / or / not を組み合わせて複雑な条件を組み立てます を学びます。

事前確認 — 進む前に次の 3 つができることを確認しましょう。

  1. 論理演算子 の要点を自分の言葉で説明できる
  2. このレッスンの最小コード (または操作手順) を見ずに書ける
  3. 練習問題やクイズで間違えた箇所を読み直して理解した

理解度チェック (30 秒)

Q. 論理演算子 とは何か、1 文で説明してください。

この章のポイント

A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。

関連レッスン

要件

  1. and を使って複数条件をまとめる
  2. % 2 == 0 で偶数判定
  3. 戻り値は bool

入出力例

test-cases.txt

is_in_range_even(50)true is_in_range_even(51)false is_in_range_even(200)false is_in_range_even(-2)false is_in_range_even(0)true is_in_range_even(100)true

ヒント

main.py
main.py
学習モード

メモ

論理演算子

⌘S で保存