プログラミングで条件分岐を書いていると、こんな場面に出会うことがありませんか?
「年齢が18歳以上で、かつ学生証を持っている人だけ割引したい」
「パスワードが空か、または8文字未満なら警告を出したい」
「ログインしていない場合にのみ、ログイン画面を表示したい」
このように複数の条件を組み合わせて判定したいとき、Pythonの論理演算子が活躍します。
論理演算子は、複数の条件を「~かつ~」「~または~」「~でない」といった論理的な組み合わせで結合し、最終的にTrue(正しい)またはFalse(間違い)の判定を行います。
この記事では、Python初心者の方でも理解できるように:
- 論理演算子の基本的な種類と動作
- 実際のプログラムでの使用例
- よくある間違いと正しい書き方
- 実用的な活用パターン
これらを、豊富なサンプルコードと一緒に詳しく解説していきます。
論理演算子とは?|複数の条件を組み合わせる仕組み

論理演算子とは、複数の条件式を組み合わせて、その結果をTrue(真)またはFalse(偽)で返す演算子のことです。
Pythonの3つの論理演算子
演算子 | 意味 | 読み方 | 使用例 |
---|---|---|---|
and | 両方とも真なら真 | かつ、AND | A and B |
or | どちらかが真なら真 | または、OR | A or B |
not | 真偽を反転する | 否定、NOT | not A |
基本的な動作例
# 基本的な論理演算
print(True and True) # True
print(True and False) # False
print(False or True) # True
print(not True) # False
print(not False) # True
実行結果:
True
False
True
False
True
and演算子|「両方とも」を表現する
and演算子は、左側と右側の両方の条件がTrueの場合のみTrueを返します。
基本的な使い方
# 数値の範囲チェック
age = 25
if age >= 18 and age < 65:
print("働く世代です")
# 複数の条件を同時に満たす場合
score = 85
attendance = 90
if score >= 80 and attendance >= 80:
print("合格です!")
else:
print("不合格です")
実行結果:
働く世代です
合格です!
andの真理表
A | B | A and B |
---|---|---|
True | True | True |
True | False | False |
False | True | False |
False | False | False |
「両方ともOK」の時だけTrue
実用例:会員登録の条件チェック
def check_registration(username, password, email, age):
"""会員登録の条件をチェックする関数"""
# 全ての条件をチェック
if (username != "" and
len(password) >= 8 and
"@" in email and
age >= 13):
return "登録できます"
else:
return "条件を満たしていません"
# テスト
print(check_registration("太郎", "password123", "taro@example.com", 20))
print(check_registration("", "pass", "invalid-email", 10))
実行結果:
登録できます
条件を満たしていません
or演算子|「どちらかが」を表現する

or演算子は、左側または右側のどちらか一方でもTrueならTrueを返します。
基本的な使い方
# 曜日チェック
day = "土"
if day == "土" or day == "日":
print("週末です!")
# 複数の条件のうち一つでも満たせばOK
grade = "A"
bonus_points = 5
if grade == "A" or bonus_points >= 10:
print("特別賞を獲得!")
実行結果:
週末です!
特別賞を獲得!
orの真理表
A | B | A or B |
---|---|---|
True | True | True |
True | False | True |
False | True | True |
False | False | False |
「どちらか一つでもOK」ならTrue
実用例:エラーハンドリング
def validate_input(text):
"""入力値の検証"""
# 無効な入力パターンをチェック
if text == "" or text == None or len(text.strip()) == 0:
return "無効な入力です"
else:
return f"有効な入力: {text}"
# テスト
inputs = ["こんにちは", "", None, " ", "Python"]
for inp in inputs:
try:
result = validate_input(inp)
print(result)
except:
print("エラーが発生しました")
実行結果:
有効な入力: こんにちは
無効な入力です
エラーが発生しました
無効な入力です
有効な入力: Python
not演算子|「反対」を表現する

not演算子は、条件の真偽を反転させます。TrueならFalse、FalseならTrueになります。
基本的な使い方
# ログイン状態のチェック
is_logged_in = False
if not is_logged_in:
print("ログインしてください")
# リストが空でないかチェック
my_list = []
if not my_list: # 空のリストはFalseとして扱われる
print("リストが空です")
# 条件の否定
is_student = True
if not is_student:
print("学生ではありません")
else:
print("学生です")
実行結果:
ログインしてください
リストが空です
学生です
notの真理表
A | not A |
---|---|
True | False |
False | True |
実用例:権限チェック
def check_access(user_role, is_admin, is_active):
"""アクセス権限をチェックする関数"""
# 管理者でなく、かつアクティブでない場合はアクセス拒否
if not is_admin and not is_active:
return "アクセス拒否"
# その他の場合はアクセス許可
return "アクセス許可"
# テスト
print(check_access("user", False, True)) # 一般ユーザー、アクティブ
print(check_access("user", False, False)) # 一般ユーザー、非アクティブ
print(check_access("admin", True, False)) # 管理者、非アクティブ
実行結果:
アクセス許可
アクセス拒否
アクセス許可
論理演算子の組み合わせ
複数の論理演算子を組み合わせることで、より複雑な条件を表現できます。
基本的な組み合わせ例
# 複雑な条件の例
age = 22
is_student = True
has_id = True
# 18歳以上で、かつ(学生であるか、身分証を持っている)
if age >= 18 and (is_student or has_id):
print("入場できます")
# 学生でないか、または20歳未満
if not is_student or age < 20:
print("学割は適用されません")
else:
print("学割が適用されます")
実行結果:
入場できます
学割が適用されます
演算子の優先順位
Pythonでは、論理演算子の優先順位は以下の通りです:
not
(最高優先度)and
or
(最低優先度)
# 優先順位の例
result1 = True or False and False # True or (False and False) = True
result2 = not True or False # (not True) or False = False
print(f"True or False and False = {result1}")
print(f"not True or False = {result2}")
# 括弧で明示的に優先順位を指定
result3 = (True or False) and False # (True or False) and False = False
print(f"(True or False) and False = {result3}")
実行結果:
True or False and False = True
not True or False = False
(True or False) and False = False
短絡評価

Pythonの論理演算子は短絡評価を行います。これは効率性のための重要な特徴です。
and演算子の短絡評価
def check_positive(x):
"""正の数かチェック(副作用のある関数の例)"""
print(f"check_positive({x}) が呼ばれました")
return x > 0
# 最初の条件がFalseなら、2番目の関数は呼ばれない
result = False and check_positive(5)
print(f"結果: {result}")
print("---")
# 最初の条件がTrueなら、2番目の関数も呼ばれる
result = True and check_positive(5)
print(f"結果: {result}")
実行結果:
結果: False
---
check_positive(5) が呼ばれました
結果: True
or演算子の短絡評価
def check_negative(x):
"""負の数かチェック"""
print(f"check_negative({x}) が呼ばれました")
return x < 0
# 最初の条件がTrueなら、2番目の関数は呼ばれない
result = True or check_negative(-5)
print(f"結果: {result}")
print("---")
# 最初の条件がFalseなら、2番目の関数も呼ばれる
result = False or check_negative(-5)
print(f"結果: {result}")
実行結果:
結果: True
---
check_negative(-5) が呼ばれました
結果: True
よくある間違いと対処法

間違い1:比較演算子の連続使用
x = 7
# 間違った書き方
# if x > 5 and < 10: # 構文エラー!
# 正しい書き方
if x > 5 and x < 10:
print("5より大きく10より小さい")
# もっと簡潔な書き方(Pythonの特徴)
if 5 < x < 10:
print("5より大きく10より小さい")
間違い2:論理演算子とビット演算子の混同
# 間違い:ビット演算子を論理演算子として使用
# if True & True: # 動作するが推奨されない
# 正しい:論理演算子を使用
if True and True:
print("論理演算子を使いましょう")
# 数値での比較
a, b = 5, 3
print(f"論理演算: {(a > 0) and (b > 0)}") # True
print(f"ビット演算: {a & b}") # 1(ビット単位のAND)
実行結果:
論理演算子を使いましょう
論理演算: True
ビット演算: 1
間違い3:Falsy値の理解不足
Pythonでは、以下の値はFalse(偽として扱われる)値です:
# Falsy値の例
falsy_values = [False, 0, 0.0, "", [], {}, None]
for value in falsy_values:
if not value:
print(f"{repr(value)} は Falsy です")
print("---")
# Truthy値の例
truthy_values = [True, 1, "hello", [1], {"key": "value"}]
for value in truthy_values:
if value:
print(f"{repr(value)} は Truthy です")
実行結果:
False は Falsy です
0 は Falsy です
0.0 は Falsy です
'' は Falsy です
[] は Falsy です
{} は Falsy です
None は Falsy です
---
True は Truthy です
1 は Truthy です
'hello' は Truthy です
[1] は Truthy です
{'key': 'value'} は Truthy です
実用的な活用例

例1:フォーム入力の検証
def validate_user_form(name, email, age, terms_accepted):
"""ユーザー登録フォームの検証"""
errors = []
# 名前のチェック
if not name or len(name.strip()) < 2:
errors.append("名前は2文字以上で入力してください")
# メールのチェック
if not email or "@" not in email or "." not in email:
errors.append("有効なメールアドレスを入力してください")
# 年齢のチェック
if not (13 <= age <= 120):
errors.append("年齢は13歳以上120歳以下で入力してください")
# 利用規約のチェック
if not terms_accepted:
errors.append("利用規約に同意してください")
# 結果の返却
if errors:
return False, errors
else:
return True, ["登録可能です"]
# テスト
test_cases = [
("太郎", "taro@example.com", 25, True),
("", "invalid-email", 10, False),
("花子", "hanako@test.jp", 30, True)
]
for name, email, age, terms in test_cases:
is_valid, messages = validate_user_form(name, email, age, terms)
print(f"入力: {name}, {email}, {age}, {terms}")
print(f"結果: {is_valid}")
for message in messages:
print(f" - {message}")
print()
実行結果:
入力: 太郎, taro@example.com, 25, True
結果: True
- 登録可能です
入力: , invalid-email, 10, False
結果: False
- 名前は2文字以上で入力してください
- 有効なメールアドレスを入力してください
- 年齢は13歳以上120歳以下で入力してください
- 利用規約に同意してください
入力: 花子, hanako@test.jp, 30, True
結果: True
- 登録可能です
例2:ゲームのレベル判定システム
def determine_level(score, time_played, achievements):
"""プレイヤーのレベルを判定する"""
# 初心者レベル
if score < 100 or time_played < 10:
return "初心者"
# 中級者レベル
elif (100 <= score < 500) and (10 <= time_played < 50):
return "中級者"
# 上級者レベル
elif (score >= 500) and (time_played >= 50) and (achievements >= 5):
return "上級者"
# マスターレベル
elif (score >= 1000) and (time_played >= 100) and (achievements >= 10):
return "マスター"
# その他
else:
return "判定不能"
# テスト
players = [
{"name": "初心者太郎", "score": 50, "time": 5, "achievements": 1},
{"name": "中級者花子", "score": 300, "time": 30, "achievements": 3},
{"name": "上級者次郎", "score": 800, "time": 80, "achievements": 8},
{"name": "マスター三郎", "score": 1500, "time": 150, "achievements": 15}
]
for player in players:
level = determine_level(player["score"], player["time"], player["achievements"])
print(f"{player['name']}: {level}")
実行結果:
初心者太郎: 初心者
中級者花子: 中級者
上級者次郎: 上級者
マスター三郎: マスター
よくある質問(FAQ)

Q1:andとorを同時に使うとき、括弧は必要?
A1: 演算子の優先順位により、括弧がなくても動作しますが、可読性のために括弧を使うことを推奨します。
# 括弧なし(動作するが分かりにくい)
if age >= 18 and is_student or has_discount_card:
pass
# 括弧あり(意図が明確)
if (age >= 18 and is_student) or has_discount_card:
pass
Q2:複数の値を一度にチェックするには?
A2: in
演算子と組み合わせることで簡潔に書けます。
# 複数のor条件
if day == "土" or day == "日" or day == "祝":
print("休日です")
# inを使ってより簡潔に
if day in ["土", "日", "祝"]:
print("休日です")
Q3:Noneのチェックはどう書くべき?
A3: is
演算子を使用することが推奨されます。
value = None
# 推奨される書き方
if value is None:
print("値がありません")
# not と組み合わせる場合
if value is not None:
print("値があります")
まとめ
Pythonの論理演算子は、複雑な条件判定を可能にする重要な機能です。
重要なポイント:
and
:両方の条件がTrueの場合のみTrueor
:どちらか一方でもTrueならTruenot
:真偽を反転させる- 短絡評価により効率的に動作する
- 優先順位は
not
>and
>or
- 括弧を使って意図を明確にする
コメント