前回の記事で制御構文についての説明と、実際の制御構文の分岐処理である「if文」についての文法の説明を記載しました。
今回は制御構文のもう一つの処理である「反復処理」について書きたいと思います。
反復処理とは、プログラム上で同じ処理を繰り返し実行することですね
そうです、では詳しく見ていきましょう。
- プログラミングにおける制御構文について
- Pythonでの反復処理(for文、while文)の使い方が分かる
反復処理とは
Pythonでの反復処理は以下の2つしかありません。
- for文
- while文
これらの違いは、回数を数でカウントするか、条件でカウントするかの違いになります。
では具体的に見ていきましょう。
for文について
まずはfor文についてですが、for文の反復処理は「回数」を元にカウントします。
ではカウントする方法をパターン別にいくつか見ていきましょう。
レンジによる範囲指定
まずは一番基本的な回数を指定して繰り返す処理です。
forの後に変数と繰り返したい回数をrangeで記載し、文末にセミコロン「:」をつけます。
そしてインデントを開けてforの回数分実施する処理を記載します。
上記のように記述すると、繰り返したい回数分処理が実施されます。
ただし、回数の最初は0から始まり終了値は含みません。
ですので、range(10)と指定すると、「0,1,2,3,4,5,6,7,8,9」と10回繰り返しが実施されます。
for i in range(10): # 0から9までを指定
print(i)
0
1
2
3
4
5
6
7
8
9
また、range関数は以下の指定も可能です
range(開始値 , 終了値) range(開始値 , 終了値 , ステップ)
rangeの引数を2つ指定すると、開始する値を指定できます、ただし終了値は先ほどと同じで終了値に指定した値は含みません。
また、引数を3つ指定すると、ステップ数を指定できます。
デフォルトは「1」ですが、カウントを1つ飛ばしとしたい場合は「2」を指定します。
for i in range(3,10): # 3から9までを指定
print(i)
print("---break---")
for i in range(1,10,2): # 1から9までを1つ飛ばしで指定
print(i)
3
4
5
6
7
8
9
---break---
1
3
5
7
9
データ構造による繰り返し
Pythonでのfor文ですが、数字による回数指定の他に、リストやタプルといったデータ構造を使った反復処理も可能です。
この構文を使うことで、データ構造から値を一つづつ取り出して変数に代入し、データ数分繰り返す処理を実行します。
そして、全ての値を取り出したら処理を終了します。
例えば、リスト内の数字から合計と平均を取得するプログラムを書いてみましょう。
data = [99,84,67,38,59,63,59,85,92,57]
total = 0
for n in data: # リストdataから値を取得
total += n # totalに加算する
ave = total // len(data)
print("合計:"+str(total)+" 平均:"+str(ave))
4行目のfor文で「data」リストから値を1つづつ取り出して変数nに代入し、5行目の処理で「total」変数に加算しています。
そして合計値をdataリストの要素数で割った平均値を求めて8行目で出力しています。
実行結果は以下となります。
合計:703 平均:70
continueとbreak
反復処理時に、途中で処理を中断したい場合があります。
その場合は「continue」と「break」を使って処理を中断させます。
この2つの処理の違いは以下です。
- continue:処理を中断してfor文の次の繰り返しに進む
- while文:処理を中断してfor文から抜ける
こちらも具体的な処理を見てみましょう。
先ほどの合計と平均を求めるプログラムを使って少し処理を変えてみます。
data = [99,84,67,38,59,63,59,85,92,57]
total = 0
count = 0
for n in data:
if n < 70: # リストから取り出した値が70未満の場合
continue # 以降の処理を実施せず次の反復処理を実施
total += n
count += 1
ave = total // count
print("合計:"+str(total)+" 平均:"+str(ave))
先ほどの処理は、全ての数の合計と平均を求めましたが、今回は点数が70点以上の値の合計と平均を求めています。
ここで、6行目と7行目の処理で70点未満であればcontinueしています。
これで70点未満の点数だった場合は次のfor文の処理に進むので、9行目と10行目の合計値の加算と平均値を求める値の個数の加算が処理されなくなります。
実行結果は以下となります。
合計:360 平均:90
では、上記処理のcontinueをbreakに変えてみるとどうなるでしょうか。
data = [99,84,67,38,59,63,59,85,92,57]
total = 0
count = 0
for n in data:
if n < 70: # リストから取り出した値が70未満の場合
break # for文の処理を終了する
total += n
count += 1
ave = total // count
print("合計:"+str(total)+" 平均:"+str(ave))
上記プログラムの7行目をbreakに変えてみました。
こちらを実行すると、リスト「data」の3要素目「67」の処理でbreakが実施され、以降のfor文の処理自体実施されなくなります。
よって「99,84」の合計と平均を求めることになりますので、処理結果は以下となります。
合計:183 平均:91
以上が、continueとbreakの違いでした。
while文について
では次にwhile文についてですが、while文の反復処理は「条件」を元に繰り返しを行います。
条件による繰り返し
ではwhile文の基本形を見ていきましょう。
whileの後に繰り返しのための条件を記載し、文末にセミコロン「:」をつけます。
そしてインデントを開けて条件がTrueの場合に実施する処理を記載します。
そしてこの条件がTrueであれば処理を実施し、条件がFalseになれば繰り返し処理が終わります。
先ほどbreak文の紹介時に作成したプログラムをwhile文を使って書き直してみましょう。
data = [99,84,67,38,59,63,59,85,92,57]
total = 0
count = 0
while data[count] > 70: # 値が70未満であれば反復処理終了
total += data[count]
count += 1
ave = total // count
print("合計:"+str(total)+" 平均:"+str(ave))
先ほどfor文でbreakを使いましたが、今回はwhile文で70点以下の値が出た場合に反復処理が終了し、それ以前の値を使って合計と平均を求めています。
5行目でwhile文を使っていますが、要素3番目が「67」なので条件がFalseとなるため、そこで繰り返し処理が終了します。
こちらの実施結果は以下となります。
合計:183 平均:91
continueとbreak
先ほどのfor文と同様に、while文でもcontinueやbreakが使えます。
こちらは先ほどのfor文と使い方は同じですので、説明は割愛します。
無限ループに注意
while文を使う場合に一つ注意しなければいけないのが無限ループに陥る場合です。
for文であれば回数を指定して処理をするので反復回数が見えますが、while文は条件を使って反復処理をするのでwhile文の条件がTrueである限り処理が終わりません。
例えばwhile文で条件にTrueとして、反復処理中に条件に合致したらbreakでループを抜けるという記述をした場合に、うっかり条件を間違えたりすると延々ループ処理から抜けれないということが起こります。
これがいわゆる「無限ループ」というやつで、こうなると制御できませんのでプログラムを強制終了するしか方法がなくなります。
ですので、while文を使う場合は条件がきちんとFalseになるかをきちんと確認してプログラムを書く必要があります。
反復処理を書くのであれば、while文よりもfor文で書くことを心がけましょう
まとめ
以上で、Pythonにおける制御構文の反復処理ということでfor文とwhile文の説明をしました。