Python

Python基礎講座(9 反復)

More than 3 years have passed since last update.

反復処理

前回までに「順次・分岐・反復」のうち「順次・分岐」を説明しました。
今回は「反復」を説明します。「反復」は『複数回同じ処理を行う』と
表現できますが、同じ処理に異なる値を使用することも可能なため、
厳密には同じ処理ではありません。

forループ

range

任意の回数繰り返したい場合はfor i in range()を使用します。

for_explain1.py
for i in range(5):
   print("{0}".format(i))

変数iをプログラムでは「ループカウンタ」と呼びます。
このプログラムではループカウンタを出力していますが、実行結果は以下になります。
0
1
2
3
4

range(X)と書くことで、ループカウンタの値は0からX-1を格納し、X回繰り返し処理を行います。
ループカウンタの値をプログラムの処理で用いることが出来ます。

range(X,Y)と記述することで、ループカウンタの開始の値を設定することができます。
ループカウンタの値はXからY-1を格納し、Y-X回繰り返し処理を行います。

for_explain2.py
for i in range(1,10):
   print("{0}".format(i))

1
2
3
4
5
6
7
8
9

出力結果は上記のようになります。

enumurate

リストの要素を1つずつ取得しながら、要素それぞれに処理を行いたい場合が多いです。
この場合はenumurateを使用します。

for_explain3.py
a = ["a","b","c","d","e"]
for idx,elem in enumerate(a):
   print("{0} = {1}".format(idx,elem))

0 = a
1 = b
2 = c
3 = d
4 = e

出力結果は上記のようになります。
forの後ろに2つの変数を設定可能です。
最初の変数がループカウンタ(上記のプログラムではidx)になり、
後の変数がリストのループカウンタに対応した要素(上記のプログラムではelem)になります。

for_explain4.py
a = ["a","b","c","d","e"]
for idx in enumerate(a):
   print("{0}".format(idx))

(0, 'a')
(1, 'b')
(2, 'c')
(3, 'd')
(4, 'e')

forの後ろに変数を1つのみ設定した場合、変数にはループカウンタと対応した要素が格納されます。

whileループ

forループが「決められた任意の回数繰返す」のに対して、whileループは
「特定の条件を満たす間繰り返す」場合に使用します。

while_explain.py
a = ["ok","ok","ok","ng","ok"]
i = 0
while a[i] == 'ok':
    print("a[{0}] is ok".format(i))
    i = i + 1

出力結果は以下のようになります。
a[0] is ok
a[1] is ok
a[2] is ok

繰り返し処理の最初にa[i]が"ok"かを判定し、Falseの場合繰り返し処理を終了するため、
a[3]以降は処理の対象となりません。

whileループを使用する際は、無限ループにならないよう、ループカウンタの変更を忘れず記述してください。
ただしこの時ループカウンタのインデントに注意してください。下のプログラムは誤ったプログラムです。

while_explain_IL.py
a = ["ok","ok","ok","ng","ok"]
i = 0
while a[i] == 'ok':
    print("a[{0}] is ok".format(i))
i = i + 1

字下げが不正の場合(i = i + 1がwhileループ内に設定されていない)
whileループ内ではiは0から変わらないため、無限ループが発生します。
※もし無限ループが発生してしまった場合は(使用している開発環境にもよりますが)
Ctrlキーを押しながら「C」を押すか、右上の×を押してプログラムを強制終了してください。

breakとcontinue

「繰り返し処理を終了する」処理がbreak、「今回の繰り返しを終了し、次の繰り返し処理を始める」処理がcontinueです。
forループ、whileループのどちらでも使用できます。

break_continue_explain.py
i = 0
while i < 10:
    i = i + 1
    if i < 3:
        continue
    print("i is {0}".format(i))
    if i == 5:
        break

print("final i is {0}".format(i))

出力結果は以下となります。
i is 3
i is 4
i is 5
final i is 5

プログラム内でcontinueとbreakは以下のような意味を持ちます。

if i < 3:
  continue

は、「iが3より小さい場合、以降の処理を行わなずに次の繰り返し処理を行う」
という意味のため、iの値が0、1、2の場合は画面に値が出力されません。

if i == 5:
  break

は、「iが5の場合、繰り返し処理を終了する」という意味のため、最後に出力されるiは5です。

ループ内のelse

ifでも使用したelseをループ文の最後に記述すると、「ループが終了した時の処理」として使用できます。
forループ、whileループのどちらでも使用できます。

loop_else.py
for i in range(3):
    print("{0}".format(i))
else:
    print("for loop done")

while i < 5:
    i = i + 1
    print("{0}".format(i))
else:
    print("while loop done")

実行結果は以下のようになります。
0
1
2
for loop done
3
4
5
while loop done

しかし、以下のプログラムでも同じ実行結果が返されます。

loop_else2.py
for i in range(3):
    print("{0}".format(i))

print("for loop done")

while i < 5:
    i = i + 1
    print("{0}".format(i))

print("while loop done")

実際にPythonを日常的に使用しているプログラマでも、ループ内のelseを使用しない人もいます。

次: Python基礎講座(10 内包表記)