breakとcontinue
1 件だけ飛ばしたいのに、全部止まってしまう
ループは最後まで全部回すのが基本ですが、途中で流れを変えたくなることがあります。用意されている命令は 2 つで、名前は似ていますが行き先がまったく違います。
continue は その周だけ飛ばして次に進む 命令です。
Python
for name in ["りんご", "", "パン"]:
if name == "":
continue
print(name)continue に到達すると、その下の print(name) は実行されず、すぐ次の周に進みます。表示されるのは りんご と パン だけです。
break は ループそのものを抜ける 命令です。
Python
for name in ["りんご", "パン", "おわり", "牛乳"]:
if name == "おわり":
break
print(name)おわり に当たった時点でループが終わるので、うしろの 牛乳 は読まれません。表示は りんご と パン の 2 行です。
breakは建物から出る、continueは次の部屋へ進む。この差をはっきり持っておくと迷いません。
書いた順番が、そのまま優先順位になる
飛ばす判定と打ち切る判定を同じループに入れると、上に書いたほうが先に効きます。打ち切りを先に置けば、合図に当たった時点でその周の残りは一切動きません。
判定が重ならない値どうしなら、どちらを先に書いても結果は同じです。ただし条件が重なる場合は、順番がそのまま優先順位になります。elif で「上から順に評価される」と学んだのと同じ話です。
continue より下に書いた行は、その周では絶対に動きません。「書いたのに実行されない」という相談の多くは、これが原因です。
while と組み合わせるときは特に慎重に扱います。continue で戻ったときに位置を進める行を飛ばしてしまうと、そのまま無限ループになります。
break で抜けたあとは、ループの下に続く
break はループを終わらせるだけで、関数を終わらせるわけではありません。抜けたあとは、ループの下に書いた行から続きます。
だから break で抜ける形を書いたときは、ループの下に return があるかを必ず確かめます。無いと関数は None を返します。
なお continue を使わず if で囲んでも、飛ばす条件が 1 つなら結果は同じです。条件が増えてくると continue を並べたほうがインデントを浅く保てて、読みやすくなります。
やってみよう
関数 total_skip_zero(prices) を実装してください。引数 prices は金額 (int) が並んだリストです。
0 の要素は continue で飛ばして合計に入れません。-1 は打ち切りの合図なので、break でループを抜け、それ以降は読みません。それ以外の金額を足した合計を return します。
prices が空のとき、-1 が先頭にあるとき、0 しか入っていないときは、いずれも 0 を返します。3 つとも、合計を 0 から始めていれば自然にそうなります。
要件
- 関数名は total_skip_zero で、引数はリスト prices の1つだけにする
- 0 の要素は continue で飛ばして合計に入れない
- -1 に当たったら break でループを抜け、それ以降は読まない
- 空のリストや -1 が先頭の場合は 0 を返す
入出力例
total_skip_zero([120,0,80,-1,500]) → 200
total_skip_zero([120,80,300]) → 500
total_skip_zero([0,0,0]) → 0
total_skip_zero([-1,120,80]) → 0
total_skip_zero([]) → 0
total_skip_zero([0,250,-1]) → 250