Python講座 / if・elif・elseで処理を分岐する

if・elif・elseは、条件を上から確認して実行経路を選びます。最初に一致した一つの分岐だけが動くため、条件の順序と境界を先に設計することが大切です。

字下げで各分岐の範囲を表す

条件の後ろにコロンを置き、その分岐の処理を一貫した字下げで記述します。一般的には空白4個を使います。タブと空白が混ざると、見た目の位置がそろっていても同じ構造とは限りません。elseには条件を書きません。

独立したifが二つあれば、両方が実行される場合があります。ifとelifをつなげた場合は一つを選びます。排他的な分類をしたいのか、複数の警告を独立に判定したいのかで、適切な構造が変わります。

条件の組み合わせと境界確認は、比較演算子と論理演算子で条件を組み合わせると条件分岐と反復で成績を集計するで扱う規則とつながります。

金額分類の全体例を実行する

classify.pyへ次のコードを保存し、仮想環境でpython classify.pyを実行します。

amount = 8000
if amount < 0:
    label = "invalid"
elif amount == 0:
    label = "free"
elif amount <= 10000:
    label = "small"
else:
    label = "large"
print(label)

8000を与えた場合の予想結果です。

small

区間と境界を定義する

入力 分類結果
-1 invalid
0 free
1または10000 small
10001 large

この例は負数、0、1から10000、それより大きい値を分けています。先の分岐が除外したケースを、後続の分岐は考慮する必要がありません。広い条件を最初に置くと、後ろの条件へ到達できなくなる場合があります。

ここではamountが数値であることが前提です。文字列をintへ変換する処理と、その変換失敗への対応は、金額の区間分類とは別の段階です。

全経路と変数の定義を確認する

分岐後に使う変数は、到達できるすべての経路で値が設定される必要があります。一部の分岐でしかlabelを代入しなければ、別の入力でNameErrorになるかもしれません。行数を減らすより、どの経路で値が決まるかを明確にします。

表の入力をすべて試し、<=を<へ変えて10000の分類を比較したら元へ戻します。二つの独立した警告なら、別々のifが適切かも検討してください。動かない分岐では、さらに入れ子を増やす前に、その条件と先に一致する条件を調べます。中間の値だけを繰り返し試すより、境界の前後が有効な確認になります。

真の場合だけ result を代入すると、偽の経路では分岐後に未定義の名前を使うことになります。分岐前に初期値を置くか、ifとelseの両方で代入します。関数内で代入する名前は通常ローカルになるため、代入前の参照はUnboundLocalErrorになることがあります。すべての入力経路を確認します。

関連する公式リファレンス