【Python 雑談・雑学】 ユーザー入力に応じて異なる処理関数を実行する際の少し面白い実装方法 - ユーザーの選択項目とそれに応じる関数名をディクショナリで保持する - 投稿一覧へ戻る
Published 2020年5月29日21:02 by T.Tsuyoshi
例えば下記のようなメニューを提示してユーザーに入力を求め、入力された値に応じて実行する関数を振り分けるとします。
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 文の分岐がそれに応じて増えてしまうことがありません。
こちらの投稿にも興味があるかもしれません...
- 【Python 雑談・雑学 + coding challenge】Unicode の正規化処理 ( normalization ) を利用して、diacritical marks ( 発音区別符号 ) を取り除こう! テキスト解析の前処理としても重要です!
- 【Python 雑談・雑学 + coding challenge】文字列中の数字を抜き出して桁区切りをつけよう! 正規表現 (regular expression ) を使うと「えっ!?」っていうくらい簡単ですょ。lookahead と negative lookahead を使います。
- 【Python 雑談・雑学 + coding challenge】sorted 組み込み関数の key パラメータをうまく使って、カスタムオブジェクトを簡単にソートしよう! __getitem__、__len__ 特殊関数 ( special methods, dunder methods ) を実装すれば立派なシーケンス ( sequence ) です
- 【Python 雑談・雑学 + coding challenge】Python の pprint 機能を自分で実装してみよう! 自分なりの Pretty Print できちゃいます!!
0 comments
コメントはまだありません。
コメントを追加する(不適切と思われるコメントは削除する場合があります)