くり返しとデータの持ち方

INPUT · スライド

終わらないループ

01 / 07

止まらないプログラム

while のレッスンで「進める行を忘れると終わらない」と書いたね。実際にやるとこうなるよ。

kazu がずっと 0 のままなので、kazu < 3 はいつまでも成り立つ。同じ行がひたすら流れ続けるんだ。

kazu = 0while kazu < 3:    print(kazu)

実行結果

0
0
0
このあとも止まらないので、教材のランタイムが一定時間でくり返しを打ち切る

02 / 07

なぜ終わらないのか

while は条件が成り立たなくなったときだけ終わる。ということは、終わらせるには条件に出てくる値が変わらないといけない。

上の例で条件に出てくるのは kazu ひとつ。その kazu を変える行がどこにもない。誰も終わらせに行っていないんだ。

止まらないコードを見たら、まずこう問いかけよう。「条件に出てくる値を、誰が変えている?」

03 / 07

よくある原因は3つ

無限ループの原因は、たいていこのどれかだよ。

  • 進める行を書き忘れた … kazu += 1 が無い
  • 進める行がくり返しの外にある … 字下げが足りない
  • 進める向きが逆 … 終わりから遠ざかっている

どれも「条件に出てくる値がどう動くか」を追えば見つかる。頭の中で走らせず、指で1周ずつ追うのがコツだよ。

04 / 07

字下げが足りないと外に出る

書き忘れていなくても、字下げが足りなければくり返しの外。中から見れば、書いていないのと同じだよ。

下の例では kazu += 1 が左端に戻ってしまっている。Python はエラーを出さない。文法としては正しい、終わらないプログラムのできあがりだ。

kazu = 0while kazu < 3:    print(kazu)kazu += 1

実行結果

0
0
0
このあとも止まらないので、教材のランタイムが一定時間でくり返しを打ち切る

05 / 07

向きが逆でも終わらない

while kazu > 0: は「kazu が0より大きいあいだ続ける」。そこで kazu を増やしてしまうと、条件はますます成り立ってしまう。

進める行はちゃんと中にあるのに終わらない。向きが、終わりに近づく側かどうかを条件と見くらべて確かめよう。

kazu = 1while kazu > 0:    print(kazu)    kazu += 1

実行結果

1
2
3
このあとも止まらないので、教材のランタイムが一定時間でくり返しを打ち切る

06 / 07

こわがらずに、わざと作ってみる

この教材のランタイムは、一定時間たつとくり返しを自動で打ち切るようにしてある。だからここでは安心してまちがえられるよ。

無限ループは初心者だけのものではない。仕事でコードを書く人もふつうに作ってしまう。ちがうのは直せるかどうかだけだ。

「なぜ終わらないのか」を自分の言葉で説明できるようになれば、それはもう理解したということ。だからこのレッスンの演習は、ぜんぶ止まらないコードを直して終わらせる問題にしてあるよ。

07 / 07

直すときの手順

止まらないコードに出会ったら、この順に見ていこう。

  • 条件に出てくる変数の名前を確かめる
  • その変数を変えている行を探す
  • その行がくり返しの中にあるか、字下げを見る
  • 変わる向きが、条件を成り立たなくする側か確かめる

4つとも通れば、そのくり返しは必ず終わる。走らせる前に終わることを自分で確かめられるようになれば、もうこわくないよ。