閉じる

【Python入門】and・or・not論理演算子をTrue/Falseで徹底理解

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)としてTrueFalseを使います。

これらはPythonの組み込みの値であり、次のような特徴があります。

  • TrueFalseは、型としてはbool
  • 主に比較演算の結果として得られる
    (例:5 > 3age >= 20 など)
  • if文などの条件式で評価される

実際に、PythonでTrueとFalseがどう扱われるかを確認してみます。

Python
# 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にまとめる役割を果たします。

Python
age = 30

# 20歳以上 かつ 65歳未満 なら大人料金
if (age >= 20) and (age < 65):
    print("大人料金です")
else:
    print("割引料金です")
実行結果
大人料金です

この例では、次のような流れで評価されます。

  1. age >= 20 が True か False か評価される
  2. age < 65 が True か False か評価される
  3. それらを and で組み合わせて、最終的なTrue/Falseを決める
  4. 結果がTrueならifブロック、Falseならelseブロックが実行される

このように、論理演算子はif文の「判断材料をまとめる」存在であると理解するとすっきりします。

and演算子をTrue/Falseで理解する

andの評価ルールと真理値表

and演算子の基本ルールは「両方ともTrueのときだけTrue」です。

まずは真理値表で確認します。

andの真理値表は次のようになります。

条件A条件BA and B の結果
TrueTrueTrue
TrueFalseFalse
FalseTrueFalse
FalseFalseFalse

この表から分かるように、1つでもFalseが混ざると結果はFalseになります。

日常の言葉で言うと、「AかつB」という表現にあたります。

実際に、True/Falseを組み合わせて確認してみます。

Python
# 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つの条件で絞り込む例を示します。

Python
# 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つのコードは、同じ条件を表しています。

Python
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を使うと、条件ごとに違うメッセージを出すこともできます。

Python
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条件BA or B の結果
TrueTrueTrue
TrueFalseTrue
FalseTrueTrue
FalseFalseFalse

andと逆に、両方FalseのときだけFalseになります。

日本語では「AまたはB」という表現にあたります。

True/Falseの組み合わせを確認してみます。

Python
# 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」

次は、曜日と祝日フラグをもとに「お休みかどうか」を判定する例です。

Python
# 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演算子でスッキリ書き換えられます。

例えば、次のような例です。

Python
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のほうが分かりやすいです。

Python
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 入力 の結果
TrueFalse
FalseTrue

サンプルで確認してみましょう。

Python
# 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つの条件は意味としては同じです。

Python
user = "Alice"

# パターン1: not を前に付ける
if not (user == ""):
    print("ユーザー名が入力されています (パターン1)")

# パターン2: 比較を逆向きにして自然な条件にする
if user != "":
    print("ユーザー名が入力されています (パターン2)")
実行結果
ユーザー名が入力されています (パターン1)
ユーザー名が入力されています (パターン2)

多くの場合、パターン2のように「!=」を使ったほうが読みやすくなります

同様に、Noneチェックでも書き方の工夫ができます。

Python
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で確認してみます。

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

すべてのパターンでleftrightが一致していることが分かります。

つまり、表現は違っても意味は同じということです。

実務では、次のような形で条件を書く場面がよくあります。

Python
age = 17
has_permission = False

# 「年齢が18歳以上 かつ 権限を持っている」ことの否定
if not (age >= 18 and has_permission):
    print("アクセス拒否")
else:
    print("アクセス許可")
実行結果
アクセス拒否

この条件は、「年齢が18歳未満または権限を持っていない」と読み替えることもできます。

場合によっては次のように書き換えたほうが読みやすくなるかもしれません。

Python
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文の条件を柔軟かつ表現豊かに書くことができます。

サンプルコードや真理値表を参考にしながら、実際に手を動かして条件式を書いてみることで、理解が一段と深まります。

クラウドSSLサイトシールは安心の証です。

URLをコピーしました!