if / elif / else

このレッスンで作るもの — elifelse で 3 つ以上に枝分かれさせ、金額から使いすぎ具合を判定する spending_level を作ります。

if / elif / else

前回の price_alert は「高額」か「通常」かの 2 択でした。しかし現実の判定は 2 択で終わらないことのほうが多く、おこづかい帳でも「節約できている」「普通」「使いすぎ」の 3 段階くらいには分けたくなります。

3 つ以上に枝分かれさせるときに使うのが elifelse です。

文法を確認する

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) の流れは下記のとおりです。

  1. 300 < 500 を計算すると True
  2. return "節約" で関数が終わる
  3. elif price < 2000計算すらされない
diagram (will load when visible)

elif price < 2000 にたどり着いた時点で、price500 以上であることは確定しています。だから 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 つのどこかがずれます。

よくある間違い

  1. elif の順番が逆if price < 2000 を先に書くと、3002000 未満なので「普通」で確定してしまい、「節約」に永遠に届きません。狭い条件から先に 書きます。
  2. else に条件を書くelse price >= 2000:SyntaxError です。条件を付けたいなら elif を使います。
  3. elseifelse if と書くPython の綴りは elif です。他の言語の書き方をそのまま持ち込むと SyntaxError になります。

<<= の取り違えも定番です。500 を「普通」に入れたいなら上の枝は price < 500 であり、price <= 500 ではありません。

やってみよう

関数 spending_level(price) を実装してください。price500 未満なら "節約"500 以上 2000 未満なら "普通"2000 以上なら "使いすぎ" を返します。

if / elif / else の 3 段で書いてみてください。書けたら 499 500 1999 2000 の 4 つを渡して、境目がずれていないか確かめてみてください。

要件

  1. 関数名は spending_level で、引数は price の 1 つ
  2. price が 500 未満なら "節約" を return する
  3. price が 500 以上 2000 未満なら "普通" を return する
  4. price が 2000 以上なら "使いすぎ" を return する
  5. if / elif / else を使い、狭い条件から先に書く

入出力例

spending_level(300)"節約" spending_level(499)"節約" spending_level(500)"普通" spending_level(1999)"普通" spending_level(2000)"使いすぎ" spending_level(0)"節約"

ヒント

生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア
編集 LuaGate編集部
main.py
main.py
学習モード

メモ

if / elif / else

⌘S で保存