3. 条件分岐で判定する
目次
- 3.1 if 文で「もし〜なら」判定する基本
- 3.2 else で「それ以外」の処理を考える
- 3.3 elif で条件を増やしてみよう
- 3.4 and, or, not で条件を組み合わせる
- 3.5 複数条件を整理してわかりやすくする
- 3.6 条件分岐の入れ子構造を理解する
- 3.7 簡単な条件分岐の練習問題
- Ex.1 入力した点数に応じて合否判定するプログラム
- Ex.2 FizzBuzz 問題(3 の倍数、5 の倍数、15 の倍数で表示を変える)
この講座で使用する Google Colab の URL
演習課題
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 文の重要なポイント
-
条件の後にコロン(
:
)をつける- これを忘れるとエラーになります
コロンを忘れた例
if score >= 80 print("合格です") # SyntaxError: invalid syntax
-
処理を字下げ(インデント)する
- if 文の中の処理は、必ず字下げします
- 字下げは半角スペース 4 つが基本です
字下げした例
temperature = 32 if temperature >= 30: # 字下げあり print("暑いです") # 字下げなし (if 文の外) print("気温は32度です")
字下げを忘れた例
temperature = 32 if temperature >= 30: print("暑いです") # IndentationError: expected an indented block
-
複数の処理を書ける
- 字下げした処理は、いくつでも書けます
複数の処理を書いた例
score = 95 if score >= 90: print("大変よくできました!") print("次も頑張りましょう!") print("シールを貼りますね")
Pythonでは、インデントによってプログラムのブロック(かたまり)を判断します。他のプログラミング言語では、{}
や end
などを使ってブロックを区切ります。
Q: if 文でよくある間違いは?
A: 以下の点に注意しましょう!
- コロン(
:
)を忘れる - インデントを忘れる or 間違える
=
(代入)と==
(等しい)を間違える
if 文の間違いの例
if score = 80: # = を使っている
if score == 80 # コロンがない
if score == 80: print("合格") # インデントがない
条件の書き方いろいろ
- 数値の比較
数値の比較
age = 16
if age >= 16: # 16歳以上
pass
if age < 20: # 20歳未満
pass
if age == 18: # ちょうど18歳
pass
pass
は、「何もしない」という処理です。- 文字列の比較
文字列の比較
name = "山田"
if name == "山田": # 文字列が完全に一致
pass
if "山" in name: # 文字列を含むか
pass
- 真偽値の判定
真偽値の判定
is_student = True
if is_student: # True かどうか
pass
if not is_student: # False かどうか
pass
Q: 真偽値の判定では、なぜ not
を使うの?
A: not
は、真偽値を反転させる演算子です。例えば、is_student
が True
なら not is_student
は False
になります。
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 文を使う時の注意点
-
インデントを揃える
インデントを揃える
if score >= 80: print("合格!") # if ブロックは 4 スペース else: # else は if と同じ位置 print("不合格") # else ブロックも 4 スペース
-
else は if の直後
else は if の直後
# 正しい例 if score >= 80: print("合格") else: print("不合格") # 間違った例 if score >= 80: print("合格") # 間に他の処理を入れるとエラー print("判定終了") else: # IndentationError: expected an indented block print("不合格")
if-else の判断の流れ: このような流れで判定されます。
- まず if の条件を判断
- 条件が True なら if のブロックを実行
- 条件が False なら else のブロックを実行
- どちらか一方しか実行されない
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 の判断の流れ: このように、上から順番に判定されるので注意しましょう。
- まず 90 点以上かチェック → 違う
- 次に 80 点以上かチェック → 当てはまる(82 点)
- 「評価:B」を表示して終了
- 残りの条件はチェックされない
条件チェックの順序が重要
条件は上から順にチェックされ、最初に当てはまった条件の処理が実行されます。
条件チェックの順序が重要
# 間違った例
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 円以上の購入なら送料無料
このような複数の条件を組み合わせるために、and
、or
、not
という演算子を使います。
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 | 結果 |
---|---|---|
True | True | True |
True | False | False |
False | True | False |
False | False | False |
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 | 結果 |
---|---|---|
True | True | True |
True | False | True |
False | True | True |
False | False | False |
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つ目は「蒸し暑い」または「雨が降っている」場合に傘が必要
- 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")
Q: 条件を表す変数の名前の付け方は?
A: 以下のような規則がおすすめです!
is_
で始める(状態を表す): is_valid, is_activehas_
で始める(所持を表す): has_permission, has_errorcan_
で始める(能力を表す): can_edit, can_delete
3.6 条件分岐の入れ子構造を理解する
プログラムでは、「もし 〜 なら」の中に、さらに「もし 〜 なら」を入れることができます。これを「入れ子構造」や「ネスト」と呼びます。
基本的な入れ子構造
部活動の練習場所
day = "月曜日"
weather = "雨"
if day == "月曜日":
if weather == "晴れ":
print("グラウンドで練習です")
else:
print("体育館で練習です")
else:
print("今日は部活動はありません")
この例では、
- まず曜日をチェック
- 月曜日なら、さらに天気をチェック
- 天気によって練習場所を決定
としています。
もう一つ、例を見ておきましょう。
商品の購入判断
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}円必要です")
何段階もネストされている文を書く場合は、インデントを正しく使うように注意しましょう。Python ではカッコではなくインデントでコードブロックを区切るので、慣れていないと間違えてしまい、プログラムの意味が変わってしまう場合があります。
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 で複雑な条件を表現できる
- 入れ子構造で詳細な条件分岐が可能
次の章では、繰り返し処理について学びます。条件分岐と組み合わせることで、さらに柔軟なプログラムが作れるようになります!