Python | 1 日 90 分 × 7 日アプリ学習:簡単メニュー選択アプリ(初級編)

Web APP Python
スポンサーリンク

5日目のゴール

5日目のテーマは
「数値メニューと関数分岐を“もっときれいに・拡張しやすく”書けるようにすること」です。

ここまでであなたは、

数字でメニューを表示できる
番号に応じて関数を呼び分けられる
終了を選ぶまでメニューを繰り返せる
入力部分を関数に切り出せる

というところまで来ています。

今日はここから一歩進んで、

メニューの「見た目」と「中身」を分ける
分岐のコードを“増やしやすい形”にする
「メニュー=機能の一覧」という感覚を、もう一段はっきりさせる

ここを狙っていきます。


今のメニューを「設計の目」で見直す

4日目までの main をもう一度眺める

典型的な形は、こんな感じでした。

def main():
    while True:
        show_menu()
        choice = ask_menu_choice()

        if choice is None:
            continue

        if choice == "1":
            say_hello()
        elif choice == "2":
            show_goal()
        elif choice == "3":
            calc_sum()
        elif choice == "0":
            print("アプリを終了します。")
            break
        else:
            print("不正な入力です。0, 1, 2, 3 のどれかを入力してください。")
Python

ちゃんと読めるし、ちゃんと動きます。
でも、こう思いませんか?

番号が増えたら、elif がずらーっと増えそう
「1 が何の機能か」をコードを見て思い出している

5日目では、ここを少しだけ整理して、
「メニューの定義」と「分岐のロジック」を分ける
という方向に進めます。


メニューの「定義」をひとまとめにする

番号と説明文をセットで持つ

まず、「メニューに何を並べるか」を
ひとまとめにしてみます。

def get_menu_items():
    return [
        ("1", "あいさつする"),
        ("2", "今日の目標を表示する"),
        ("3", "簡単な足し算をする"),
        ("0", "終了する"),
    ]
Python

ここでは、
番号(”1″ など)と説明文をペアにしたものを
リストで返しています。

この関数の意味は、
「このアプリにどんなメニュー項目があるかを教える」
です。

メニュー表示を「定義から作る」

この get_menu_items を使って、
show_menu を書き直します。

def show_menu():
    print("==========")
    print("メニュー")
    print("==========")

    for key, label in get_menu_items():
        print(f"{key}: {label}")

    print("==========")
Python

ここでの重要ポイントは、

メニューの中身を変えたいときは
get_menu_items だけを直せばいい

という状態になっていることです。


「番号 → 関数」の対応を整理する

分岐を「対応表」として書く

今までは if / elif で分岐していましたが、
「どの番号でどの関数を呼ぶか」を
“対応表”として書いてみます。

def get_action(choice):
    if choice == "1":
        return say_hello
    elif choice == "2":
        return show_goal
    elif choice == "3":
        return calc_sum
    else:
        return None
Python

ここでやっていることは、

番号を受け取って
「呼ぶべき関数そのもの」を返している

ということです。

呼び出し側は、こう書けます。

action = get_action(choice)

if action is None:
    print("不正な入力です。0, 1, 2, 3 のどれかを入力してください。")
else:
    action()
Python

ここでの深掘りポイントは、

if / elif の中で
「実際の処理」を書くのではなく、
「どの関数を使うか」だけを決めている

という構造になっていることです。


main を「流れだけ」に近づける

5日目版 main の形

ここまでの部品を使って、
main を書き直します。

def main():
    while True:
        show_menu()
        choice = ask_menu_choice()

        if choice is None:
            continue

        if choice == "0":
            print("アプリを終了します。")
            break

        action = get_action(choice)

        if action is None:
            print("不正な入力です。0, 1, 2, 3 のどれかを入力してください。")
            continue

        action()
Python

これを日本語にすると、こうです。

メニューを表示する
番号を入力してもらう(空ならやり直し)
“0” なら終了
それ以外なら、その番号に対応する関数を取得する
対応する関数がなければ「不正な入力」
あれば、その関数を実行する

かなり「流れだけ」に近づいてきました。


5日目のミニアプリ:メニュー定義+アクション対応表つき

今日の学びを全部入れたコード

def print_line():
    print("==========")


def say_hello():
    print("こんにちは!Python 簡単メニューアプリです。")


def show_goal():
    print("今日の目標:")
    print("・メニューの定義をひとまとめにする")
    print("・番号から“どの関数を呼ぶか”を整理する")


def calc_sum():
    print("足し算モードです。2つの数字を入力してください。")

    a_text = input("1つ目の数字: ")
    b_text = input("2つ目の数字: ")

    try:
        a = int(a_text)
        b = int(b_text)
    except ValueError:
        print("数字ではありません。足し算を中止します。")
        return

    result = a + b
    print("結果:", result)


def get_menu_items():
    return [
        ("1", "あいさつする"),
        ("2", "今日の目標を表示する"),
        ("3", "簡単な足し算をする"),
        ("0", "終了する"),
    ]


def show_menu():
    print_line()
    print("メニュー")
    print_line()

    for key, label in get_menu_items():
        print(f"{key}: {label}")

    print_line()


def ask_menu_choice():
    choice = input("番号を選んでください: ")

    if choice.strip() == "":
        print("何も入力されていません。0, 1, 2, 3 のどれかを入力してください。")
        return None

    return choice


def get_action(choice):
    if choice == "1":
        return say_hello
    elif choice == "2":
        return show_goal
    elif choice == "3":
        return calc_sum
    else:
        return None


def main():
    while True:
        show_menu()
        choice = ask_menu_choice()

        if choice is None:
            continue

        if choice == "0":
            print("アプリを終了します。")
            break

        action = get_action(choice)

        if action is None:
            print("不正な入力です。0, 1, 2, 3 のどれかを入力してください。")
            continue

        action()


main()
Python

役割を日本語で言い切ってみる

関数ごとの「一文説明」

print_line
メニューの上下に区切り線を表示する。

say_hello
あいさつメッセージを表示する機能。

show_goal
今日の学習目標を表示する機能。

calc_sum
2つの数字を入力してもらい、その合計を表示する機能。

get_menu_items
メニューに並べる「番号と説明文」の一覧を返す。

show_menu
メニュー一覧を画面に表示する。

ask_menu_choice
番号を入力してもらい、空なら None を返す。

get_action
番号に応じて「呼ぶべき関数そのもの」を返す。

main
メニューを回しながら、
「番号を受け取る → 0 なら終了 → 対応する関数を探す → あれば実行」
という流れを管理する。

ここまで日本語で言い切れるなら、
数値メニューと関数分岐は、もう十分“自分の武器”になっています。


5日目のまとめ:今日つかんでほしい感覚

今日の本質は、これです。

数値メニューは
「番号と説明文の一覧」として定義できる。

関数分岐は
「番号から“どの関数を呼ぶか”を決める対応表」として書ける。

main は
「入力 → 終了判定 → 対応する関数を取得 → 実行」
という“流れだけ”を書く場所に近づけていく。

この感覚を持てていれば、
6日目・7日目で
「自分のメニューアプリを見直して、もっと良く書き直す」
というフェーズに自然に進んでいけます。

タイトルとURLをコピーしました