if / elif / else
このレッスンで作るもの —
elifとelseで 3 つ以上に枝分かれさせ、金額から使いすぎ具合を判定するspending_levelを作ります。
if / elif / else
前回の price_alert は「高額」か「通常」かの 2 択でした。しかし現実の判定は 2 択で終わらないことのほうが多く、おこづかい帳でも「節約できている」「普通」「使いすぎ」の 3 段階くらいには分けたくなります。
3 つ以上に枝分かれさせるときに使うのが elif と else です。
文法を確認する
elif は「そうでなくて、もし」という意味で、else if を縮めた言葉です。else は「それ以外すべて」を受け止めます。
def spending_level(price):
if price < 500:
return "節約"
elif price < 2000:
return "普通"
else:
return "使いすぎ"elif はいくつでも並べられます。else は条件を書かないので、末尾に 1 つだけです。else は付けなくても構いません。
ifからelseまでの全体でひとかたまりです。どれか 1 つだけが実行され、残りは必ず飛ばされます。
上から順に、最初に当たったものだけ
elif の連なりでいちばん大事なのは、上から順に判定し、最初に True になったところで打ち切る という点です。下の枝がどれだけ当てはまっても、上で決まってしまえばもう見に行きません。
spending_level(300) の流れは下記のとおりです。
300 < 500を計算するとTruereturn "節約"で関数が終わるelif price < 2000は 計算すらされない
elif price < 2000 にたどり着いた時点で、price が 500 以上であることは確定しています。だから elif 500 <= price < 2000 のように下限を書き足す必要はありません。書いても間違いではありませんが、条件が長くなるぶん読みにくくなります。
上の枝で弾かれた条件は、下の枝では前提として使えます。これが
elifを並べる最大の利点です。
if を並べるのとは違う
elif を使わず if を 3 つ並べると、意味が変わります。
def spending_level(price):
if price < 500:
return "節約"
if price < 2000:
return "普通"
return "使いすぎ"今回は各枝が return で終わっているので、たまたま結果は同じになります。しかし return ではなく変数への代入にすると、if を並べた形では下の条件も全部評価され、最後に当たったもので上書きされてしまいます。elif なら「どれか 1 つだけ」が文法として保証されます。
手元で動かしてみる
境目の値を並べて呼ぶと、判定の切り替わりが目で見えます。
print(spending_level(499))
print(spending_level(500))
print(spending_level(1999))
print(spending_level(2000))節約 普通 普通 使いすぎ の順に出れば正しく書けています。< と <= を取り違えていると、この 4 つのどこかがずれます。
よくある間違い
elifの順番が逆 —if price < 2000を先に書くと、300も2000未満なので「普通」で確定してしまい、「節約」に永遠に届きません。狭い条件から先に 書きます。elseに条件を書く —else price >= 2000:はSyntaxErrorです。条件を付けたいならelifを使います。elseifやelse ifと書く —Pythonの綴りはelifです。他の言語の書き方をそのまま持ち込むとSyntaxErrorになります。
< と <= の取り違えも定番です。500 を「普通」に入れたいなら上の枝は price < 500 であり、price <= 500 ではありません。
やってみよう
関数 spending_level(price) を実装してください。price が 500 未満なら "節約"、500 以上 2000 未満なら "普通"、2000 以上なら "使いすぎ" を返します。
if / elif / else の 3 段で書いてみてください。書けたら 499 500 1999 2000 の 4 つを渡して、境目がずれていないか確かめてみてください。
要件
- 関数名は spending_level で、引数は price の 1 つ
- price が 500 未満なら "節約" を return する
- price が 500 以上 2000 未満なら "普通" を return する
- price が 2000 以上なら "使いすぎ" を return する
- if / elif / else を使い、狭い条件から先に書く
入出力例
spending_level(300) → "節約"
spending_level(499) → "節約"
spending_level(500) → "普通"
spending_level(1999) → "普通"
spending_level(2000) → "使いすぎ"
spending_level(0) → "節約"