Python入門:条件分岐(if文)

2025-10-20

はじめに

今回は、プログラムに「判断力」を持たせるための重要な概念である「条件分岐」について学びます。条件分岐を使うことで、プログラムは状況に応じて異なる処理を実行できるようになります。これは、現実世界の意思決定プロセスをプログラムで表現するための基本的な技術です。

条件分岐の基本概念

条件分岐は、特定の条件が「真(True)」か「偽(False)」かに基づいて、実行するコードブロックを決定する仕組みです。Pythonではif文を使って条件分岐を実現します。

条件分岐の必要性

例えば、以下のような判断をプログラムで行いたい場合に条件分岐が必要になります。

  • ユーザーの年齢に応じてメッセージを変えたい
  • テストの点数で合格・不合格を判定したい
  • 在庫の有無によって処理を変えたい
  • 天気に応じて外出のアドバイスを変えたい

if文の基本構文

基本的なif文

最もシンプルなif文の形です。「条件式」が True のときだけ、指定した処理を実行します。例では age = 20 の場合、if age >= 18: が真になるため、「成人です」と出力されます。

# 基本形
if 条件式:
    # 条件がTrueの場合に実行するコード
    処理

# 具体例
age = 20
if age >= 18:
    print("成人です")

if-else文

条件がFalseの場合の処理も指定したい場合は、elseを使います。条件式が True の場合は if ブロック内の処理を、False の場合は else ブロック内の処理を実行します。例では age = 16 のため条件 age >= 18 が偽となり、「未成年です」と出力されます。

# if-else形
if 条件式:
    # 条件がTrueの場合の処理
else:
    # 条件がFalseの場合の処理

# 具体例
age = 16
if age >= 18:
    print("成人です")
else:
    print("未成年です")

if-elif-else文

複数の条件をチェックしたい場合は、elifを使います。上から順に条件を評価し、最初に True になったブロックの処理だけを実行します。例では score = 85 のため、score >= 80 が真となり、「評価: B」と出力されます。

# if-elif-else形
if 条件式1:
    # 条件1がTrueの場合の処理
elif 条件式2:
    # 条件2がTrueの場合の処理
elif 条件式3:
    # 条件3がTrueの場合の処理
else:
    # すべての条件がFalseの場合の処理

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

条件式の詳細

比較演算子を使った条件式

>==!= などの比較演算子を使って、条件を判定します。例では x = 10, y = 5 なので「xはyより大きい」「xとyは等しくない」が表示されます。また、name"Alice" のため、「Hello, Alice!」と「あなたはBobではありません」が出力されます。

# 数値の比較
x = 10
y = 5

if x > y:
    print("xはyより大きい")

if x == y:
    print("xとyは等しい")

if x != y:
    print("xとyは等しくない")

# 文字列の比較
name = "Alice"
if name == "Alice":
    print("Hello, Alice!")

if name != "Bob":
    print("あなたはBobではありません")

論理演算子を使った複合条件

次のコードは 論理演算子(and、or、not) の使い方を示しています。

  • and は両方の条件が真のときに実行されます。
  • or はどちらか一方でも真なら実行されます。
  • not は条件を反転させます(FalseならTrueに)。

例では、「運転できます」「休日です」「天気は晴れです」と順に出力されます。

# and(論理積):両方の条件がTrue
age = 25
has_license = True

if age >= 18 and has_license:
    print("運転できます")

# or(論理和):少なくとも一方がTrue
is_weekend = True
is_holiday = False

if is_weekend or is_holiday:
    print("休日です")

# not(否定):条件を反転
is_rainy = False
if not is_rainy:
    print("天気は晴れです")

複雑な条件式

and を使って、すべての条件(年齢・収入・信用履歴)が満たされた場合に「ローン審査通過」と表示します。どれか1つでも条件を満たさないと「審査条件を満たしていません」と出力されます。例では全ての条件がTrueなので、「ローン審査通過」と表示されます。

# 複数の条件を組み合わせる
age = 25
income = 4500000
has_credit_history = True

# ローンの審査条件
if (age >= 20 and age <= 65) and (income >= 3000000) and has_credit_history:
    print("ローン審査通過")
else:
    print("審査条件を満たしていません")

インデントの重要性

Pythonでは、インデントによって「どの処理がどのブロックに属するか」を区別します。インデントを間違えると IndentationError が発生します。

例では、最初の if True: では2行とも実行されますが、「誤った例」はインデントがないためエラーになります。また、ネストした if の中では条件がFalseのため「レベル2」は実行されません。

# 正しい例
if True:
    print("これは実行されます")
    print("これも実行されます")

# 誤った例
if True:
print("これはエラーになります")  # IndentationError

# インデントのレベルが重要
if True:
    print("レベル1")
    if False:
        print("レベル2")  # この行は実行されない
    print("再びレベル1")

インデントのルール

  • 同じブロック内のコードは同じインデントレベルにする
  • 通常はスペース4つを使用する(タブも可だが、混在は不可)
  • インデントはネスト(入れ子)構造を表現する

ネストしたif文

if文の中にさらにif文を記述することができます。これにより複数の条件を段階的に判定することで、細かい条件分岐が可能になります。例では年齢・免許の有無・飲酒状態を順に確認し、すべての条件を満たした場合に「運転できます」と表示します。

今回の値ではすべての条件がTrueのため、「運転できます」と出力されます。

# ネストしたif文の例
age = 25
has_license = True
is_sober = True

if age >= 18:
    if has_license:
        if is_sober:
            print("運転できます")
        else:
            print("飲酒運転は禁止です")
    else:
        print("免許が必要です")
else:
    print("年齢制限です")

様々なデータ型と条件分岐

文字列と条件分岐

最初の部分では、入力された色に応じて異なるメッセージを表示します。次の部分では、input() で受け取った回答を .lower() で小文字化し、「yes/y」なら続行、「no/n」なら終了、それ以外は「無効な入力です」と表示します。

# 文字列の条件分岐
color = input("好きな色を入力してください: ")

if color == "red":
    print("情熱的な色ですね")
elif color == "blue":
    print("冷静な色ですね")
elif color == "green":
    print("自然を感じる色ですね")
else:
    print("素敵な色ですね")

# 文字列のメソッドと組み合わせ
answer = input("続けますか? (yes/no): ").lower()

if answer == "yes" or answer == "y":
    print("続けます")
elif answer == "no" or answer == "n":
    print("終了します")
else:
    print("無効な入力です")

リストと条件分岐

最初の if fruits: では、リストが空でないかを判定しています。空でなければ要素数を表示し、"apple" in fruits で特定の要素が含まれているかもチェックします。次に len(numbers) > 3 により、リストの長さが3より大きい場合にメッセージを表示します。

結果として、「フルーツが3個あります」「リンゴがあります」「リストには3つ以上の要素があります」と出力されます。

# リストの条件分岐
fruits = ["apple", "banana", "orange"]

if fruits:  # リストが空でないかチェック
    print(f"フルーツが{len(fruits)}個あります")

    if "apple" in fruits:  # 要素の存在チェック
        print("リンゴがあります")
else:
    print("フルーツがありません")

# リストの長さによる分岐
numbers = [1, 2, 3, 4, 5]
if len(numbers) > 3:
    print("リストには3つ以上の要素があります")

ブーリアン値の直接使用

TrueFalse を直接 if 文に使うことで、状態をわかりやすく表現しています。また、temperature > 25 の結果を変数 is_hot に代入し、条件式を簡潔にしています。例では「雨が降っています」「今日は平日です」「暑いですね」と順に出力されます。

# ブーリアン変数を直接使用
is_raining = True
is_weekend = False

if is_raining:
    print("雨が降っています")

if not is_weekend:
    print("今日は平日です")

# 条件式の結果を変数に保存
temperature = 28
is_hot = temperature > 25

if is_hot:
    print("暑いですね")

実践的な例

成績判定プログラム

evaluate_grade(score) 関数は、入力された点数に応じて評価(A〜F)を返します。0未満または100を超える点数の場合は「無効な点数」として処理されます。入力値に応じて if-elif-else で判定し、最後に print() で結果を表示します。

例:85 を入力すると「評価: B」と出力されます。

def evaluate_grade(score):
    """点数から評価を判定"""
    if score < 0 or score > 100:
        return "無効な点数"
    elif score >= 90:
        return "A"
    elif score >= 80:
        return "B"
    elif score >= 70:
        return "C"
    elif score >= 60:
        return "D"
    else:
        return "F"

# 使用例
score = int(input("点数を入力してください: "))
grade = evaluate_grade(score)
print(f"評価: {grade}")

ログインシステム

入力されたユーザー名とパスワードが正しい組み合わせ(admin / password123)の場合に「ログイン成功!」と表示します。どちらかが間違っている場合は「ユーザー名またはパスワードが間違っています」と出力し、さらにどちらが誤っているかを個別に表示します。

# シンプルなログインシステム
correct_username = "admin"
correct_password = "password123"

username = input("ユーザー名: ")
password = input("パスワード: ")

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

    # 詳細なエラーメッセージ
    if username != correct_username:
        print("ユーザー名が間違っています")
    if password != correct_password:
        print("パスワードが間違っています")

電卓プログラム

ユーザーから2つの数値と演算子(+, -, *, /)を入力させ、対応する計算結果を表示します。割り算の場合は、0で割ろうとするとエラーを防ぐために特別な条件分岐があります。また、数値以外が入力された場合は ValueError を検出して「数値を正しく入力してください」と表示します。

# シンプルな電卓
try:
    num1 = float(input("最初の数値: "))
    num2 = float(input("二番目の数値: "))
    operation = input("演算子 (+, -, *, /): ")

    if operation == "+":
        result = num1 + num2
        print(f"{num1} + {num2} = {result}")
    elif operation == "-":
        result = num1 - num2
        print(f"{num1} - {num2} = {result}")
    elif operation == "*":
        result = num1 * num2
        print(f"{num1} * {num2} = {result}")
    elif operation == "/":
        if num2 != 0:
            result = num1 / num2
            print(f"{num1} / {num2} = {result}")
        else:
            print("エラー: 0で割ることはできません")
    else:
        print("無効な演算子です")

except ValueError:
    print("数値を正しく入力してください")

三項演算子

Pythonの三項演算子(条件式)は、1行で条件分岐を表す簡潔な書き方です。構文は「値1 if 条件 else 値2」で、条件が真なら値1、偽なら値2を返します。

通常の if-else を1行で書ける簡潔な構文で、値1 if 条件 else 値2 の形になります。例では age が18以上なら「成人」、そうでなければ「未成年」となります。また、score に応じて「合格」や「評価(A〜D)」を判定する例も示されています。

# 通常のif-else
age = 20
if age >= 18:
    status = "成人"
else:
    status = "未成年"

# 三項演算子
status = "成人" if age >= 18 else "未成年"

# 使用例
score = 85
result = "合格" if score >= 60 else "不合格"
print(f"結果: {result}")

# 複数の三項演算子(ネスト)
grade = "A" if score >= 90 else "B" if score >= 80 else "C" if score >= 70 else "D"

条件分岐のベストプラクティス

1. 読みやすい条件式

最初の例は否定(not)と複雑な論理式を組み合わせており、理解しにくい書き方です。2つ目の例では条件を直接的に書き換えることで、意味が明確で読みやすくなっています。可読性を高めるためには、できるだけシンプルで直感的な条件式を書くことが重要です。

# 読みにくい例
if not (x < 5 or y > 10) and z == 0:

# 読みやすい例
if x >= 5 and y <= 10 and z == 0:

2. 早期リターン

最初の関数は if が入れ子になっており、条件が多いほど見づらくなります。一方、後半の関数では「条件を満たさない場合にすぐreturnする」早期リターンを使い、シンプルで理解しやすい構造になっています。

# ネストが深い例
def check_conditions(x, y, z):
    if x > 0:
        if y > 0:
            if z > 0:
                return "すべて正の数"
            else:
                return "zが0以下"
        else:
            return "yが0以下"
    else:
        return "xが0以下"

# 早期リターンを使った例
def check_conditions_better(x, y, z):
    if x <= 0:
        return "xが0以下"
    if y <= 0:
        return "yが0以下"
    if z <= 0:
        return "zが0以下"
    return "すべて正の数"

3. 複雑な条件の整理

上の例では条件が長く、一目で理解しにくくなっています。そこで、条件式を変数(can_drive_normally)にまとめることで、後の if 文が簡潔で意味の分かりやすい形になります。

# 複雑な条件
if (age >= 18 and has_license and not is_drunk and car_available) or is_emergency:

# 整理した例
can_drive_normally = age >= 18 and has_license and not is_drunk and car_available
if can_drive_normally or is_emergency:

デバッグのコツ

print() で各条件の評価結果を出力し、どの部分が True / False なのかを確認できます。
これにより、複雑な条件で思った通りに動かない原因を特定しやすくなります。

例では age >= 18 は False、has_parent_consent は True なので、「参加できます」と表示されます。

# 条件式のデバッグ
age = 16
has_parent_consent = True

# デバッグ用に条件を分解
print(f"age >= 18: {age >= 18}")
print(f"has_parent_consent: {has_parent_consent}")

if age >= 18 or has_parent_consent:
    print("参加できます")
else:
    print("参加できません")

まとめ

今回はPythonの条件分岐(if文)について学びました。基本的なif文の使い方から、条件がFalseの場合に処理を分けるif-else文、複数の条件を判定するif-elif-else文までを学び、比較演算子や論理演算子を組み合わせた条件式の書き方も理解しました。

インデントによるブロック構造の重要性や、ネストしたif文による多段階の条件分岐、文字列やリストなど様々なデータ型での条件分岐方法も扱いました。さらに、三項演算子による簡潔な表現方法や、可読性の高いコードを書くためのベストプラクティスも重要です。

条件分岐はプログラミングの基本的かつ強力な機能です。適切に使うことで、プログラムに判断力を与え、より現実世界に近い振る舞いを実現できます。


練習問題

初級問題(3問)

問題1
ユーザーに数値を入力させ、その数値が正の数、負の数、ゼロのどれかを判定して表示するプログラムを作成してください。

問題2
ユーザーに年齢を入力させ、以下の条件に基づいてメッセージを表示するプログラムを作成してください。

  • 18歳未満: "未成年です"
  • 18歳以上65歳未満: "成人です"
  • 65歳以上: "高齢者です"

問題3
2つの数値を入力させ、それらが等しいかどうかを判定するプログラムを作成してください。
等しい場合は"等しい"、等しくない場合は"等しくない"と表示してください。

中級問題(6問)

問題4
テストの点数を入力させ、以下の評価基準に基づいて評価を表示するプログラムを作成してください。

  • 90点以上: A
  • 80点以上90点未満: B
  • 70点以上80点未満: C
  • 60点以上70点未満: D
  • 60点未満: F

問題5
三角形の3辺の長さを入力させ、以下の条件に基づいて三角形の種類を判定するプログラムを作成してください。

  • 正三角形: 3辺すべてが等しい
  • 二等辺三角形: 2辺が等しい
  • 不等辺三角形: すべての辺が異なる

問題6
西暦年を入力させ、その年がうるう年かどうかを判定するプログラムを作成してください。
うるう年の条件は以下の通りです。

  • 4で割り切れる年はうるう年
  • 100で割り切れる年はうるう年ではない
  • 400で割り切れる年はうるう年

問題7
ユーザーにユーザー名とパスワードを入力させ、事前に設定した正しいユーザー名とパスワードと一致するかチェックする簡単なログインシステムを作成してください。

問題8
3つの異なる数値を入力させ、それらを大きい順に並び替えて表示するプログラムを作成してください。

問題9
ある商品の購入金額に応じて割引を適用し、最終価格を計算するプログラムを作成してください。

  • 5000円未満: 割引なし
  • 5000円以上10000円未満: 5%割引
  • 10000円以上: 10%割引

上級問題(3問)

問題10
電卓プログラムを作成してください。2つの数値と演算子(+, -, *, /)を入力させ、適切な計算を行って結果を表示してください。ゼロ除算のエラー処理も含めてください。

問題11
じゃんけんゲームを作成してください。ユーザーが入力した手(グー、チョキ、パー)とコンピューターのランダムな手を比較して勝敗を判定してください。

問題12
BMI(ボディマス指数)を計算し、以下の基準に基づいて体型を判定するプログラムを作成してください。

  • BMI = 体重(kg) / 身長(m)^2
  • 判定基準:
  • 18.5未満: 低体重
  • 18.5以上25未満: 普通体重
  • 25以上30未満: 肥満(1度)
  • 30以上35未満: 肥満(2度)
  • 35以上40未満: 肥満(3度)
  • 40以上: 肥満(4度)

条件分岐(if文)練習問題 解答

初級問題 解答

問題1 解答

# 数値の正負を判定するプログラム
number = float(input("数値を入力してください: "))

if number > 0:
    print("正の数です")
elif number < 0:
    print("負の数です")
else:
    print("ゼロです")

実行例:

数値を入力してください: -5
負の数です

問題2 解答

# 年齢による分類プログラム
age = int(input("年齢を入力してください: "))

if age < 18:
    print("未成年です")
elif age < 65:
    print("成人です")
else:
    print("高齢者です")

別解:

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

if age >= 65:
    print("高齢者です")
elif age >= 18:
    print("成人です")
else:
    print("未成年です")

実行例:

年齢を入力してください: 25
成人です

問題3 解答

# 2つの数値の等価性をチェックするプログラム
num1 = float(input("1つ目の数値を入力してください: "))
num2 = float(input("2つ目の数値を入力してください: "))

if num1 == num2:
    print("等しい")
else:
    print("等しくない")

実行例:

1つ目の数値を入力してください: 10
2つ目の数値を入力してください: 10
等しい

中級問題 解答

問題4 解答

# 成績評価プログラム
score = int(input("テストの点数を入力してください: "))

if score < 0 or score > 100:
    print("無効な点数です")
elif score >= 90:
    print("評価: A")
elif score >= 80:
    print("評価: B")
elif score >= 70:
    print("評価: C")
elif score >= 60:
    print("評価: D")
else:
    print("評価: F")

実行例:

テストの点数を入力してください: 85
評価: B

問題5 解答

# 三角形の種類を判定するプログラム
a = float(input("辺aの長さを入力してください: "))
b = float(input("辺bの長さを入力してください: "))
c = float(input("辺cの長さを入力してください: "))

# 三角形が成立するかチェック
if a + b > c and a + c > b and b + c > a:
    if a == b == c:
        print("正三角形です")
    elif a == b or a == c or b == c:
        print("二等辺三角形です")
    else:
        print("不等辺三角形です")
else:
    print("三角形を形成できません")

実行例:

辺aの長さを入力してください: 5
辺bの長さを入力してください: 5
辺cの長さを入力してください: 5 正三角形です

問題6 解答

# うるう年判定プログラム
year = int(input("西暦年を入力してください: "))

if (year % 400 == 0) or (year % 100 != 0 and year % 4 == 0):
    print(f"{year}年はうるう年です")
else:
    print(f"{year}年はうるう年ではありません")

別解(ネストしたif文):

year = int(input("西暦年を入力してください: "))

if year % 4 == 0:
    if year % 100 == 0:
        if year % 400 == 0:
            print(f"{year}年はうるう年です")
        else:
            print(f"{year}年はうるう年ではありません")
    else:
        print(f"{year}年はうるう年です")
else:
    print(f"{year}年はうるう年ではありません")

実行例:

西暦年を入力してください: 2024
2024年はうるう年です

問題7 解答

# 簡単なログインシステム
correct_username = "admin"
correct_password = "password123"

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

if username == correct_username and password == correct_password:
    print("ログイン成功!")
else:
    print("ログイン失敗")

    # 詳細なエラーメッセージ
    if username != correct_username:
        print("ユーザー名が間違っています")
    if password != correct_password:
        print("パスワードが間違っています")

実行例:

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

問題8 解答

# 3つの数値を大きい順に並び替え
num1 = float(input("1つ目の数値を入力してください: "))
num2 = float(input("2つ目の数値を入力してください: "))
num3 = float(input("3つ目の数値を入力してください: "))

if num1 >= num2 and num1 >= num3:
    if num2 >= num3:
        print(f"大きい順: {num1}, {num2}, {num3}")
    else:
        print(f"大きい順: {num1}, {num3}, {num2}")
elif num2 >= num1 and num2 >= num3:
    if num1 >= num3:
        print(f"大きい順: {num2}, {num1}, {num3}")
    else:
        print(f"大きい順: {num2}, {num3}, {num1}")
else:
    if num1 >= num2:
        print(f"大きい順: {num3}, {num1}, {num2}")
    else:
        print(f"大きい順: {num3}, {num2}, {num1}")

別解(よりシンプルな方法):

num1 = float(input("1つ目の数値を入力してください: "))
num2 = float(input("2つ目の数値を入力してください: "))
num3 = float(input("3つ目の数値を入力してください: "))

# リストにしてソート
numbers = [num1, num2, num3]
numbers.sort(reverse=True)
print(f"大きい順: {numbers[0]}, {numbers[1]}, {numbers[2]}")

実行例:

1つ目の数値を入力してください: 15
2つ目の数値を入力してください: 8
3つ目の数値を入力してください: 22
大きい順: 22.0, 15.0, 8.0

問題9 解答

# 割引計算プログラム
price = float(input("購入金額を入力してください: "))

if price >= 10000:
    discount_rate = 0.10
    discount_amount = price * discount_rate
    final_price = price - discount_amount
    print(f"元の金額: {price}円")
    print(f"割引率: {discount_rate * 100}%")
    print(f"割引額: {discount_amount}円")
    print(f"最終金額: {final_price}円")
elif price >= 5000:
    discount_rate = 0.05
    discount_amount = price * discount_rate
    final_price = price - discount_amount
    print(f"元の金額: {price}円")
    print(f"割引率: {discount_rate * 100}%")
    print(f"割引額: {discount_amount}円")
    print(f"最終金額: {final_price}円")
else:
    print(f"割引対象外です。金額: {price}円")

実行例:

購入金額を入力してください: 12000
元の金額: 12000.0円
割引率: 10.0%
割引額: 1200.0円
最終金額: 10800.0円

上級問題 解答

問題10 解答

# 電卓プログラム
print("簡単な電卓プログラム")
print("利用可能な演算子: +, -, *, /")

try:
    num1 = float(input("最初の数値を入力してください: "))
    operator = input("演算子を入力してください: ")
    num2 = float(input("二番目の数値を入力してください: "))

    if operator == "+":
        result = num1 + num2
        print(f"{num1} {operator} {num2} = {result}")
    elif operator == "-":
        result = num1 - num2
        print(f"{num1} {operator} {num2} = {result}")
    elif operator == "*":
        result = num1 * num2
        print(f"{num1} {operator} {num2} = {result}")
    elif operator == "/":
        if num2 != 0:
            result = num1 / num2
            print(f"{num1} {operator} {num2} = {result}")
        else:
            print("エラー: 0で割ることはできません")
    else:
        print("無効な演算子です")

except ValueError:
    print("数値を正しく入力してください")

実行例:

簡単な電卓プログラム 利用可能な演算子: +, -, *, /
最初の数値を入力してください: 10
演算子を入力してください: *
二番目の数値を入力してください: 5 10.0 * 5.0 = 50.0

問題11 解答

# じゃんけんゲーム
import random

def janken_game():
    # ユーザーの入力
    user_hand = input("じゃんけん! (グー/チョキ/パー): ")

    # 入力の検証
    if user_hand not in ["グー", "チョキ", "パー"]:
        print("無効な入力です。グー、チョキ、パーのいずれかを入力してください。")
        return

    # コンピューターの手をランダムに選択
    hands = ["グー", "チョキ", "パー"]
    computer_hand = random.choice(hands)

    print(f"あなた: {user_hand}")
    print(f"コンピューター: {computer_hand}")

    # 勝敗判定
    if user_hand == computer_hand:
        print("引き分け!")
    elif (user_hand == "グー" and computer_hand == "チョキ") or \
         (user_hand == "チョキ" and computer_hand == "パー") or \
         (user_hand == "パー" and computer_hand == "グー"):
        print("あなたの勝ち!")
    else:
        print("コンピューターの勝ち!")

# ゲーム実行
janken_game()

実行例:

じゃんけん! (グー/チョキ/パー): グー
あなた: グー
コンピューター: チョキ
あなたの勝ち!

問題12 解答

# BMI計算と体型判定プログラム
def calculate_bmi(weight, height):
    """BMIを計算する関数"""
    return weight / (height ** 2)

def evaluate_body_type(bmi):
    """BMI値から体型を判定する関数"""
    if bmi < 18.5:
        return "低体重"
    elif bmi < 25:
        return "普通体重"
    elif bmi < 30:
        return "肥満(1度)"
    elif bmi < 35:
        return "肥満(2度)"
    elif bmi < 40:
        return "肥満(3度)"
    else:
        return "肥満(4度)"

# メインプログラム
try:
    weight = float(input("体重(kg)を入力してください: "))
    height_cm = float(input("身長(cm)を入力してください: "))

    # cmをmに変換
    height_m = height_cm / 100

    # BMI計算
    bmi = calculate_bmi(weight, height_m)
    body_type = evaluate_body_type(bmi)

    # 結果表示
    print(f"\nBMI: {bmi:.2f}")
    print(f"体型判定: {body_type}")

    # 詳細情報
    print("\n--- BMI基準 ---")
    print("18.5未満: 低体重")
    print("18.5以上25未満: 普通体重")
    print("25以上30未満: 肥満(1度)")
    print("30以上35未満: 肥満(2度)")
    print("35以上40未満: 肥満(3度)")
    print("40以上: 肥満(4度)")

except ValueError:
    print("数値を正しく入力してください")
except ZeroDivisionError:
    print("身長は0より大きい値を入力してください")

実行例:

体重(kg)を入力してください: 65
身長(cm)を入力してください: 170
BMI: 22.49
体型判定: 普通体重 --- BMI基準 --- 18.5未満: 低体重 18.5以上25未満: 普通体重 25以上30未満: 肥満(1度) 30以上35未満: 肥満(2度) 35以上40未満: 肥満(3度) 40以上: 肥満(4度)