【Python 雑談・雑学】 ユーザー入力に応じて異なる処理関数を実行する際の少し面白い実装方法 - ユーザーの選択項目とそれに応じる関数名をディクショナリで保持する - 投稿一覧へ戻る

Tags: miscellaneous , dictionary , python

Published 2020年5月29日21:02 by T.Tsuyoshi

例えば下記のようなメニューを提示してユーザーに入力を求め、入力された値に応じて実行する関数を振り分けるとします。


USER_CHOICE = """選択項目:

- 'a' いいことを表示します
- 'b' もっといいことを表示します
- 'c' それよりもいいことを表示します
- 'q' もういいです

どれがいいですか? """



このような場合、次のような if-else 文を利用して処理を分岐させるのが普通だと思います。


def menu():
user_input = input(USER_CHOICE)
while user_input != 'q':
if user_input == 'a':
print_normal()
elif user_input == 'b':
print_better()
elif user_input == 'c':
print_best()
else:
print('ちゃんと選んでください...\n')

user_input = input(USER_CHOICE)



ただ、こんな方法もあります。


user_choices = {
'a': print_normal,
'b': print_better,
'c': print_best,
}

def menu():
user_input = input(USER_CHOICE)
while user_input != 'q':
if user_input in ('a', 'b', 'c'):
user_choices[user_input]()
else:
print('ちゃんと選んでください...\n')

user_input = input(USER_CHOICE)



'key' として 'ユーザーからの入力項目'、'value' として '実行する関数名' からなるディクショナリ、user_choices を定義しています。


あとは、ユーザーからの入力に応じて、


if user_input in ('a', 'b', 'c'):
user_choices[user_input]()



で、目的の関数を実行します。ディクショナリから取得した value 値に () をつけて実行しているところがミソです。


この実装方法だと、もし選択項目が増えたとしても、if-else 文の分岐がそれに応じて増えてしまうことがありません。

この投稿をメールでシェアする

0 comments

コメントはまだありません。

コメントを追加する(不適切と思われるコメントは削除する場合があります)