論理演算子
このレッスンで分かること
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 つだけなので、まずは真理値表を頭に入れるところから始めましょう。
andornotは予約語なので、変数名としては使えません。and_valueのようにアンダースコアを付ければ別名にできます。
真理値表で動きを確認
論理演算子の動きは「真理値表」と呼ばれる表で網羅できます。a and b は両方が True のときだけ True、a or b はどちらかが True なら True、not a は True と False を反転します。
a | b | a and b | a or b | not a |
|---|---|---|---|---|
True | True | True | True | False |
True | False | False | True | False |
False | True | False | True | True |
False | False | False | False | True |
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 b で a が False のときは b を見ずに結果が決まります。これは無駄な評価を省くだけでなく、エラーを防ぐ用途にも使えます。
図 (and の判定) の流れを順序リストで書き直すと、次の通りです。
aを評価するaがFalseなら、bを見ずにFalseを返す (短絡評価)aがTrueであればbを評価するbがTrueであればTrueを返すbがFalseであれば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 cとa and (b or c)では結果が異なります。
よくある間違い
論理演算子で初心者がつまずくのは次の通りです。
Pythonで&&||を書いてしまう (構文エラーになります)andとorの優先順位を勘違いする (andのほうがorより優先度が高い)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 と書けば、user が None のときに user.is_admin を評価せずに済むので AttributeError を防げます。これは実務で頻出のパターンなので、and の左右の順序を意識しておきましょう。
短絡評価を覚えると、不要な評価を省きつつエラーも避けられます。
ここまでの要点
and or not の真理値表を覚える。&& || ! ではなく英単語を使う。短絡評価で None チェックを安全に書ける。
やってみよう
今回の課題は、整数 x を受け取り、x が 0 以上 100 以下、かつ偶数であるかを判定する関数 is_in_range_even(x) を書くことです。and を使って 0 <= x と x <= 100 と x % 2 == 0 の 3 つの条件を 1 つの式にまとめましょう。後のレッスンで % (剰余) を詳しく扱いますが、ここでは x % 2 == 0 で偶数判定ができることを使ってください。境界値 0 と 100 も「以下」「以上」に含まれることに注意しましょう。
よくある質問
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 つができることを確認しましょう。
- 論理演算子 の要点を自分の言葉で説明できる
- このレッスンの最小コード (または操作手順) を見ずに書ける
- 練習問題やクイズで間違えた箇所を読み直して理解した
理解度チェック (30 秒)
Q. 論理演算子 とは何か、1 文で説明してください。
A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。
関連レッスン
要件
- and を使って複数条件をまとめる
- % 2 == 0 で偶数判定
- 戻り値は 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