Pythonでの条件分岐や繰り返しをしっかり書けるようになるには、論理演算子の理解が欠かせません。
本記事では、and・or・notの3つの論理演算子を、TrueとFalseという視点から徹底的に解説します。
真理値表や図解、実行できるサンプルコードを通して、初学者の方でも迷わず読めるように丁寧に説明していきます。
Pythonの論理演算子とは
and・or・not論理演算子の基本

プログラミングでは、条件式を組み合わせるために論理演算子を使います。
Pythonにおいて代表的な論理演算子は次の3つです。
- and
- or
- not
これらは、それぞれ次のような意味を持ちます。
条件A and 条件B
「両方ともTrueならTrue、それ以外はFalse」条件A or 条件B
「どちらか一方でもTrueならTrue、両方FalseのときだけFalse」not 条件A
「TrueをFalseに、FalseをTrueに反転」
論理演算子は、単独で使うこともできますが、ほとんどの場合はif文やwhile文の条件として使われます。
たとえば「20歳以上かつ65歳未満ならTrue」のような、日常的な条件をコードで表現するために利用します。
TrueとFalse(ブール値)の仕組み

Pythonでは、真偽を表すブール値(boolean)としてTrueとFalseを使います。
これらはPythonの組み込みの値であり、次のような特徴があります。
TrueとFalseは、型としてはbool型- 主に比較演算の結果として得られる
(例:5 > 3、age >= 20など) - if文などの条件式で評価される
実際に、PythonでTrueとFalseがどう扱われるかを確認してみます。
# True と False の基本的な確認
print(True) # True という値そのもの
print(False) # False という値そのもの
# 型を確認してみる
print(type(True)) # <class 'bool'>
print(type(False)) # <class 'bool'>
# 比較演算の結果としての True / False
print(5 > 3) # 5 は 3 より大きいので True
print(5 < 3) # 5 は 3 より小さくないので False
print(10 == 10) # 10 と 10 は等しいので True
print(10 != 7) # 10 と 7 は等しくないので True
True
False
<class 'bool'>
<class 'bool'>
True
False
True
True
ここで押さえておきたいのは、論理演算子は「TrueかFalseか」という結果をさらに組み合わせる役割を持つということです。
つまり、比較演算子がTrue/Falseを作り、論理演算子がそれらを組み合わせるという流れになります。
条件分岐(if文)での論理演算子の役割

if文では、括弧の中に「条件式」を書きます。
論理演算子は、この条件式の中に登場し、複数の条件を組み合わせて1つのTrue/Falseにまとめる役割を果たします。
age = 30
# 20歳以上 かつ 65歳未満 なら大人料金
if (age >= 20) and (age < 65):
print("大人料金です")
else:
print("割引料金です")
大人料金です
この例では、次のような流れで評価されます。
age >= 20が True か False か評価されるage < 65が True か False か評価される- それらを
andで組み合わせて、最終的なTrue/Falseを決める - 結果がTrueならifブロック、Falseならelseブロックが実行される
このように、論理演算子はif文の「判断材料をまとめる」存在であると理解するとすっきりします。
and演算子をTrue/Falseで理解する
andの評価ルールと真理値表

and演算子の基本ルールは「両方ともTrueのときだけTrue」です。
まずは真理値表で確認します。
andの真理値表は次のようになります。
| 条件A | 条件B | A and B の結果 |
|---|---|---|
| True | True | True |
| True | False | False |
| False | True | False |
| False | False | False |
この表から分かるように、1つでもFalseが混ざると結果はFalseになります。
日常の言葉で言うと、「AかつB」という表現にあたります。
実際に、True/Falseを組み合わせて確認してみます。
# and 演算子の真理値を確認するサンプル
patterns = [
(True, True),
(True, False),
(False, True),
(False, False),
]
for a, b in patterns:
result = a and b
print(f"{a} and {b} -> {result}")
True and True -> True
True and False -> False
False and True -> False
False and False -> False
and演算子は、条件を「絞り込む」ときに使うと理解しておくと、後の応用がスムーズになります。
複数条件の絞り込みで使うandの例

現実の条件に当てはめてみると、andのイメージが一気につかみやすくなります。
例えば、次のような例です。
- 「20歳以上かつ30歳以下」
- 「会員ランクがゴールドかつログイン済み」
- 「在庫が1以上かつ販売中フラグがTrue」
次のサンプルでは、年齢と会員ランクの2つの条件で絞り込む例を示します。
# and を使って複数条件で絞り込む例
age = 25
rank = "gold" # 会員ランク: "normal", "silver", "gold" など
# 条件:
# 1. 年齢が20歳以上
# 2. 会員ランクが "gold"
if (age >= 20) and (rank == "gold"):
print("特典対象のユーザーです")
else:
print("特典対象ではありません")
特典対象のユーザーです
ここでは、どちらか一方でも条件を満たさない場合は、andの結果がFalseになるため、「特典対象ではありません」と判定されます。
andは「両方クリアしないと先に進めないチェックポイント」のようなイメージで捉えると、設計がしやすくなります。
if文でのandとネストifの違い

andは、ネストしたif文(入れ子のif)と意味的に同じ動きをします。
次の2つのコードは、同じ条件を表しています。
age = 25
rank = "gold"
# パターン1: and を使う
if (age >= 20) and (rank == "gold"):
print("特典対象 (and 使用)")
# パターン2: if のネストを使う
if age >= 20:
if rank == "gold":
print("特典対象 (ネストif 使用)")
特典対象 (and 使用)
特典対象 (ネストif 使用)
どちらも、age >= 20 であり、かつ rank == "gold" のときにだけメッセージを表示します。
この2つの違いを整理すると、次のようになります。
| 書き方 | 特徴 |
|---|---|
| andを使う | 条件が1行にまとまり、コンパクトで読みやすい |
| ネストif | 処理を段階的に分けたいときに向いている |
たとえば、ネストifを使うと、条件ごとに違うメッセージを出すこともできます。
age = 17
rank = "gold"
if age >= 20:
print("年齢条件はクリアしました")
if rank == "gold":
print("ランク条件もクリアしました")
else:
print("ランク条件を満たしていません")
else:
print("年齢条件を満たしていません")
年齢条件を満たしていません
「単にTrue/Falseを判定したいだけならandでまとめる」「途中経過に応じた細かな挙動が必要ならネストifも使う」というように、使い分けていくとコードが整理しやすくなります。
or演算子をTrue/Falseで理解する
orの評価ルールと真理値表

or演算子の基本ルールは「どちらか一方でもTrueならTrue」です。
真理値表を見てみましょう。
| 条件A | 条件B | A or B の結果 |
|---|---|---|
| True | True | True |
| True | False | True |
| False | True | True |
| False | False | False |
andと逆に、両方FalseのときだけFalseになります。
日本語では「AまたはB」という表現にあたります。
True/Falseの組み合わせを確認してみます。
# or 演算子の真理値を確認するサンプル
patterns = [
(True, True),
(True, False),
(False, True),
(False, False),
]
for a, b in patterns:
result = a or b
print(f"{a} or {b} -> {result}")
True or True -> True
True or False -> True
False or True -> True
False or False -> False
orは「どれか1つでも条件を満たせばOK」というゆるい条件を表現するのに向いています。
どれか1つがTrueならOKな条件の書き方

日常的な例でorを使うと、次のようなケースが考えられます。
- 「土日または祝日ならお休み」
- 「会員またはクーポン所持者なら割引」
- 「メールまたは電話のどちらかで連絡が取れればOK」
次は、曜日と祝日フラグをもとに「お休みかどうか」を判定する例です。
# or を使って「どちらか一方でも条件を満たせばOK」の例
day_of_week = "Sunday" # "Monday" ~ "Sunday"
is_holiday = False # 祝日かどうかのフラグ
# 条件:
# 1. 日曜日である
# 2. 祝日である
if (day_of_week == "Sunday") or is_holiday:
print("お休みです")
else:
print("出勤日です")
お休みです
このコードでは、日曜日でなくても、is_holiday が True ならお休みになります。
どちらか1つでもTrueになればよいので、このような書き方になります。
orとin演算子の使い分け

orを使って「どの値かに一致するか」を判定するコードは、しばしばin演算子でスッキリ書き換えられます。
例えば、次のような例です。
color = "blue"
# パターン1: or を並べて書く
if (color == "red") or (color == "blue") or (color == "green"):
print("対象の色です (or)")
# パターン2: in 演算子を使う
if color in ["red", "blue", "green"]:
print("対象の色です (in)")
対象の色です (or)
対象の色です (in)
意味はまったく同じですが、inを使ったほうが短く読みやすいです。
要素が増えたときの見通しも良くなります。
orとinの使い分けとしては、次のように考えるとよいです。
- 「複数の候補の中に含まれるか」を調べる → inが向いている
- 「条件式そのもの」がTrueかFalseかを組み合わせたい → orを使う
例えば、次のようなパターンはorのほうが分かりやすいです。
age = 70
is_disabled = True
# 高齢者 もしくは 障害者手帳を持っていれば割引
if (age >= 65) or is_disabled:
print("割引対象です")
else:
print("通常料金です")
割引対象です
ここではage >= 65という「比較式」とis_disabledというブール値をorでつないでいます。
このような「式同士」の組み合わせはor、「候補の列挙」はinというイメージを持つと、きれいなコードを書きやすくなります。
not演算子をTrue/Falseで理解する
notでTrueとFalseを反転する基本

not演算子は、TrueとFalseをひっくり返す(反転させる)演算子です。
ルールは非常にシンプルです。
| 入力 | not 入力 の結果 |
|---|---|
| True | False |
| False | True |
サンプルで確認してみましょう。
# not 演算子の基本動作
print(not True) # True を反転するので False
print(not False) # False を反転するので True
is_member = True
print(not is_member) # is_member が True なので False が出力される
False
True
False
notは1つの条件だけに作用する単項演算子であり、条件式の前に付けて「逆の意味」にしたいときに使います。
条件の否定を読みやすく書くテクニック

notは便利ですが、使い方によっては読みづらい条件式になってしまうことがあります。
ポイントは、「日本語として自然かどうか」を意識することです。
例えば、次の2つの条件は意味としては同じです。
user = "Alice"
# パターン1: not を前に付ける
if not (user == ""):
print("ユーザー名が入力されています (パターン1)")
# パターン2: 比較を逆向きにして自然な条件にする
if user != "":
print("ユーザー名が入力されています (パターン2)")
ユーザー名が入力されています (パターン1)
ユーザー名が入力されています (パターン2)
多くの場合、パターン2のように「!=」を使ったほうが読みやすくなります。
同様に、Noneチェックでも書き方の工夫ができます。
user = None
# あまりおすすめしない書き方
if not (user is None):
print("ユーザーが存在します (not を使った書き方)")
# より読みやすい書き方
if user is not None:
print("ユーザーが存在します (is not を使った書き方)")
else:
print("ユーザーは存在しません")
ユーザーは存在しません
「notを使うより、比較演算子側を工夫したほうが読みやすい」ケースはよくあります。
コードを読む人の立場になって、どちらが直感的か意識すると良いです。
複雑な条件式でのnotと括弧の使い方

複雑な条件式でnotを使うときは、括弧の位置がとても重要になります。
括弧の位置によって、notがどこまでの範囲にかかるかが変わるからです。
典型的な例として、De Morgan(ド・モルガン)の法則があります。
not (A and B)は(not A) or (not B)と同じ意味not (A or B)は(not A) and (not B)と同じ意味
これをPythonで確認してみます。
# De Morgan の法則を Python で確認するサンプル
patterns = [
(True, True),
(True, False),
(False, True),
(False, False),
]
print("=== not (A and B) と (not A) or (not B) の比較 ===")
for a, b in patterns:
left = not (a and b)
right = (not a) or (not b)
print(f"A={a}, B={b} -> left={left}, right={right}")
print("\n=== not (A or B) と (not A) and (not B) の比較 ===")
for a, b in patterns:
left = not (a or b)
right = (not a) and (not b)
print(f"A={a}, B={b} -> left={left}, right={right}")
=== not (A and B) と (not A) or (not B) の比較 ===
A=True, B=True -> left=False, right=False
A=True, B=False -> left=True, right=True
A=False, B=True -> left=True, right=True
A=False, B=False -> left=True, right=True
=== not (A or B) と (not A) and (not B) の比較 ===
A=True, B=True -> left=False, right=False
A=True, B=False -> left=False, right=False
A=False, B=True -> left=False, right=False
A=False, B=False -> left=True, right=True
すべてのパターンでleftとrightが一致していることが分かります。
つまり、表現は違っても意味は同じということです。
実務では、次のような形で条件を書く場面がよくあります。
age = 17
has_permission = False
# 「年齢が18歳以上 かつ 権限を持っている」ことの否定
if not (age >= 18 and has_permission):
print("アクセス拒否")
else:
print("アクセス許可")
アクセス拒否
この条件は、「年齢が18歳未満または権限を持っていない」と読み替えることもできます。
場合によっては次のように書き換えたほうが読みやすくなるかもしれません。
age = 17
has_permission = False
if (age < 18) or (not has_permission):
print("アクセス拒否 (書き換え版)")
else:
print("アクセス許可 (書き換え版)")
アクセス拒否 (書き換え版)
notのかかる範囲を括弧で明確にしつつ、日本語として読みやすい形を選ぶことが、複雑な条件式を扱ううえでの重要なテクニックです。
まとめ
本記事では、Pythonの論理演算子and・or・notを、True/Falseという視点から体系的に解説しました。
andは「両方TrueならTrue」、orは「どちらか1つでもTrueならTrue」、notは「True/Falseを反転」というシンプルなルールに基づいています。
これらを比較演算子と組み合わせて使うことで、if文の条件を柔軟かつ表現豊かに書くことができます。
サンプルコードや真理値表を参考にしながら、実際に手を動かして条件式を書いてみることで、理解が一段と深まります。
