前回は、条件式というものを紹介した。今回は、前回保留となってしまった赤トマト君の質問「Trueとループにいったい何の関係が?」について答えていこうと思う。
気になって、気になって、夜も眠れな~い!なんつって。
whileって、なんなのさ?
毎回恒例のサンプルプログラムだ。
- 1行目 #Add your Python code here. E. g.
- 2行目 from microbit import *
- 3行目
- 4行目
- 5行目 while True:
- 6行目 display.scroll(‘Hello, World!’)
- 7行目 display.show(Image.HEART)
- 8行目 sleep(2000)
今回は5行目の「while True」の「while」についてだ。赤トマト君、「while」って、何だと思う?
「While」だから、「~する間」ということですか?
なかなかやるね、赤トマト君。その通りだ。
「while ***:」は、「***」が正しい間は繰り返す、ということなのだ。
ふむふむ。「True」が「正しい」で、結果が「正しい」「間違い」となるのは「条件式」なので、「***」には「条件式」がはいる、とか・・・なんつって。
その通り!赤トマト君、大正解だぞ!
じゃぁ、前回「条件式」の説明をしたのは、今回の前振りだったとか?
そうなのだ。「条件式」が分からないと、「while」を説明できなかった、という訳なのだ。
「while」で繰り返されるのは、「while」の後のインデントされた文でしたね。
- 5行目 while True:
- 6行目 display.scroll(‘Hello, World!’)
- 7行目 display.show(Image.HEART)
- 8行目 sleep(2000)
よく覚えていたね。サンプルプログラムでは、6行目から8行目の部分だ。このようにインデントでまとめられた文の集まりを「ブロック」という。ここまでをまとめておく。
- while [条件式]:
- 条件式が「正しい」間、繰り返す。
- 繰り返されるのは、while文の後のブロック
サンプルプログラムの「while true」について
「while true」の場合は、条件式が「true」ということなのですか?
そうだ。常に答えが「正しい」になる式、ということだ。定数(一定の値)も式の1種と考える、ということなのだよ。
じゃぁ、「while true」がなくなるとどうなるんだろう?
よし、試しにやってみよう。
サンプルプログラムの5行目の先頭に「#」を入れてみてくれたまえ。
- 1行目 #Add your Python code here. E. g.
- 2行目 from microbit import *
- 3行目
- 4行目
- 5行目 #while True:
- 6行目 display.scroll(‘Hello, World!’)
- 7行目 display.show(Image.HEART)
- 8行目 sleep(2000)
出来ました!マイクロビットに「Flash」!
なんかエラーみたいですよ。「Line 6 IndentationError unexpected indent」という表示が出ましたよ。
whileがないのにインデントしているので、エラーとなってしまったようだな。インデントを削除してみよう。
- 1行目 #Add your Python code here. E. g.
- 2行目 from microbit import *
- 3行目
- 4行目
- 5行目 #while True:
- 6行目 display.scroll(‘Hello, World!’)
- 7行目 display.show(Image.HEART)
- 8行目 sleep(2000)
これでどうだ?「Flash」!今度は、1回だけ「Hello,World」と表示されて、ハートのままになってしまいました。
ループがないので、プログラムが8行目まで実行された後、マイクロビットがやることがなくなってしまったのだ。
マイクロビットがやることがなくなった?この後どうなるのですか?
もう、何もしなくなってしまうのだ。マイコンのプログラムを作るうえでは、サンプルプログラムの5行目のような無限ループを組み込むことがとても重要ということなのだ。
他にもwhileを使ってみよう。
「while」は、無限ループを作るということ以外にも使えるぞ。以前作った変数「a
」で計算するプログラムを覚えているかい?
これですね。
- 1行目 #Add your Python code here. E. g.
- 2行目 from microbit import *
- 3行目
- 4行目 a=0
- 5行目
- 6行目 while True:
- 7行目 # display.scroll(‘Hello, World!’)
- 8行目 display.scroll(a)
- 9行目 sleep(2000)
- 10行目 a=a+1
「while」を使って、「a」を0から3まで増やして、0に戻すプログラムにしてみるぞ。
- 1行目 #Add your Python code here. E. g.
- 2行目 from microbit import *
- 3行目
- 4行目 a=0
- 5行目
- 6行目 while True:
- 7行目 while a <= 3:
- 8行目 display.scroll(a)
- 9行目 sleep(2000)
- 10行目 a=a+1
- 11行目 a=0
元の7行目はコメントアウトされているので、削除した。代わりに、「while a <= 3:」とした。これは、「a」が3以下の場合は繰り返す、という意味だ。
8行目から10行目が大分後ろに下がってますけど・・・
これは、インデントが2つ入っている、ということだ。
そういうことですか。でも、なぜ2つもインデントが入っているのですか?
解説しよう。ややこしいので、しっかりついてきてくれよ。
頑張ります!
- 6行目 while True:
- 7行目 while a <= 3:
- 8行目 display.scroll(a)
- 9行目 sleep(2000)
- 10行目 a=a+1
- 11行目 a=0
まず、6行目の「while」に対して7行目から11行目のブロックが繰り返すようになっている。
そして、7行目の「while」に対しては8行目から10行目のブロックが繰り返すようになっているのだ。
7行目がすでにブロックの中にあるので、8行目から10行目はさらにブロックの中に入れないといけないのだ。つまり、ブロックの中に、さらにブロックがある、ということだ。
マトリョーシカみたいに入れ子になっているんですね。
マトリョーシカとは、うまいことを言うね。では、実行してみてくれたまえ。
了解!「Connect」して、「Flash」!数字が0、1、2、3と増えて、
0に戻った!ありがとう、マトリョーシカ!
今回のまとめ
今回の内容をまとめておくぞ。
- while [条件式]:でループを作れる。
- マイコンのプログラムには無限ループが必要。
- インデントが入った文の集まりをブロックという。
- ループで繰り返されるのはブロック。ブロックの中に、さらにブロックを入れられる。
つづく
参考
プログラムを保存すると、ダウンロードフォルダーに「microbit_program(番号)」というファイルがどんどん作られていきます。これを整理する方法については、以下をご覧ください。
コメント