【Python 雑談・雑学】 ユーザー入力に応じて異なる処理関数を実行する際の少し面白い実装方法 - ユーザーの選択項目とそれに応じる関数名をディクショナリで保持する - 投稿一覧へ戻る
Published 2020年5月29日21:02 by mootaro23
SUPPORT UKRAINE
- Your indifference to the act of cruelty can thrive rogue nations like Russia -
例えば下記のようなメニューを提示してユーザーに入力を求め、入力された値に応じて実行する関数を振り分けるとします。
このような場合、次のような if-else 文を利用して処理を分岐させるのが普通だと思います。
ただ、こんな方法もあります。
'key' として 'ユーザーからの入力項目'、'value' として '実行する関数名' からなるディクショナリ、user_choices を定義しています。
あとは、ユーザーからの入力に応じて、
で、目的の関数を実行します。ディクショナリから取得した value 値に () をつけて実行しているところがミソです。
この実装方法だと、もし選択項目が増えたとしても、if-else 文の分岐がそれに応じて増えてしまうことがありません。
USER_CHOICE = """選択項目:
- 'a' いいことを表示します
- 'b' もっといいことを表示します
- 'c' それよりもいいことを表示します
- 'q' もういいです
どれがいいですか? """
- '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_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)
'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]()
user_choices[user_input]()
で、目的の関数を実行します。ディクショナリから取得した value 値に () をつけて実行しているところがミソです。
この実装方法だと、もし選択項目が増えたとしても、if-else 文の分岐がそれに応じて増えてしまうことがありません。
この記事に興味のある方は次の記事にも関心を持っているようです...
- People who read this article may also be interested in following articles ... -