条件を組み合わせる:複合条件と条件分岐のネスト#

はじめに#

前回までの記事では、if文、elif文、else文を使った条件分岐の基本について学んできました。実際のプログラムでは、さらに複雑な判断が必要になることがよくあります。例えば、「20歳以上で、かつ身分証明書を持っている人だけがお酒を購入できる」といった複数の条件を同時に確認する必要があるケースです。

この記事では、複数の条件を組み合わせる「複合条件」と、条件分岐の中にさらに条件分岐を入れる「条件分岐のネスト」について詳しく学んでいきます。これらの技術を使いこなすことで、より実用的で複雑なプログラムを作成できるようになります。

複合条件:論理演算子を使った条件の組み合わせ#

複合条件を作成するには、以前学んだ論理演算子(and, or, not)を使います。おさらいとして、それぞれの演算子の働きを確認しておきましょう。

  • and:両方の条件が真(True)のときだけ、結果が真になる
  • or:少なくとも一方の条件が真のとき、結果が真になる
  • not:条件の結果を反転させる(真→偽、偽→真)

andを使った複合条件#

and演算子は、両方の条件が真である場合にのみ、全体の結果が真になります。例えば、お酒を購入できる条件(20歳以上かつ身分証明書あり)を表現してみましょう。

>
# andを使った複合条件
age = 22
has_id = True

# 年齢と身分証明書の両方をチェック
if age >= 20 and has_id:
    print("お酒を購入できます。")
else:
    print("お酒を購入できません。")
お酒を購入できます。

この例では、age >= 20has_idの両方が真なので、条件全体が真となり、「お酒を購入できます」というメッセージが表示されます。

どちらか一方でも条件を満たさない場合は、結果が偽になります。

>
# 条件の一部が偽の場合
age = 19  # 20歳未満
has_id = True

if age >= 20 and has_id:
    print("お酒を購入できます。")
else:
    print("お酒を購入できません。")
お酒を購入できません。

orを使った複合条件#

or演算子は、少なくとも一方の条件が真であれば、全体の結果が真になります。例えば、割引の対象者(学生または65歳以上のシニア)を判定する条件を表現してみましょう。

>
# orを使った複合条件
age = 70
is_student = False

# 学生または65歳以上かをチェック
if is_student or age >= 65:
    print("割引が適用されます。")
else:
    print("通常料金です。")
割引が適用されます。

この例では、is_studentは偽ですが、age >= 65が真なので、条件全体が真となり、「割引が適用されます」というメッセージが表示されます。

notを使った条件の否定#

not演算子は、条件の結果を反転させます。例えば、「満席でない場合」という条件を表現するために使えます。

>
# notを使った条件の否定
is_full = False

if not is_full:
    print("予約可能です。")
else:
    print("満席です。予約できません。")
予約可能です。

この例では、is_fullは偽(False)なので、not is_fullは真(True)となり、「予約可能です」というメッセージが表示されます。

3つ以上の条件の組み合わせ#

複数の論理演算子を組み合わせて、より複雑な条件を作ることもできます。例えば、「平日の9時から17時までの間」という条件を表現してみましょう。

>
# 3つ以上の条件の組み合わせ
is_weekday = True
hour = 14

# 平日の9時から17時までかをチェック
if is_weekday and hour >= 9 and hour < 17:
    print("営業時間内です。")
else:
    print("営業時間外です。")
営業時間内です。

この例では、3つの条件(is_weekdayhour >= 9hour < 17)がすべて真なので、条件全体が真となります。

複合条件の実用例:ログインの検証#

複合条件の使用例を見ていきましょう。ユーザー名とパスワードの両方が正しい場合にのみログインを許可する例です。

>
# ログイン検証
correct_username = "user123"
correct_password = "pass456"

username = input("ユーザー名を入力してください: ")
password = input("パスワードを入力してください: ")

if username == correct_username and password == correct_password:
    print("ログイン成功!")
else:
    print("ユーザー名またはパスワードが間違っています。")

実行例:

ユーザー名を入力してください: user123
パスワードを入力してください: pass456
ログイン成功!

条件分岐のネスト:条件の中の条件#

条件分岐のネスト(入れ子)とは、if文の中に別のif文を入れることです。これにより、より細かい条件分岐を実装できます。

基本的なネストの例#

まずは、シンプルなネストの例を見てみましょう。

>
# 基本的なネストの例
has_ticket = True
bag_size = "大"

if has_ticket:
    print("チケットを確認しました。")

    # チケットを持っている場合のみ、バッグサイズをチェック
    if bag_size == "小":
        print("そのまま入場できます。")
    elif bag_size == "中":
        print("別途手荷物チェックが必要です。")
    else:
        print("大きな荷物は預ける必要があります。")
else:
    print("チケットがありません。チケット売り場にお越しください。")
チケットを確認しました。
大きな荷物は預ける必要があります。

この例では、まずhas_ticketが真かどうかをチェックし、真の場合にのみ内側のif文でバッグサイズをチェックしています。

深いネストと可読性#

条件分岐をネストすると、コードの構造が複雑になりがちです。あまりに深いネスト(たくさんのif文が入れ子になっている状態)は、コードの読みにくさにつながります。一般的には、3レベル(3階層)以上のネストは避けるべきとされています。

>
# 深いネストの例(あまり良くない例)
user_type = "プレミアム"
is_logged_in = True
has_subscription = True
subscription_expired = False

if is_logged_in:
    print("ログイン済みです。")

    if user_type == "プレミアム":
        print("プレミアム機能が利用可能です。")

        if has_subscription:
            print("サブスクリプションがあります。")

            if not subscription_expired:
                print("コンテンツを視聴できます。")
            else:
                print("サブスクリプションが期限切れです。更新してください。")
        else:
            print("サブスクリプションを購入してください。")
    else:
        print("通常ユーザーです。基本機能のみ利用可能です。")
else:
    print("ログインしてください。")
ログイン済みです。
プレミアム機能が利用可能です。
サブスクリプションがあります。
コンテンツを視聴できます。

このような深いネストは理解しにくいため、次のように条件分岐を整理しましょう。

>
# 改善例:複合条件を使用
user_type = "プレミアム"
is_logged_in = True
has_subscription = True
subscription_expired = False

if not is_logged_in:
    print("ログインしてください。")
elif user_type != "プレミアム":
    print("通常ユーザーです。基本機能のみ利用可能です。")
elif not has_subscription:
    print("サブスクリプションを購入してください。")
elif subscription_expired:
    print("サブスクリプションが期限切れです。更新してください。")
else:
    print("ログイン済みです。")
    print("プレミアム機能が利用可能です。")
    print("サブスクリプションがあります。")
    print("コンテンツを視聴できます。")
ログイン済みです。
プレミアム機能が利用可能です。
サブスクリプションがあります。
コンテンツを視聴できます。

この改善例では、深いネストを避け、条件を早い段階でチェックすることで、コードが読みやすくなっています。

まとめ#

この記事では、複合条件と条件分岐のネストについて学びました。

  • 複合条件:論理演算子(and, or, not)を使って複数の条件を組み合わせる方法
  • 論理演算子の優先順位と括弧の使用
  • 条件分岐のネスト:if文の中に別のif文を入れることによる細かい条件分岐
  • ネストを深くしすぎないための工夫

これらの技術を使いこなすことで、より複雑で実用的なプログラムを作成できるようになります。条件の組み合わせや入れ子構造を工夫することで、多様な状況に対応できるプログラムを効率的に記述することが可能です。

実際のプログラムでは、複合条件と条件分岐のネストを適切に使い分けることが重要です。ネストが深すぎると読みにくいコードになりますので、可能な限りシンプルに書くことを意識しましょう。