無限ループで習得するwhile文
現在、テキスト『Head First はじめてのプログラミングー頭とからだで覚えるPythonプログラミング入門』をぼちぼち消化中。
3章のwhile文を順調にクリアしたハズだったけど、テキスト内で「あなたはwhileループの動作を頭に叩き込む必要があります」と念押ししていたのが気になったので、例題をちょっと改造したモジュールを作成。
そしたら……出るわ出るわ、エラーの嵐。
念押しされてた理由がよーくわかった。
テキストのガイドがない状態で1からコードを書いてみると、今の自分の理解度がハッキリする。ふつーの頭しか持っていない私に、一発理解はムリだったよ。while文は。
あやふやな土台の上に積み上げていくより、しっかり固めた基礎の上に積み上げたほうが後々ラクだから。突貫工事はやめて、一歩一歩踏み固めるように進みますわ。
時間はかかったけど、おかげでwhile文が理解できた。
たぶん。
きっとね!
1.改造モジュール作成
【恐ろしい無限ループに注意(P.113)】の例題を改造。
この練習問題を選んだのは、counter = counter +1(改造版モジュールだと7行目)が何を意味しているかわからなかったから。
ロケット発射のカウントダウンっぽく、ちょっと改造したモジュールの内容は以下のとおり。
print('Rocket ready for launch')
counter = 10
while counter > 7:
print('Counter is', counter)
counter = counter + 1
print('Ignition')
while counter <= 7 or counter > 0:
print('Counter is', counter)
counter = counter - 1
print('Lift off')
考えてもわからないならイジってみるしかない。というわけで、以下の3パターンを実行して様子をみることに。
①7行目をcounter = +1
②7行目をcounter = counter
③7行目をcounter = -1
※改行は空行も含めてカウント
2.改造モジュール実行・1回目
①7行目を counter = +1
①を実行すると、なぜかカウントアップされる。
でもコレ、想定内。
テキストでもカウントアップさせて無限ループの恐怖を味あわせてから、修正→成功!の流れなのだ。でも "+1" が失敗で "-1" が成功の理由が自分で説明できない…
これは理解できてない証拠。
ケーススタディでやってけば、そのうちわかるでしょ。
3.改造モジュール実行・2回目
②7行目を counter = counter
②を実行すると、延々と"10"がカウントされる。
なぜ "10" なのか。
この数字はどこから出てきたんだ?
関係のありそうな3行目から7行目まで日本語に翻訳。
counterは10
counterが7より大きい間は
「Counter is (counterの数)」を表示
counterは10
counterが7以下ならば「Ignition!」を表示
なるほど。
ようやく解った。
while(ループ範囲の条件):
変数がループ範囲条件の時、実行するコード
変数がループ範囲条件の時、実行するコード
変数がループ範囲条件以外の時、実行するコード
となっているんだ。
7行目のコードが何かの設定条件だと勘違いしていた。でも、これで解決!
次はcounter = counter -1 で10から1ずつ引いてカウントダウンを成功させるぞー!
4.改造モジュール実行・3回目
③7行目を counter = -1
③を実行すると、カウントダウン成功。
Ignition!(点火)したけどLift off(発射)されない。しかも、カウントダウンが止まらない!
なんで?
どうして?
どこが悪いのーーーーっ!
ひとまずPython shellを閉じて、ひと呼吸。
叫んでも解決しないのでコードを確認。
'Ignition!' の表示はされていたから、ここまでは問題なし。アヤシイのは 'or' かな?whileの範囲条件を 'and' にするか迷った結果、「大は小を兼ねる」の精神で 'or' にしたのがアウトなのかも。
counter <= 7 or counter > 0 が示す範囲は
・7以下
・0より大きい
上記2つのどちらか片方の条件に当てはまればOK。マイナスは7以下の条件に当てはまるので無限ループになってしまった、ということだと思う。
'or' を 'and' に変えて指定範囲をせばめてみる。
5.改造モジュール実行・4回目
10行目を counter <= 7 and counter > 0
ついにロケット発射成功!
改造モジュールの最終形は以下のとおり。
print('Rocket ready for launch')
counter = 10
while counter > 7:
print('Counter is', counter)
counter = counter - 1
print('Ignition')
while counter <= 7 and counter > 0:
print('Counter is', counter)
counter = counter - 1
print('Lift off')
ここまでたどり着くのに結構時間がかかった。
自分の頭を使って試行錯誤するのはイラつくこともあるけど楽しい。
そして、悔しい思いをして習得したことは忘れない。
残り461ページ。
先は長い。
この記事が気に入ったらサポートをしてみませんか?