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

Web APP Python
スポンサーリンク

6日目のゴール

6日目のテーマは
「数値メニューと関数分岐を“自分で見直して、よりシンプルに書き直せるようになること” です。

ここまでであなたはすでに、

メニューを表示できる
番号に応じて関数を呼び分けられる
終了を選ぶまでループできる
メニュー定義や入力処理を関数に分けられる

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

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

分岐の書き方をもっとスッキリさせる
「番号 → 関数」の対応を、より自然な形にする
自分のコードを「これ、もっと短くできない?」という目で見直す

ここを狙っていきます。


5日目までの分岐を“批評の目”で見る

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

ちゃんと動きます。
読みやすくもあります。

でも、メニューの項目が
4、5、6…と増えていったらどうでしょう。

if choice == “4”:
elif choice == “5”:
elif choice == “6”:

と、どんどん伸びていきます。

6日目でやりたいのは、
「同じパターンが増えそうなところを、もっと短く書けないか?」
と考えることです。


「番号 → 関数」を辞書で表現する

辞書という“対応表”を使う

Python には「辞書(dict)」という
「キーと値のペア」を持てる型があります。

これを使うと、
「番号 → 関数」の対応を
とても自然に書けます。

例えば、こうです。

actions = {
    "1": say_hello,
    "2": show_goal,
    "3": calc_sum,
}
Python

この一行一行が、

“1” というキーに対して say_hello という関数
“2” というキーに対して show_goal という関数
“3” というキーに対して calc_sum という関数

という対応を表しています。

ここで重要なのは、
値として「関数そのもの」を入れていることです。

呼び出すときは、こう書けます。

action = actions.get(choice)
Python

もし choice が “1” なら、action は say_hello になります。
もし “9” のような存在しないキーなら、action は None になります。


辞書を使った分岐に書き換える

get_action を辞書ベースにする

5日目の get_action を、
辞書を使って書き直してみます。

def get_action(choice):
    actions = {
        "1": say_hello,
        "2": show_goal,
        "3": calc_sum,
    }
    return actions.get(choice)
Python

これで、
if / elif の列は消えました。

番号が増えたら、
辞書の中に行を足すだけです。

“4”: some_function
“5”: another_function

というふうに増やしていけます。

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

「番号 → 関数」の対応を
コードの“形”としてそのまま表現できている

ということです。


main をさらに“流れだけ”に近づける

6日目版 main の形

辞書ベースの get_action を使って、
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

ここまで来ると、
main はほとんど「日本語の流れ」と同じです。

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

このレベルまで“流れだけ”にできていれば、
アプリが大きくなっても main で迷子になりません。


メニュー定義とアクション対応を“揃える”感覚

get_menu_items と get_action を見比べる

5日目で作った get_menu_items は、こうでした。

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

そして、6日目の get_action はこうです。

def get_action(choice):
    actions = {
        "1": say_hello,
        "2": show_goal,
        "3": calc_sum,
    }
    return actions.get(choice)
Python

ここで意識してほしいのは、

“1” は「あいさつする」かつ say_hello
“2” は「今日の目標を表示する」かつ show_goal
“3” は「簡単な足し算をする」かつ calc_sum

という対応が、
メニュー表示側とアクション側で
きれいに揃っていることです。

この「揃っている感覚」があると、
メニューを増やしたり直したりするときに
迷いが減ります。


6日目のミニアプリ:辞書ベース分岐つきメニューアプリ

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

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


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


def show_goal():
    print("今日の目標:")
    print("・番号と関数の対応を辞書で表現する")
    print("・main を“流れだけ”に近づける")


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):
    actions = {
        "1": say_hello,
        "2": show_goal,
        "3": calc_sum,
    }
    return actions.get(choice)


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 なら終了 → 対応する関数を取得 → あれば実行」
という流れを管理する。

ここまで日本語で説明できていれば、
数値メニューと関数分岐は、もう完全にあなたの道具です。


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

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

同じパターンが増えそうなところは、
辞書などを使って「対応表」として表現できる。

数値メニューは
「番号と説明文の一覧」として定義し、
関数分岐は
「番号と関数の対応表」として書ける。

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

7日目では、
このメニューアプリを題材にしながら、
「自分のコードを自分で評価して、改善ポイントを言葉にする」
というところまで持っていきます。

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