条件演算子がない¶
変数 X の値が True のとき処理 Y を行い、 False のとき処理 Z を行う、
ということは if と else を使えば書けます。
if X:
A = Y()
else:
A = Z()
これを以下のように簡単に書けるようにするのが条件演算子です。
A = Y() if X else Z()
Python 2.4 では条件演算子がないのでこの書き方はできません。
こういう場合にどうするかというと、いくつかの書き方があります。
論理演算子
andとorが短絡評価されることを利用するA = X and Y() or Z()
条件演算子が導入されるまで一般的だったイディオムです。
たいていの場合これで十分なのですが、
Y()がFalse値を返す 可能性がある場合には、 A がTrueでもZ()が呼ばれてしまう という問題があるので、さらに工夫が必要です。and と or を使い、値をリストで囲む
A = (X and [Y()] or [Z()])[0]
1要素のリストは常に真と評価されるので、これで
Z()が誤って 呼ばれる心配はなくなりました。 でもちょっとわかりにくいですね。真偽値をシーケンスのインデックスとして使う
値の評価に副作用がない場合、こんな書き方もできます。
A = [Z, Y][X]
この例では、真偽値の
False,Trueが Python では数値の 0, 1 と 等価であるという性質を使って、XがFalseならリストの0番目の要素、Trueなら 1番目の要素を選択しています。これを応用して次のような面白い書き方ができます。
A = u"×○"[X]
素直に条件分岐を使う
Python の考え方を記述した Zen of Python (Python の禅) では、 “Simple is better than complex” とされています。 そのため、 Python ユーザの間ではトリッキーなコードより愚直でも 明確なコードが好まれる傾向にあります。
個人的には、条件演算子はあまり Python らしくないのでめったに使いません。
今回は、珍しく Python 2.4 でも別に困らないという例でした。