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")

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

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

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

# 間違った例
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: 両方の条件が成り立つ場合

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 で複雑な条件を表現できる
  • 入れ子構造で詳細な条件分岐が可能