if / elif / else
2 択で終わる判定のほうが少ない
前回の if は、条件が成り立つか成り立たないかの 2 択でした。ところが現実の判定はもっと細かく、おこづかい帳でも「節約できている」「普通」「使いすぎ」くらいには分けたくなります。
3 つ以上に枝分かれさせるときに使うのが elif と else です。elif は「そうでなくて、もし」という意味で、else if を縮めた言葉です。else は条件を書かず、残り全部を受け止めます。
Python
def bag_size(count):
if count <= 3:
return "小"
elif count <= 10:
return "中"
else:
return "大"買った点数から袋の大きさを決める関数です。elif はいくつでも並べられます。else は末尾に 1 つだけで、付けなくても構いません。if から else までの全体でひとかたまりになり、どれか 1 つだけ が実行されます。
上で弾かれた条件は、下では前提になる
elif の連なりでいちばん大事なのは、上から順に判定し、最初に True になったところで打ち切るという点です。下の枝がどれだけ当てはまっても、上で決まればもう見に行きません。
bag_size(2) なら 2 <= 3 が True になった時点で "小" が返り、elif count <= 10 は 計算すらされません。
裏を返すと、elif count <= 10 にたどり着いた時点で count が 4 以上であることは確定しています。だから elif 4 <= count <= 10 のように下限を書き足す必要はありません。書いても間違いではありませんが、条件が長くなるぶん読みにくくなります。
上の枝を通り抜けてきたという事実が、そのまま下の枝の前提になります。これが
elifを並べる最大の利点です。
順番を逆にすると、下の枝に永遠に届かない
広い条件を先に書くと、狭い条件は飲み込まれます。上の例で count <= 10 を先に置けば、2 も 10 以下なので "中" で確定してしまい、"小" は一度も出ません。狭い条件から先に 書きます。
if を 3 つ並べても形は似ていますが、意味は違います。elif は「どれか 1 つだけ」が文法として保証されるのに対し、if の並びは全部の条件が評価されます。枝ごとに return するなら結果は同じですが、変数に代入する形にすると、最後に当たった枝で上書きされます。
綴りは elif です。elseif や else if と書くと SyntaxError になります。else に条件を付けたくなったら、それは elif の出番です。
やってみよう
関数 spending_level(price) を実装してください。price が 500 未満なら "節約"、500 以上 2000 未満なら "普通"、2000 以上なら "使いすぎ" を返します。
書けたら 499 500 1999 2000 の 4 つを渡して、境目がずれていないか確かめてみてください。< と <= を取り違えていると、この 4 つのどこかがずれます。
要件
- 関数名は spending_level で、引数は price の 1 つ
- price が 500 未満なら "節約" を return する
- price が 500 以上 2000 未満なら "普通" を return する
- price が 2000 以上なら "使いすぎ" を return する
- if / elif / else を使い、狭い条件から先に書く