【初心者向け】Pythonの論理演算子and・or・notを理解して条件分岐を使いこなそう

2025年4月23日水曜日

Python

この記事では、Pythonの論理演算子を使った条件分岐の基本から応用まで、初心者の方にも分かりやすく解説していきます!

プログラミング学習でよく登場する `if` 文。単一の条件なら書けるけど、「もし〇〇で、かつ××だったら…」とか「△△、または□□の場合…」みたいに、ちょっと複雑な条件を指定したいとき、どう書けばいいか迷うこと、ありますよね?

そんな時に活躍するのが「論理演算子」です。`and`、`or`、`not` の3つを使いこなせれば、プログラムがもっと賢く、柔軟に動くようになりますよ!

この記事で学べること

  • 論理演算子って何?なぜ必要なの?が分かる
  • `and`, `or`, `not` の基本的な意味と使い方が分かる
  • `if` 文で複数の条件を組み合わせる方法が分かる
  • 論理演算子を使うときの注意点やよくあるミスが分かる
  • 条件分岐をもっとうまく書くコツが分かる

Pythonの論理演算子とは?条件分岐のキホンを理解しよう

論理演算子っていうのは、プログラムの世界で「条件」を扱うための特別な道具みたいなものです。

例えば、ゲームで「レベル10以上で、かつ特定のアイテムを持っている」プレイヤーだけが進める扉があるとします。この「かつ」の部分を実現するのが論理演算子の役目です。

プログラムはよく、「もし〇〇なら、Aの処理をする。そうでなければBの処理をする」というように、条件によって動きを変えます。この「もし〇〇なら」の部分を「条件分岐」と呼び、Pythonでは `if` 文などを使って書きますね。

論理演算子を使うと、この「〇〇」の部分をもっと複雑に、もっと現実に近い条件に設定できるんです。

論理演算子が扱うのは、基本的に「真(True)」か「偽(False)」のどちらかの結果(ブール値や真偽値と呼びます)です。

「レベルは10以上ですか?」→ Yesなら `True`、Noなら `False`。「アイテムを持っていますか?」→ Yesなら `True`、Noなら `False`。論理演算子は、これらの `True` や `False` を組み合わせて、最終的な判断(扉を開けるかどうか)を下す手伝いをします。

Pythonの論理演算子の種類と基本的な使い方

Pythonでよく使う論理演算子は、主に以下の3つです。それぞれの意味と動きを見ていきましょう!

  • `and` (論理積) 
    日本語でいう「かつ」。両方の条件が `True` のときだけ、結果が `True` になります。
  • `or` (論理和) 
    日本語でいう「または」。どちらか一方でも条件が `True` なら、結果は `True` になります。
  • `not` (否定) 
    日本語でいう「〜でない」。条件の `True`/`False` をひっくり返します。

それぞれの演算子が、`True` と `False` の組み合わせでどういう結果を返すか、表(真理値表といいます)で見てみましょう。

AND演算 (A and B)

+-------+-------+---------+
|   A   |   B   | A and B |
+-------+-------+---------+
| True  | True  |  True   |
| True  | False |  False  |
| False | True  |  False  |
| False | False |  False  |
+-------+-------+---------+

OR演算 (A or B)

+-------+-------+--------+
|   A   |   B   | A or B |
+-------+-------+--------+
| True  | True  |  True  |
| True  | False |  True  |
| False | True  |  True  |
| False | False |  False |
+-------+-------+--------+

NOT演算 (not A)

+-------+-------+
|   A   | not A |
+-------+-------+
| True  | False |
| False | True  |
+-------+-------+

この表が頭に入っていると、条件分岐を考えるときにとても役立ちますよ!

論理積andの使い方と具体例

`and` は、「〇〇であり、かつ××である」という条件を表したいときに使います。

2つの条件が両方とも `True` のときだけ、全体の結果が `True` になるんでしたね。どちらか一方でも `False` があれば、結果は `False` になります。

実際のコードで動きを確認してみましょう。

# and の例
x = 10
y = 5

print(x > 0 and y > 0)  # xもyも0より大きい → True and True → True
print(x > 0 and y < 0)  # xは0より大きいが、yは0より小さくない → True and False → False
print(x < 0 and y > 0)  # xは0より大きくない → False and True → False
print(x < 0 and y < 0)  # xもyも0より大きくない → False and False → False

# ログイン処理のイメージ
user_id_ok = True
password_ok = True
print(user_id_ok and password_ok) # 両方OKなので True

password_ok = False
print(user_id_ok and password_ok) # パスワードが違うので False

このように、複数の条件がすべて満たされているかを確認したい場合に `and` が活躍します。

例えば、オンラインショップで「会員であり、かつクーポンを持っている」ユーザーに割引を適用する、なんて場面で使えそうですね。

論理和orの使い方と具体例

`or` は、「〇〇である、または××である」という条件を表したいときに使います。

2つの条件のうち、どちらか一方でも `True` であれば、全体の結果が `True` になります。両方 `False` のときだけ、結果が `False` になるのがポイントです。

コードで見てみましょう。

# or の例
x = 10
y = -5

print(x > 0 or y > 0)  # xは0より大きい → True or False → True
print(x > 0 or y < 0)  # xもyも条件を満たす → True or True → True (y < 0もTrue)
print(x < 0 or y > 0)  # どちらの条件も満たさない → False or False → False
print(x < 0 or y < 0)  # yは0より小さい → False or True → True

# アクセス権限のイメージ
is_admin = False
is_editor = True
print(is_admin or is_editor) # 編集者なので True (アクセス許可)

is_admin = False
is_editor = False
print(is_admin or is_editor) # どちらでもないので False (アクセス拒否)

このように、複数の条件のうち、少なくとも1つ満たされていればOKという場合に `or` が便利です。例えば、遊園地で「子供料金が適用されるのは、小学生または未就学児」といった条件に使えそうですね。

否定notの使い方と具体例

`not` は、ちょっと毛色が違って、条件の結果(`True` または `False`)をひっくり返す働きをします。

`True` の条件に `not` をつけると `False` になり、`False` の条件につけると `True` になります。シンプル!

# not の例
is_active = True
print(not is_active)  # True を反転 → False

is_empty = False
print(not is_empty)   # False を反転 → True

x = 5
print(not x > 10) # x > 10 は False なので、それを反転 → True
print(not x < 10) # x < 10 は True なので、それを反転 → False

# ファイルが存在しない場合に何かするイメージ
file_exists = False
if not file_exists:
  print("ファイルが見つかりません。")
# 出力: ファイルが見つかりません。

`not` は、「〇〇でない」という条件を表現したいときに使います。「エラーが発生していない場合」や「リストが空でない場合」のように、特定の状態でないことを確認するのによく使われます。

Pythonのif文で論理演算子を使った条件分岐を実装

さて、いよいよ本番です!これまで学んだ `and`, `or`, `not` を、実際の `if` 文の中で使ってみましょう。

`if` 文では、条件式の結果が `True` か `False` かによって、実行する処理を分けますよね。論理演算子を使うことで、この条件式をより複雑に組み立てることができます。

条件式では、数値や文字列を比較する「比較演算子」もよく使います。これらと比較演算子を組み合わせるのが基本パターンです。比較演算子、覚えてますか?

  • `==` : 等しい
  • `!=` : 等しくない
  • `>` : より大きい
  • `<` : より小さい
  • `>=` : 以上
  • `<=` : 以下

これらと `and`, `or`, `not` を組み合わせることで、かなり複雑な条件も表現できるようになりますよ!

andを使った複数条件のif

まずは `and` を使った例です。「〇〇であり、かつ××である」条件を満たした場合に処理を実行します。

例えば、テストの点数と出席率の両方が基準を満たした場合に「合格」と表示するプログラムを考えてみましょう。

score = 85
attendance_rate = 0.95 # 出席率95%

# 点数が70点以上、かつ出席率が80%以上なら合格
if score >= 70 and attendance_rate >= 0.8:
  print("合格です!おめでとうございます!")
elif score >= 70:
  print("点数は良いですが、出席率が足りません…")
else:
  print("残念ながら不合格です。")

# 出力: 合格です!おめでとうございます!

# 条件を変えてみる
score = 60
attendance_rate = 0.90

if score >= 70 and attendance_rate >= 0.8:
  print("合格です!おめでとうございます!")
elif score >= 70:
  print("点数は良いですが、出席率が足りません…")
elif attendance_rate >= 0.8:
  print("出席率は良いですが、点数が足りません…")
else:
  print("残念ながら不合格です。")

# 出力: 出席率は良いですが、点数が足りません…

このように、`if` の条件式部分に `and` を使って複数の条件をつなげることで、両方の条件を満たす場合のみ特定の処理を実行させることができます。

`elif` (else if) を使うと、さらに細かく条件を分けられますね。

orを使った複数条件のif

次は `or` です。「〇〇である、または××である」という、いずれかの条件を満たせば良い場合に処理を実行します。

例えば、曜日を判定して、土曜日か日曜日だったら「休日です」と表示するプログラムを作ってみましょう。

day = "日曜日"

# 土曜日または日曜日なら休日
if day == "土曜日" or day == "日曜日":
  print("今日は休日です。ゆっくり休みましょう!")
else:
  print("今日は平日です。頑張りましょう!")

# 出力: 今日は休日です。ゆっくり休みましょう!

# 平日の場合
day = "水曜日"

if day == "土曜日" or day == "日曜日":
  print("今日は休日です。ゆっくり休みましょう!")
else:
  print("今日は平日です。頑張りましょう!")

# 出力: 今日は平日です。頑張りましょう!

`if` の条件式で `or` を使うと、複数の条件のうちどれか1つでも当てはまれば処理が実行されます。割引キャンペーンで「新規顧客またはVIP会員は割引」といった条件にも使えそうです。

notを使った条件の否定

最後に `not` です。条件が成り立たない場合に処理を実行したいときに使います。

例えば、特定のユーザー(例: 'guest')以外のユーザーがログインした場合に「ようこそ!」と表示するプログラムを考えてみましょう。

user = "Taro"

# userが 'guest' でない場合にメッセージを表示
if not user == "guest":
  print(f"ようこそ、{user}さん!")
else:
  print("ゲストとしてログイン中です。")

# 出力: ようこそ、Taroさん!

# ゲストの場合
user = "guest"

if not user == "guest":
  print(f"ようこそ、{user}さん!")
else:
  print("ゲストとしてログイン中です。")

# 出力: ゲストとしてログイン中です。

# リストが空でないかチェックする例 (よく使います)
my_list = [1, 2, 3]
if not not my_list: # not my_list は my_listが空ならTrue、空でなければFalse
  print("リストには要素があります。")
else:
  print("リストは空です。")

# 出力: リストには要素があります。
# 注意: 空のリスト [] は False として扱われるため、not [] は True になります。
# なので、 if my_list: と書くのと同じ意味になります。(こっちの方が一般的)

`not` は条件を反転させるので、「〇〇ではない」という条件をシンプルに書くことができます。特に `if not ...` の形は、何かが「無い」ことや「偽である」ことを確認するのによく使われるパターンです。条件が `False` であることを確認したい場合に有効です。

Python論理演算子を使う上での注意点とよくあるミス

論理演算子は便利ですが、いくつか注意点と、初心者がやりがちなミスがあります。ここをしっかり押さえて、エラーを未然に防ぎましょう!

比較演算子 `==` と 代入演算子 `=` の混同

これは本当によくあるミスです! `if x = 5:` のように `=` を1つだけ書くと、「xに5を代入する」という意味になってしまい、条件比較になりません。正しくは `if x == 5:` のように `==` と2つ重ねて書きます。間違えると、意図しない動作になったり、エラーになったりします。
# ダメな例
x = 10
if x = 5: # これは代入。エラーになるか、意図しない動きに。
    print("xは5")

# 正しい例
if x == 5: # これが比較!
    print("xは5")
    

演算子の優先順位

`and`, `or`, `not` には計算される順番(優先順位)があります。一般的に、`not` が一番先に評価され、次に `and`、最後に `or` が評価されます。比較演算子 (`>`, `==` など) は論理演算子よりも先に評価されます。

例えば `True or False and False` は、`and` が先に評価されるので `True or (False and False)` → `True or False` → `True` となります。

意図しない順番で評価されると、思った通りの結果にならないことがあります。自信がないときや、複雑な条件を書くときは、括弧 `()` を使って評価の順番を明示するのがおすすめです!

例: `(age >= 18 and has_ticket) or is_vip` のように書けば、`and` の部分が先に評価されることが明確になりますね。
print(True or False and False) # and が先 → True or False → True
print((True or False) and False) # or を先に → True and False → False
    

短絡評価 (ショートサーキット)

これは少し高度な話ですが、知っておくと役立ちます。Pythonの論理演算子は、結果が確定した時点で評価を打ち切ることがあります。

- `and` の場合: 左側の条件が `False` だったら、右側の条件を見なくても結果は `False` だと確定します。なので、右側の条件式は評価(実行)されません。
- `or` の場合: 左側の条件が `True` だったら、右側の条件を見なくても結果は `True` だと確定します。なので、右側の条件式は評価(実行)されません。

これを知らないと、右側の条件式に何か処理(例えば関数呼び出し)を書いていた場合に、実行されたりされなかったりして混乱する可能性があります。
def check_a():
    print("Aをチェック")
    return False

def check_b():
    print("Bをチェック")
    return True

print("--- and の短絡評価 ---")
if check_a() and check_b(): # check_a() が False なので check_b() は実行されない
    print("両方OK")
else:
    print("ダメでした")
# 出力:
# Aをチェック
# --- and の短絡評価 ---
# ダメでした

print("\n--- or の短絡評価 ---")
def check_c():
    print("Cをチェック")
    return True

def check_d():
    print("Dをチェック")
    return False

if check_c() or check_d(): # check_c() が True なので check_d() は実行されない
    print("どちらかOK")
else:
    print("両方ダメ")
# 出力:
# --- or の短絡評価 ---
# Cをチェック
# どちらかOK
    

これらの点に気をつけるだけで、バグをぐっと減らせるはずです!

論理演算子を使いこなすための応用テクニック

基本と注意点がわかったところで、もう少しだけステップアップしてみましょう!

論理演算子を使って、もっと読みやすく、もっと効率的なコードを書くためのコツをいくつか紹介します。

括弧 `()` を積極的に使う

先ほどの注意点でも触れましたが、`and` や `or` が混在する複雑な条件式では、括弧を使って評価の順番を明確にすることが非常に効果的です。

どこからどこまでが一つの条件のかたまりなのかが視覚的に分かりやすくなり、自分だけでなく、他の人がコードを読むときにも理解しやすくなります。

「優先順位を覚えるのが面倒!」という方も、括弧を使えば迷うことがありません。読みやすさは正義!迷ったら括弧をつけましょう。
# ちょっと複雑な条件
age = 25
is_student = True
has_coupon = False

# 括弧がないと、どこから評価されるか少し考えないと分からないかも?
# if age < 20 or is_student and has_coupon: ...

# 括弧で区切ると意図が明確になる
# 例1: (20歳未満か学生) であり、かつクーポンを持っている場合
if (age < 20 or is_student) and has_coupon:
    print("割引A適用")
# 例2: 20歳未満であるか、または (学生であり、かつクーポンを持っている) 場合
elif age < 20 or (is_student and has_coupon):
    print("割引B適用")
else:
    print("割引なし")

条件式を変数に入れる

条件式があまりにも長くなってしまうと、`if` 文の行が読みにくくなることがあります。

そんなときは、条件式の結果を一度、意味の分かる名前をつけた変数に入れてから `if` 文で使うと、コードがスッキリして可読性が上がります。
# 条件が長い例
# if (user_level >= 10 and last_login_days <= 7) or (is_premium_member and purchase_amount >= 10000): ...

# 条件を変数に入れる
is_active_high_level_user = user_level >= 10 and last_login_days <= 7
is_high_spending_premium = is_premium_member and purchase_amount >= 10000

if is_active_high_level_user or is_high_spending_premium:
    print("特別キャンペーン対象です!")
else:
    print("通常会員です。")
    
どうでしょう? `if` 文のところがだいぶスッキリして、どんな条件で判定しているのかが分かりやすくなりましたよね!

ブール値を返す関数を活用する

特定の条件チェックを何度も行う場合、そのチェック処理を `True` か `False` を返す関数にしてしまうのも良い方法です。

関数名で「何を確認しているのか」を表現できるため、コードの意図がより明確になります。
def is_adult(age):
  """年齢が成人(20歳以上)か判定する関数"""
  return age >= 20

def has_valid_license(user_info):
  """有効な免許証を持っているか判定する関数(仮)"""
  # ここで複雑なチェック処理があると仮定
  return user_info.get("license_valid", False)

user_age = 25
user_data = {"license_valid": True}

# 関数を使って条件を判定
if is_adult(user_age) and has_valid_license(user_data):
  print("運転可能です。")
else:
  print("運転できません。")
    
関数を使うことで、`if` 文の条件式がシンプルになり、メインの処理の流れが追いやすくなります。

これらのテクニックを使って、より洗練された条件分岐を書いてみてください!


【まとめ】Pythonの論理演算子と条件分岐を使いこなそう!

この記事では、Pythonの論理演算子 `and`, `or`, `not` について、基本的な意味から `if` 文での使い方、注意点、そして応用テクニックまで解説してきました。

もう一度、ポイントをおさらいしておきましょう。

  • `and` は「かつ」(両方TrueならTrue)
  • `or` は「または」(どちらかTrueならTrue)
  • `not` は「でない」(True/Falseを反転)
  • `if` 文でこれらを比較演算子と組み合わせることで、複雑な条件分岐が書ける
  • `=` と `==` の間違い、演算子の優先順位、短絡評価に注意!
  • 括弧や変数、関数を使って読みやすいコードを心がけよう!

論理演算子と条件分岐は、プログラミングの本当に基本的な部分ですが、使いこなせると作れるプログラムの幅がぐんと広がります。

最初は少し難しく感じるかもしれませんが、実際に自分でコードを書いて動かしてみるのが一番の近道です!

今日学んだことを活かして、ぜひ身の回りの問題をプログラムで解決できないか考えてみたり、簡単なゲームのルールを条件分岐で表現してみたりしてください。エラーが出ても大丈夫。それも学びの一部です!

【関連記事】 「Pythonとは?」に答える最初の一歩

このブログを検索

  • ()

自己紹介

自分の写真
リモートワークでエンジニア兼Webディレクターとして活動しています。プログラミングやAIなど、日々の業務や学びの中で得た知識や気づきをわかりやすく発信し、これからITスキルを身につけたい人にも役立つ情報をお届けします。 note → https://note.com/yurufuri X → https://x.com/mnao111

QooQ