LoginSignup
6
3

More than 3 years have passed since last update.

pythonでswitch文をdictで完全再現

Posted at

はじめに

Pythonにはswitch文は存在しません,if-elif-else文を使って同じことができるという理由から、switch文は採用していないとのことです。
今回はif-elif-elseではなく、dictの特性を活かしてswitch文を完全再現してみよう。

switch文は何できるでしょう

お馴染みのPHPでswitch文の参考例をみてみよう

switch.php
<?php
switch ($変数) {
    case $変数の値が0の場合:
        echo "$変数が0に等しい";
        ...
        break;
    case $変数の値が1の場合:
        echo "$変数は1に等しい";
        ...
        break;
    case $変数の値が2の場合:
        echo "$変数は2に等しい";
        ...
        break;
    default:
       echo "$変数の結果がどの値とも一致しなかった";
       ...
}
?>

とてもわかりやすい分岐処理です

  • 変数の値によって実行するコードブロックが違う
    • 通常ブロックのコードは一行で終わるのが読みやすいですが、実際長々と書くことも可能ですので、そこも後でちゃんと再現する
  • 変数の値がどれにも当てはまらない時にdefaultのブロックが実行されます

Pythonのdictでswitch文を再現

switch.py
# 変数を定義 
day = 6

# dickのvalueとして使用する関数を定義
def get_sunday():
    return "Sunday"

def get_monday():
    return "Monday"

def get_tuesday():
    return "Tuesday"

def get_unknown():
    return "get_unknown"

# dickを定義
switcher = {
    # dickのvalueに関数を渡しておく
    0: get_sunday,
    1: get_monday,
    2: get_tuesday
}
# 直接変数dayを渡すと、key存在しない場合エラーが返ってきます
# keyが存在しない場合もあるため
# 返り値指定可能のget()を使用 、パラメータにも関数渡しておこう
day_name = switcher.get(day, get_unknown)()
print(day_name)

# 出力結果
get_unknown   

switch文の機能完全再現、ブロックの操作が独立したことで、codeもある程度わかりやすい。

Readability counts.
読みやすいことは善である。 --pythonの禅

6
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3