【Python入門・応用】12.繰り返し|同じ処理を何度も実行、if文やwhile文、繰り返しの回数や条件の設定方法も解説(初心者にもわかりやすく)

こんにちは。キノコードです。
この動画では、Pythonの繰り返しについて説明します。
説明する内容はこちらです。
はじめに、繰り返しについて説明します。
そして、繰り返しの代表的なfor文、for文の中で使われるbreakやcontinueについて学習しましょう。
また、繰り返しのもうひとつの構文、while文を学習し、無限ループについて学習します。

繰り返しとは

レッスン3「プログラムの3つの基本構造」で説明しましたが、プログラムの基本的な動きは「順次進行」「条件分岐」「繰り返し」の3つです。
この動画では、「繰り返し」について説明します。
繰り返しとは、決まった回数や条件を満たしていれば、同じ処理を実行するプログラム構造です。
繰り返しのことを、反復処理やループ処理と言ったりします。

for文

繰り返しの代表例がfor文です。
for文は、条件を満たしていれば、同じ処理を繰り返します。
そして、条件を満たさなくなったタイミングで、繰り返しが終了します。
例えば、for文で同じ処理を5回繰り返したい場合で考えてみます。
どうすれば5回をカウントできるでしょうか。
例えば、「1」からスタートして、1ずつ増やしていき「5」で終われば、5回です。
例えば、「0」からスタートして、1ずつ増やしていき「4」で終われば、これも5回です。
そういった処理をPythonのfor文で書きます。
Pythonでのfor文の決まりを見てみましょう。
"for 変数 in 複数の要素を持つオブジェクト:
 繰り返す処理"
まずforを書きます。次に繰り返し回数を格納する変数を記述します。
ここで定義した変数のことをカウンタ変数と言います。
for文では、繰り返し処理をカウンタ変数によって制御します。
カウンタ変数は、英語の「index」「Iterator」の頭文字「 i 」が使われることが多いです。
次にinと書いて、繰り返したい複数の要素を持つオブジェクトを書きます。
このオブジェクトにある要素が順番にカウンタ変数に代入され、繰り返し処理を実行します。
そして全ての要素が代入されたら、繰り返し処理が終わります。
最後にコロンを記述します。
コロンの次の行はインデントを下げて、繰り返したい処理を記述します。
繰り返したい処理が終わったら、一番上に戻り、繰り返し処理が終わりになるか判定します。
そして、カウンタ変数に全ての要素が代入されると、繰り返しの処理が終了します。
ここからは実際にコードを書きながら解説を進めましょう。

for i in [0,1,2,3,4]:
    print(i)

for文で5回同じ処理を繰り返すコードを書いてみましょう。
まずforと書きます。
次に、繰り返しのデータを受け取るカウンタ変数「i」を定義します。
そしてinと記述し、0から1までのリストを記述します。
ここで作ったリストの数値を、先頭の0から順番に変数iに格納します。
カウンタ変数「i」の変化がみれるように、print関数でiを表示させてみましょう。
実行します。
「0」から「4」までが表示されました。
5回繰り返し処理ができています。

for i in range(5):
    print(i)

0から4までの数値のリストは、rangeオブジェクトを作成すると簡単です。
rangeの引数に作りたい要素の数を指定すると、0から指定した要素数をもつ数値のオブジェクトを作成できます。
5と指定することで、0から4までの5つの数値をもつオブジェクトを作っています。 
さきほどのコードで、リストの部分をこのように置き換えて実行してみましょう。
「0」から「4」までが表示されました。
5回繰り返し処理ができていることを確認できました。

break

次に、break文についてです。
break文は、ある条件にあてはまったとき、繰り返し処理を終了させることができます。
例えば、「0」からスタートさせて、1ずつ増やしていき、「3」になったら繰り返しを終了させてみましょう。
コードを書きます。

for i in range(5):
    if i == 3:
        break
    print(i)

if文を使って、iが3の場合という条件を追加します。この場合の処理にbreakと記述します。
「3」で繰り返しが終了するので、「0」から「2」まで表示されるはずです。
実行します。
「0」から「2」までが表示されました。

continue

次に、continue文についてです。
continue文は、ある条件にあてはまったとき、その処理をスキップさせることができます。
例えば、「0」からスタートさせて、1ずつ増やしていき、「3」になったら「3」をスキップさせてみましょう。
コードを書きます。

for i in range(5):
    if i == 3:
        continue
    print(i)

if文でiが3にの場合に、処理をスキップさせるcontinueを記述をします。
「3」をスキップするので、「0」「1」「2」「4」が表示されるはずです。
実行します。
「0」「1」「2」「4」が表示されました。

for文のネスト

for文の中にfor文を入れることもできます。
あるものの中に、それと同じ種類のものが入っている構造のことをネストと言います。
for文の中にfor文が入っている構造のことをfor文のネストと言います。
外側の繰り返しのカウンタ変数は「i」で、0から2まで回し、内側の繰り返しのカウンタ変数は「j」で、0から2まで回すという例で考えてみます。
外側のループの1周目のときに、内側のループが0から2まで回ります。内側のループが回りきったら、外側のループが2周目に入ります。
コードを書いてみましょう。

for i in range(3):
    for j in range(3):
        print(i, j, sep='-')

iとjの変化がわかるように、「i、ハイフン、j」を表示させてみましょう。
print関数の第1引数、第2引数をそれぞれi、jにして、引数sepをハイフンにすることで、i、ハイフン、jと表示できます。
iが0のときに、jが0から2まで回り、iが1のときに、jが0から2まで回り、iが2のときに、jが0から2まで回ることを確認できました。

for文でリスト内を参照

次に、変数を使ってリストの中身を表示させてみましょう。
stringというリスト変数に「Tokyo」「Osaka」「Nagoya」という文字列を代入します。
for文のinの後にリストを書くことで、リストの中身が変数に1つずつ格納されます。

string = ['Tokyo', 'Osaka', 'Nagoya']
for i in string:
    print(i)

print関数で表示します。実行してみましょう。
'Tokyo', 'Osaka', 'Nagoya'が表示されました。

今度は、arrという変数に、2から10までの偶数のリストを代入します。
これらの数値を順に足し上げてみましょう。

arr = [2, 4, 6, 8, 10]
sum = 0
for i in arr:
    sum += i
print(sum)

足し上げの計算結果を代入するsumという変数を定義します。
そして、演算子のレッスンで説明した、リストの値を複合代入演算子を使って足し上げます。
表示させてみましょう。
順に足し算ができています。

while文

もう一つの繰り返しの代表例がwhile文です。
while文とfor文の違いは、繰り返す条件の設定方法にあります。
for文は、繰り返したい回数を複数の要素を持つオブジェクトの要素で指定しました。
for文はこのオブジェクトから、要素を1つずつ順番に取り出し、要素が無くなるまで処理を繰り返します。
例えば、0から4までの5つの要素を持つリストを指定し、それを1つずつ順番に取り出して、同じ処理を5回繰り返しました。
一方、while文は処理を繰り返す条件を書き、条件を満たしている間処理を繰り返します。
そして、条件を満たさなくなった時に処理を終了します。
while文の書き方は、まずwhileと書き、次に繰り返す条件、そして:(コロン)を書きます。その次の行からインデントを下げて、繰り返す処理を書きます。

”while 条件:
繰り返したい処理”
具体例で確認してみましょう。

while文で同じ処理を5回繰り返してみます。
0から1ずつ足していき、4になったら5回です。つまり5を超えると条件を満たさなくなります。
まず、変数iに0を代入します。
次にwhile文を書きます。
while、そして条件はi 小なり5です。条件のあとにコロンを書きます。
そしてインデントを下げて繰り返す処理です。iに1を足して、iを表示しましょう。
実行します。
0から4までの数値が表示されました。

i = 0
while i < 5:
    print(i)
    i += 1

次に、iが100を超えるまでiを2倍する場合を考えてみましょう。
まず、変数iに1を代入します。
次にwhile文の条件は、100未満とします。
インデントを下げて、iを2倍にして、iを表示する処理を書きます。
わかりやすいように、繰り返し処理が終わったらFinish!!と表示させましょう。
これで完成です。
実行して確認してみましょう。

i = 1
while i < 100:
    print(i)
    i *= 2
print("Finish!!")

結果が表示されました。
64を2倍すると128になり、100を超えるので、繰り返し処理が終わっていることがわかります。
このようにwhile文は、条件は決まっているが、繰り返す回数がわからないときなどに使用します。
一方、for文はrange関数を使用する時やリストの要素数など、繰り返す回数が決まっているときなどに使用します。
なお、breakやcontinueなどの処理はwhile文でも使用できます。

無限ループ

最後に、while文を使ったテクニックを1つ紹介します。
while文は条件を満たしている間、すなわちブール型でTrueが返ってくる間は処理を繰り返します。
そのため、常にTrueが返ってくる条件を設定すると無限ループになります。
無限ループだけだとコンピューターやサーバーに負荷がかかるので、必ず処理を止める条件とbreakをセットで書きます。
このbreakによって無限ループから抜けられます。
無限ループは少なくとも1回は繰り返し処理を行いたいときなどに使われます。
具体例で確認してみましょう。

i = 200
while i < 100:
    print(i)
    i *= 2
print("Finish!!")

先ほどと同じ繰り返し処理で、今度は変数iに200を代入します。
無限ループを使わない場合、最初からiに100以上の数値が代入されているので、while文の中の繰り返し処理は1回も行われずに終了するはずです。
確認してみましょう。
実行します。
while文の中の繰り返し処理は行われずに、Finish!!と表示されました。

これを無限ループを使って記述し、同じ繰り返し処理を行います。

i = 200
while True:
    print(i)
    i *= 2
        if i >= 100:
        break
print("Finish!!")

whileの後にTrueを書きます。
Trueはブール型でTrueなので、常に条件を満たします。
ブール型でTrueになるものであれば何でも良いですが、Trueを使うことが多いです。
次に、先ほどの繰り返し処理を書きます。
そして、もしiが100以上になったら、breakとします。
これで完成です。
結果を確認してみましょう。
実行します。
200とFinish!!が表示されました。
while文の条件であるTrueは常にブール型でTrueなので、while文の中の処理を行います。
iの200を2倍した値が代入され、print関数で変数iが表示されます。
iは100以上なので、条件を満たします。
breakが処理され、ループを抜けます。
最後にFinish!!が表示されます。
このように、無限ループを使うことで、必ず1回はwhile文の中の繰り返し処理が行われます。
そして、最後のbreakによって繰り返し処理を終了します。