📖
【Python】関数に振り分ける分岐処理を簡略化しよう
こんな処理、ありがち
変数をステータスとして、そのステータスによって分岐させることってよくありますよね。
私もよくあります。
例えば、以下のような状態だとしましょう。
# 分岐先の関数を定義
def one():
print('one()が実行されました。')
def two():
print('two()が実行されました。')
def three():
print('three()が実行されました。')
def default():
print('default()が実行されました。')
# xをもとに各関数に分岐する
x = 2
if x == 1:
one();
elif x == 2:
two();
elif x == 3:
three();
else:
default();
何か一見最適化されていて、これ以上簡略化はできなさそうな感じがしますね。
できるとしたら、ifやelseの中身を同じ行にまとめてしまうことでしょうか。
でも実は、もっと分岐を簡略化できちゃいます。
簡略化
関数の定義を除くと、分岐の箇所を以下のように簡略化できます。
# xをもとに各関数に分岐する
x = 2
actions = {1: one, 2: two, 3: three}
action = actions.get(x, default)
action()
なぜこうなるのか
あるPythonをある程度慣れている方は、すぐに理解できてしまっていると思います。
分からない方のためにサックリ説明します。
-
各関数を分岐したい条件と一致する値のキーで
dict
化します。actions = {1: one, 2: two, 3: three}
-
その
dict
が持つget
メソッドを、ステータスとなる変数をキーに実行します。
渡したキーに一致する要素があれば、その関数が戻ってきます。
なければ、get
メソッドの第二引数が戻ってきます。action = actions.get(x, default)
-
戻ってきた関数が入った変数を実行しましょう。
action()
それではよいPythonライフを。
参考
- 簡略化アイデア
https://www.youtube.com/shorts/UFdEp9wrtOY - dictのgetメソッド
https://note.nkmk.me/python-dict-get/
Discussion