3. 条件分岐で判定する

目次

この講座で使用する Google Colab の URL

3. 条件分岐で判定する (Google Colab)

演習課題

Ex.3. 条件分岐で判定する (Google Colab)

この講座で使用する Python, Jupyter Notebook のファイルと実行環境

Lesson 3: high-school-python-code (GitHub)

3.1 if 文で「もし〜なら」判定する基本

私たちは日常生活で、様々な「もし〜なら」という判断をしています。例えば、

  • もし雨が降っているなら、傘を持っていく
  • もしテストで 30 点以上なら、合格
  • もし体温が 37.5 度以上なら、病院に行く

プログラミングでも同じような判断が必要です。この「もし 〜 なら」という判断を行うのが if 文です。

条件を確かめた結果によって、プログラムが異なる道へ進むイメージ

if 文の基本

基本的な書き方

if 文の基本形

if 条件:
    実行したい処理

具体的な例を見てみましょう!

色々な条件分岐

# 天気による判断
weather = "雨"
if weather == "雨":
    print("傘を持っていきましょう")

# 点数による判断
score = 85
if score >= 80:
    print("よくできました!")

# 気温による判断
temperature = 32
if temperature >= 30:
    print("暑いので水分補給を忘れずに!")

if 文の重要なポイント

  1. 条件の後にコロン(:)をつける

    • これを忘れるとエラーになります

    コロンを忘れた例

    if score >= 80
        print("合格です")  # SyntaxError: invalid syntax
    
  2. 処理を字下げ(インデント)する

    • if 文の中の処理は、必ず字下げします
    • 字下げは半角スペース 4 つが基本です

    字下げした例

    temperature = 32
    
    if temperature >= 30:
        # 字下げあり
        print("暑いです")
    
    # 字下げなし (if 文の外)
    print("気温は32度です")
    

    字下げを忘れた例

    temperature = 32
    
    if temperature >= 30:
    print("暑いです")  # IndentationError: expected an indented block
    
  3. 複数の処理を書ける

    • 字下げした処理は、いくつでも書けます

    複数の処理を書いた例

    score = 95
    
    if score >= 90:
        print("大変よくできました!")
        print("次も頑張りましょう!")
        print("シールを貼りますね")
    

if 文の間違いの例

if score = 80: # = を使っている
if score == 80 # コロンがない
if score == 80: print("合格") # インデントがない

条件の書き方いろいろ

  1. 数値の比較

数値の比較

age = 16

if age >= 16:  # 16歳以上
    pass
if age < 20:  # 20歳未満
    pass
if age == 18:  # ちょうど18歳
    pass
  1. 文字列の比較

文字列の比較

name = "山田"

if name == "山田":  # 文字列が完全に一致
    pass
if "山" in name:  # 文字列を含むか
    pass
  1. 真偽値の判定

真偽値の判定

is_student = True

if is_student:  # True かどうか
    pass
if not is_student:  # False かどうか
    pass

3.2 else で「それ以外」の処理を考える

前回学んだ if 文は「もし 〜 なら」という条件を判断しました。でも実際の判断では、「そうでない場合」の処理も必要です。例えば、

  • もし雨が降っているなら傘を持っていく、そうでなければ、帽子をかぶっていく
  • もしテストが 80 点以上なら合格、そうでなければ、不合格
  • もし体温が 37.5 度以上なら病院に行く、そうでなければ、家で休む

この「そうでない場合」の処理を書くのが else です。

else の基本的な使い方

合格判定の例

合格判定の例

score = 65
if score >= 70:
    print("合格です!")
    print("次のステージに進めます")
else:
    print("残念、不合格です")
    print("もう一度チャレンジしましょう")

天気予報の例

天気予報の例

weather = "晴れ"
if weather == "雨":
    print("傘を持っていきましょう")
    print("長靴も必要かも")
else:
    print("良い天気です")
    print("帽子を忘れずに")

else 文を使う時の注意点

  1. インデントを揃える

    インデントを揃える

    if score >= 80:
        print("合格!")  # if ブロックは 4 スペース
    else:  # else は if と同じ位置
        print("不合格")  # else ブロックも 4 スペース
    
  2. else は if の直後

    else は if の直後

    # 正しい例
    if score >= 80:
        print("合格")
    else:
        print("不合格")
    
    # 間違った例
    if score >= 80:
        print("合格")
    # 間に他の処理を入れるとエラー
    print("判定終了")
    else:  # IndentationError: expected an indented block
        print("不合格")
    

3.3 elif で条件を増やしてみよう

実際の判断では、単純な「はい / いいえ」の二択だけでなく、複数の条件に分かれることが多いです。

  • テストの成績(A / B / C / D)
  • 年齢による料金区分(子供 / 学生 / 大人)

このような複数の条件分岐を扱うのが elif(else if の略)です。

elif の基本

テストの成績判定

テストの成績判定

score = 82

if score >= 90:
    print("評価: A")
elif score >= 80:
    print("評価: B")
elif score >= 70:
    print("評価: C")
else:
    print("評価: D")

動かして確認

elif は上から順番に判定する

判定する点数

条件を上から確認

if score >= 90:

print("評価: A")

次に判定
elif score >= 80:

print("評価: B")

未判定
elif score >= 70:

print("評価: C")

未判定
else:

print("評価: D")

未判定

現在の点数

82

判定結果

まだ判定中です

0個の条件を確認しました。

点数は82点です。まだ条件を判定していません。
点数を変えて、最初に True になった条件、またはどれにも当てはまらない場合の else で処理が決まることを確認しましょう。

条件チェックの順序が重要

条件は上から順にチェックされ、最初に当てはまった条件の処理が実行されます。

条件チェックの順序が重要

# 間違った例
score = 95
if score >= 60:  # ここで True になってしまう
    print("合格")
elif score >= 80:  # ここはチェックされない
    print("よくできました")
elif score >= 90:  # ここもチェックされない
    print("大変よくできました")

# 正しい例 (条件を上から厳しくする)
if score >= 90:
    print("大変よくできました")
elif score >= 80:
    print("よくできました")
elif score >= 60:
    print("合格")

もう一つ例を見ておきましょう。

料金判定の例

age = 16

if age < 0:  # 例外的な条件 (最初に)
    print("エラー")
elif age <= 12:  # より具体的な条件 (子供)
    print("600円")
elif age <= 18:  # 次に具体的な条件 (学生)
    print("800円")
else:  # 最も広い条件 (大人)
    print("1000円")

3.4 and, or, not で条件を組み合わせる

実際の判断では、複数の条件を組み合わせることが多いですよね。例えば:

  • または 雪が降っているなら傘を持っていく
  • アプリ会員 かつ 3,000 円以上の購入なら送料無料

このような複数の条件を組み合わせるために、andornot という演算子を使います。

動かして確認

and・or・not をスイッチで確かめる

演算子
条件の値

式と結果

True and False
False

両方が True のときだけ True

and の真偽表
条件 A条件 B結果
TrueTrueTrue
TrueFalseFalse
FalseTrueFalse
FalseFalseFalse
True and False の結果は False です。
条件を切り替えると、対応する真偽表の行と結果が同時に変わります。

and: 両方の条件が成り立つ場合

and は、両方の条件が True のときだけ True になります。

高校生で成績優秀な場合を判定

age = 16
score = 85

if age >= 15 and score >= 80:
    print("高校生で成績優秀です!")
    print("表彰状を贈ります")

蒸し暑い日を判定

temperature = 32
humidity = 75

if temperature >= 30 and humidity >= 70:
    print("蒸し暑い日です")
    print("熱中症に注意しましょう")

and の真偽表

and は、これらのように判定されます。集合と命題を学んでいると楽に理解できるでしょう。

条件1条件2結果
TrueTrueTrue
TrueFalseFalse
FalseTrueFalse
FalseFalseFalse

or: どちらかの条件が成り立つ場合

or は、どちらかの条件が True なら True になります。

点数が範囲外かどうかを判定

score = 120

if score < 0 or score > 100:
    print("点数が範囲外です")
    print("0から100の間で入力してください")

休日かどうかを判定

is_weekend = True
is_holiday = False

if is_weekend or is_holiday:
    print("今日は休みです")
    print("ゆっくり過ごしましょう")

or の真偽表

or は、これらのように判定されます。

条件1条件2結果
TrueTrueTrue
TrueFalseTrue
FalseTrueTrue
FalseFalseFalse

not: 条件を逆にする

not は、条件の結果を逆にします。

晴れではないなら傘を持っていく

sunny = False

if not sunny:
    print("今日は曇りか雨です")
    print("傘を持っていきましょう")

宿題が終わっているかどうかを判定

has_homework = True

if not has_homework:
    print("宿題は終わっています")
else:
    print("まだ宿題が残っています")

条件の優先順位

複数の条件を組み合わせるとき、カッコ () を使って優先順位を明確にできます。数値の計算と同じような考え方です。

and の評価は or よりも優先順位が高いので、1 番目と 2 番目の例は同じ結果になります。ただ、カッコをつけると優先順位が明確になり、意図が分かりやすくなります。

temperature = 28
humidity = 80
is_raining = True

# カッコがないと意図が分かりにくい
if temperature >= 30 and humidity >= 70 or is_raining:
    print("1. 傘を持って行きましょう")

# カッコをつけて優先順位を明確にする
if (temperature >= 30 and humidity >= 70) or is_raining:
    # 雨が降っているので実行される
    print("2. 傘を持って行きましょう")

# 別の意図の例
if temperature >= 30 and (humidity >= 70 or is_raining):
    # 気温が 30 度未満なので実行されない
    print("3. 傘を持って行きましょう")

この例では:

  1. 1つ目は「蒸し暑い」または「雨が降っている」場合に傘が必要
  2. 2つ目は「気温が30度以上で、かつ湿度が高いか雨が降っている」場合に傘が必要

カッコの位置で条件の意味が大きく変わることが分かります。

3.5 複数条件を整理してわかりやすくする

プログラムが大きくなると、条件判断も複雑になってきます。そんなとき、条件を整理して分かりやすくする工夫が必要です。

条件を変数にまとめる

条件を変数にまとめると、プログラムの意図が分かりやすくなります。

条件を変数にまとめる

age = 16
score = 85
attendance = 95

# 整理する前
if age >= 15 and age <= 18 and score >= 80 and attendance >= 90:
    print("表彰の対象です")

# 整理した後
is_high_school_student = age >= 15 and age <= 18
has_good_score = score >= 80
has_good_attendance = attendance >= 90

if is_high_school_student and has_good_score and has_good_attendance:
    print("表彰の対象です")

変数名で条件の意味を明確に

条件を表す変数名は、その条件が「何を判断しているか」が分かるようにすると良いです。

変数名で条件の意味を明確にする

# 商品の注文システム
quantity = 10
price = 1200
total = 10000
is_member = True
is_premium_member = False

is_in_stock = quantity > 0
is_valid_price = price >= 100 and price <= 10000
can_use_coupon = total >= 3000 and is_member
is_free_shipping = total >= 5000 or is_premium_member

if is_in_stock and is_valid_price:
    if can_use_coupon:
        print("クーポンが使えます")
    if is_free_shipping:
        print("送料無料です")

条件を段階的にチェックする

複雑な条件は、1 行の if 文や elif 文で書くのではなく、段階的にチェックすると分かりやすくなります。

段階的にチェックする

score = 85

# 最初に異常値をチェック
if score < 0 or score > 100:
    print("エラー:不正な点数です")
else:
    # 成績の判定
    if score >= 90:
        print("評価: A")
    elif score >= 80:
        print("評価: B")
    elif score >= 70:
        print("評価: C")
    else:
        print("評価: D")

3.6 条件分岐の入れ子構造を理解する

プログラムでは、「もし 〜 なら」の中に、さらに「もし 〜 なら」を入れることができます。これを「入れ子構造」や「ネスト」と呼びます。

基本的な入れ子構造

部活動の練習場所

day = "月曜日"
weather = "雨"

if day == "月曜日":
    if weather == "晴れ":
        print("グラウンドで練習です")
    else:
        print("体育館で練習です")
else:
    print("今日は部活動はありません")

この例では、

  1. まず曜日をチェック
  2. 月曜日なら、さらに天気をチェック
  3. 天気によって練習場所を決定

としています。

もう一つ、例を見ておきましょう。

商品の購入判断

price = 1200  # 商品の値段
money = 1000  # 持っているお金
discount = True  # 割引クーポンを持っている

if money >= price:
    print("購入できます")
    print(f"残金:{money - price}円")
else:
    if discount:
        # 20% オフ
        discounted_price = price * 0.8

        if money >= discounted_price:
            print("割引価格なら購入できます")
            print(f"割引後価格:{discounted_price}円")
            print(f"残金:{money - discounted_price}円")
        else:
            print("割引されても予算オーバーです")
            print(f"あと{discounted_price - money}円必要です")
    else:
        print("予算が足りません")
        print(f"あと{price - money}円必要です")

3.7 簡単な条件分岐の練習問題

ここまで学んできた条件分岐の知識を使って、いくつかの練習問題に挑戦してみましょう。

練習問題 1: 年齢による料金判定

年齢に応じて料金区分を判定するプログラムを作ってみましょう。

年齢に応じたメッセージ

age = int(input("年齢を入力してください:"))

if age < 0:
    print("エラー:正しい年齢を入力してください")
elif age < 13:
    print("子供料金:600円です")
elif age < 65:
    print("大人料金:1200円です")
else:
    print("シニア料金:800円です")

ポイント

  • 最初に不正な値(マイナス)をチェック
  • 年齢の低い順から判定
  • 料金も表示して分かりやすく

練習問題 2: パスワードの安全性チェック

入力されたパスワードの安全性をチェックするプログラムを作ってみましょう。

パスワードの安全性チェック

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

if len(password) < 8:
    print("パスワードが短すぎます")
    print("8文字以上にしてください")
elif password.isdigit():
    print("数字だけのパスワードは危険です")
    print("文字も混ぜてください")
elif password.isalpha():
    print("文字だけのパスワードは危険です")
    print("数字も混ぜてください")
else:
    print("パスワードOK!")

ポイント

  • len() で文字数をチェック
  • isdigit() で数字のみかをチェック
  • isalpha() で文字のみかをチェック
  • 改善のアドバイスも表示

Ex.1 入力した点数に応じて合否判定するプログラム

より実践的な成績判定プログラムを作ってみましょう:

点数を入力し、合否判定するプログラム

score = int(input("点数を入力してください (0 〜 100):"))

if score < 0 or score > 100:
    print("エラー: 0 から 100 の間の点数を入力してください")
else:
    # 判定処理
    if score >= 90:
        print("評価: A+")
        print("素晴らしい成績です!")
    elif score >= 80:
        print("評価: A")
        print("よくできました!")
    elif score >= 70:
        print("評価: B")
        print("がんばりました")
    elif score >= 60:
        print("評価: C")
        print("合格です")
    else:
        print("評価: D")
        print("残念ながら不合格です")

チャレンジ!

  • 複数の科目の点数を入力し、平均点も判定してみよう
  • 欠席日数なども考慮した総合判定を作ってみよう
  • より細かい評価基準を追加してみよう

Ex.2 FizzBuzz 問題(3 の倍数、5 の倍数、15 の倍数で表示を変える)

プログラミングでよく出題される FizzBuzz 問題に挑戦しましょう:

1 から 100 までの数字で FizzBuzz ゲーム

for num in range(1, 101):
    if num % 15 == 0:
        # 15 の倍数のとき
        print("FizzBuzz")
    elif num % 3 == 0:
        # 3 の倍数のとき
        print("Fizz")
    elif num % 5 == 0:
        # 5 の倍数のとき
        print("Buzz")
    else:
        # それ以外のとき
        print(num)

チャレンジ!

  • 別の数字の倍数でも判定してみよう
  • 入力した範囲の数字で実行できるようにしてみよう
  • オリジナルの言葉に変更してみよう

まとめ

この章では条件分岐について学びました。

  • if 文で条件に応じた処理ができる
  • else, elif で複数の条件分岐を作れる
  • and, or, not で複雑な条件を表現できる
  • 入れ子構造で詳細な条件分岐が可能