« [ google ] Innovation に繋がる Chaos | トップページ | [Python] 酷いコード »

2006/10/19

[python]楽に条件分岐を行う方法

今回は if 文を 使わずに条件に合わせた処理を呼び出す方法。

条件ごとに処理を変えたい場合、一番よく知られているのは if 文だろう。C 言語などならば switch-case を使ったり、ちょっとトリッキーにポインタと配列を組み合わせるかもしれない。

Python では、標準で使える条件分岐は、残念なことに if 文しかない。2~3 個の分岐なら、読むほうも書くほうもちょっと我慢すればいい。しかし、分岐が10個とかあるいはそれ以上になると書くのもイヤだし読むのもイヤだ。

これを解決する方法は、大きく分けて2通りある。条件ごとの処理が全く違う場合と、条件が違っても処理の大部分は同じ場合だ。前者で処理ごとの関数を定義しなければならないのは if 文を使う場合と同じだが、後者の場合は大幅に簡略化できる。

まず、条件ごとの処理が大きく違う場合を考えよう。この場合は、それぞれの条件における処理を関数などに定義しておかなくてはならない。が、このときにちょっと工夫をするだけでかなり楽になるのだ。条件は "hoge", "fuge", "piyo" の3つがあるとしよう。すると、関数の定義は次のようになる。

# -*- coding: UTF-8N -*-
def handle_hoge( arguments ):
    (処理の定義)

def handle_fuge( arguments ):
    (処理の定義)

def handle_piyo( arguments ):
    (処理の定義)

次に定義した関数を呼び出す部分のコードだ。

exec "handle_%s( arguments )" % condition

たった1行だ。とはいっても IOCCC のように邪悪なコードではない。とても単純で簡単なコードだ。恐らく、 exec 構文知っているなら誰でも理解できるレベルだと思う。( とはいってもモジュール丸ごと動的生成するようなコードはとてつもなく邪悪になる( ´・ω・`) )
if 文を使ったよくあるコードと比べてみよう。

# よくある if を使ったコード
def hoge_hoge( arguments ):
    (処理の定義)

def fuge_fuge( arguments ):
    (処理の定義)

def piyo_piyo( arguments ):
    (処理の定義)

# 条件に合った関数を呼び出す
if condition == hoge :
    hoge_hoge( arguments )
elif condition == fuge :
    fuge_fuge( arguments )
elif condition == piyo :
    piyo_piyo( arguments )

この場合は条件が3つしかないからあまり効果が実感できない人もいるかもしれない。実感できないなら、場合分けが20通りもあって、さらに増える(つまり、あとで追加するかもしれない)可能性がある場合を考えてみよう。 exec 構文を使ったコードのほうが柔軟性も高いことが理解していただけると思う。

ちなみに、condition が数値である場合にはリストか辞書配列を定義して、数値から名前を引きできるようにしておけばいい。Python ならリストを生成するコードも簡単に書ける。リストも動的に生成するようにしておけば、後で分岐条件が増えたとしてもその処理を行う関数を追加するだけで動作する。

ポイントは関数名のフォーマットに一貫性を持たせること。condition の値が数値やオブジェクトの場合はそれと関数名を結びつけるリストか辞書配列を定義することの2つ。

|

« [ google ] Innovation に繋がる Chaos | トップページ | [Python] 酷いコード »

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/103108/12341173

この記事へのトラックバック一覧です: [python]楽に条件分岐を行う方法:

« [ google ] Innovation に繋がる Chaos | トップページ | [Python] 酷いコード »