初めてのPython(12章)

条件分岐のifステートメント

構文、多分岐

if ~ elif ~ elseを使う。else ifじゃないので注意が必要。

if <条件1>:
  処理1
elif <条件2>:
  処理2
else:
  処理3

多分岐(switch)に該当するステートメントは存在しないので、elifをいっぱい並べて実現。
条件判定が固定であれば、ディクショナリをつかって多分岐を実現可能
(has_key()を使う - if文が必要?)

>>> dict = {'spam':1, 'ham':2, 'bacon':0}
>>> ingredient = 'ham'
>>> if dict.has_key(ingredient):
...     print "%d %s in fridge" % (dict[ingredient], ingredient)
... else:
...     print "No %s in fridge" % (ingredient)
... 
2 ham in fridge
>>> ingredient = 'egg'
>>> if dict.has_key(ingredient):
...     print "%d %s in fridge" % (dict[ingredient], ingredient)
... else:
...     print "No %s in fridge" % (ingredient)
... 
No egg in fridge
>>> 

(get()を使う - if文が無い分すっきり)

>>> dict = {'spam':1, 'ham':2, 'bacon':0}
>>> ingredient = 'ham'
>>> print "%s %s in fridge" % (dict.get(ingredient, 'No'), ingredient)
2 ham in fridge
>>> ingredient = 'egg'
>>> print "%s %s in fridge" % (dict.get(ingredient, 'No'), ingredient)
No egg in fridge
>>>

比較演算/ブール演算

オブジェクトに対するPythonのTrue/False判定の復習(9章後半)

  • 0でない数値、空でないオブジェクトはTrue
  • 数値0、空のオブジェクト、NoneはFalse

比較演算については以下の処理が行われる

  • 比較結果が正しければTrue、間違っていればFalseが変える
  • データ構造が比較対象の場合、構成要素1つ1つについて比較し、比較結果が生成される

ブール演算につかう演算子は次の3つ(オペランドXおよびYはTrue/Falseと解釈される/を返す式が入る)

and/or演算子を使った場合に、結果(True/False)が直接返される訳でなく、オペランドが返ることによって判定が行われる

or演算子の評価処理

最初にTrueが出たオペランドで評価が終わり、そのオペランドが戻り値となる。
全てのオペランドがFalseと評価される場合、最終オペランドが戻り値となる。

>>> 0 or 2
2
>>> 2 or 0
2
>>> [] or {}
{}
>>> 
and演算子の評価処理

最初にFalseが出たオペランドで評価が終わり、そのオペランドが戻り値となる。
全てのオペランドがTrueと評価される場合、最終オペランドが戻り値となる。

>>> 0 and 2
0
>>> 3 and 0
0
>>> 2 and 3
3
>>> 

if/else式

次の3つは同じ処理になる。
判りやすさでいうとif/elseが一番なので、当たり前に判る場合だけ(B)とか(C)とかを使う。
(A)

if X:
    A = X
else:
    A = Z

(B - Python2.5以降)

A = Y if X else Z

(C - YがTrueであることが前提)

A = ((X and Y) or Z)

同じ結果を得たければbool()を使えば良いが、この場合Y,Zともに実行されるため処理が異なる(上はXに応じてどちらか一方だけ)
bool()はXがTrueならば1、Falseならば0を返すので同じ結果を得られる。

A = [Z, Y][bool(X)]