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日目で
「自分のメニューアプリを見直して、もっと良く書き直す」
というフェーズに自然に進んでいけます。


