whileループ

回数ではなく条件で繰り返しを制御するのがwhileループ。

「先生がOKというまで腕立てしなさい!」
と言われたとき、腕立てが終わるのは、回数ではなくて条件で決まるよね。
alt text
こういう時、プログラミングでは「while(ワイル)」を使うよ。(whileは英語で「~する間」という意味)

for 回数を指定して繰り返し
while 条件を指定して繰り返し

for文の復習として、下のコードにコードを追加して、10回「イチニッ!」とprintするプログラムにしてみよう。

for i in range(10):
    # ここにコードを追加

できたかな?

じゃあ、while文を使って、ユーザーが「OK」と入力するまで「イチニッ!」とprintし続けるプログラムを書いてみよう

while文の基本の書き方

while 繰り返しを続ける条件:
    繰り返し行いたい処理

今回、ユーザーが入力できるプログラムを作成するので、pythonが入力を受け付けるinput()という機能を使うよ。今後たくさん出てくるので、覚えといてね

まず、ユーザーが入力した文字を入るための変数を用意。最初は何も入ってない文字列でいいから、""の中は何もなくてOK

tsuzuki = ""

次にwhile文を書いていくよ.繰り返し内容は後で考えるから、とりあえずwhile文のなかはこうしておこう

※まだこのプログラムは実行しないでね!!

tsuUki = ""
while tsuzuki != "おわり":
    print("イチニッ!")

while tsuzuki != "おわり"の部分に注目
!= の記号覚えてる?「A != B」の場合は、「AとBは違う」という意味。覚えてない人はレジュメを見直そう!
つまりこのプログラムでは、「tsuzukiがおわりではない場合は繰り返しを続けて、そうではなくなったとき=tsuzukiがおわりになったときは繰り返しをやめる」というプログラムなわけ

無限ループ

みんなは実行しないでね!このプログラムを実行すると、無限ループになり、パソコンにとって負担になります。いったん無限ループになるとパソコンはものすごい速さで処理を行うので、処理能力が低下したり、最悪の場合は故障の原因になります。もしやるなら自分のパソコンでためしてみてね!!
もし間違えて無限ループを起こしてしまった時は、すぐに
ctrl+C (コピーするのと同じコマンド)をターミナルで入力すれば止まるよ

timeモジュール

とはいえ、プログラムを実行すると、OKと言われるまでずーっとプログラムを動かしつづけなくちゃいけない。そういう時にtimeモジュールというのが役立ちます。処理をするの指定の時間止めてくれる機能。これもよく使うことになるからおぼえといてね

import time

tsuzuki = ""
while tsuzuki != "おわり":
    print("イチニッ!")
    time.sleep(1.0)

input関数

print()文は、プログラムを使うユーザーからすると、決められた文字が出てくるだけの味気ない機能。ユーザーが文字を決めてprintするには、input():インプット関数を使うよ

moji = input("文字を入力してください")

alt text

さっきの無限ループのコードにこれらの機能を追加してみよう

import time

tsuzuki = ""

while tsuzuki != "おわり":
    print("イチニッ!")
    time.sleep(1.0)
    tsuzuki = input("続ける:")

こんな感じでコードが動けば成功

alt text

改良しよう

何回腕立てをしたかをカウントできるようにしよう
やることは3つ。

①回数を記録する用の変数を用意する

countという変数を用意して、最初は0にしよう

②その変数に、繰り返し事に1を足す

import time

tsuzuki = ""
count = 0

while tsuzuki != "おわり":
    print("イチニッ!")
    count += 1
    time.sleep(1.0)
    tsuzuki = input("続ける:")

③繰り返しが終わったときにprint()する

さて、ここが問題もう

print(count)

とするのはわかるでしょう。問題はこのコードをどこにいれるか。
前回のインデントの話を思い出してみよう。繰り返しをするのインデントされているところだけ。今回は全部終わったあとに一回だけprintされる必要はないから、繰り返しprintする必要はなし。
whileの繰り返しが終わったあとにやりたいことは、インデントされていない状態、whileのかたまりの次にかけばいい

import time

tsuzuki = ""
count = 0

while tsuzuki != "おわり":
    print("イチニッ!")
    count += 1
    time.sleep(1.0)
    tsuzuki = input("続ける:")
print(count)

alt text

特定の条件で繰り返しを止める : break(ブレイク)

何事もやりすぎは良くない!腕立てを10回したら強制的に終わりにするようにしてみよう。
とはいえ、繰り返し終了の条件は、もう「while tsuzuki != "おわり"」のところでひとつ書いちゃってる。あと、このコードでは count += 1のところでcountが10になるけど、そのあとtime.sleep(1.0)が入っているので、10になった瞬間から1秒待たないといけない。
繰り返しの処理の途中でも、特定の条件になったら強制終了する方法がbreak
if文と組み合わせて使うよ

import time

tsuzuki = ""
count = 0

while tsuzuki != "おわり":
    print("イチニッ!")
    count += 1
    if count == 10:
        break
    time.sleep(1.0)
    tsuzuki = input("続ける:")

特定の条件で、繰り返しを止めはしないけど、処理をしないで途中から繰り返す。

腕立てふせをしていて、しっかり上げきらなかったり、ひざをついていたりして、厳しい体育の先生に「やりなおし!」っていわれたことない?
やり直すからと言って、カウントを0になおすんじゃなくて、例えばそれまでに3回やってたら、
・print("イチニッ!")ってしない
・count を1減らす
・でも繰り返しは終了しない
continueを使うことで、これができるよ!
※continue(続ける)

continueする条件は、入力で「ミス」と入力したとき、ということにしよう

import time

tsuzuki = ""
count = 0

while tsuzuki != "おわり":
    tsuzuki = input("続ける:")
    if tsuzuki == "ミス":
        continue
    else:
        print("イチニッ!")
        count += 1
        if count == 10:
            break
        time.sleep(1.0)

alt text