Help us understand the problem. What is going on with this article?

Python基礎講座(9 反復)

More than 5 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 内包表記)

bltinc
広告・人材・D2Cと幅広い事業を展開するベンチャー企業 ・Blog : https://blog.bltinc.co.jp/
https://bltinc.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away