Python

【Python】for文の使い方【ループ処理】

この記事では、Pythonのfor文の使い方を解説します。for文を使うことでイテラブルの要素を1つずつ取り出し、for文ブロック内を繰り返し(ループ)処理することができます。それでは、for文の使い方を見ていきましょう❗️

for文の使い方

Pythonのfor文は、以下のようにイテラブルを使います。

for 変数名 in イテラブル:
    何かしらの処理

指定されたイテラブルの要素が1つずつ順番に変数に代入され、ブロック内の処理が反復されます。イテラブルの要素が取り出せなくなった時点でループが終了します。

変数はブロック内で使用可能です。

イテラブルとは、リストやタプル、文字列などの反復可能なオブジェクトのことを言います。詳しく知りたい方は以下の記事を参照してください。

【Python】イテラブルとイテレータこの記事では、Pythonのイテラブルとイテレータについて解説します。一言で説明するとイテラブルはイテレータを生成できるオブジェクト、イテレータは要素を1つずつ取り出せるオブジェクトです。それでは、もう少し詳しく確認していきましょう!...

サンプル

例えばリストの要素を1つずつ出力するには、以下のようなコードになります。

vals = [1, 2, 3]

for v in vals:
    print(v)

実行結果

1
2
3

任意の回数だけループ:range関数

for文のイテラブルとしてrange()関数を使用することで、任意の回数ループ処理させることができます。

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

実行結果

0
1
2

負の数や初期値を指定することもできる。

for i in range(2, -3, -1):
    print(i)

実行結果

2
1
0
-1
-2
【Python】range関数を使って数列を生成する方法を解説この記事では、Pythonのrange()関数の使い方について解説します。range()関数を使うことで任意の範囲の連続した数列を生成できます。生成した数列をfor文に渡すことで任意の回数だけループ処理することができます。それでは、range()関数の使い方を見ていきましょう!...

処理をスキップ:continue

ループ処理をスキップするにはcontinueを使います。continueが実行されたときの処理のみスキップするので、それ以降もループ処理は継続されます。

以下のコードは、i2の時にcontinueが処理され、print()がスキップされています。

l = [1, 2, 3]

for i in l:
    if i == 2:
        continue
    print(i)

実行結果

1
3

2が出力されていないので処理がスキップされているのが分かります。

処理を中断:break

ループを中断するにはbreakを使います。breakが実行されたらループ処理を途中で終了させることができます。

以下のコードでは'end'が処理される際にbreakが実行されてループが終了します。

for v in ['a', 'b', 'end', 'c']:
    if v == 'end':
        break
    print(v)

実行結果

a
b

for文が正常終了した際の処理:else

for文のオプションとしてelseが用意されています。elseはfor文が正常終了した際に処理されます。

l = [1, 2, 3]

for i in l:
    print(i)
else:
    print('正常終了しました!')

実行結果

1
2
3
正常終了しました!

breakによってfor文が中断された場合、elseは処理されないので注意です。

l = [1, 2, 3]

for i in l:
    print(i)
    break
else:
    print('正常終了しました!')

実行結果

1

continueによって処理をスキップした場合、elseは問題なく処理されます。

任意の範囲のループ:スライス

特定の範囲の要素のみでループしたい場合は「スライス」を使うと簡単です。

l = [1, 2, 3, 4, 5, 6, 7, 8, 9]

for i in l[4:7]:
    print(i)

実行結果

5
6
7

上記コードは、スライスを用いてstart4stop7を指定し、インデックスが4 < N <= 7の要素のみを使ってループ処理しました。

【Python】シーケンスの任意の範囲の要素を取得するスライスの使い方この記事では、Pythonのスライスの使い方を解説します。スライスは、シーケンスオブジェクトの要素を範囲で選択できます。選択した要素は、...

多重ループ

for文中にfor文を記述することで、多重ループさせることができます。

以下のコードは、for文を2つ重ねた「二重ループ」です。

for i in range(3):
    for j in range(3):
        print(f'i: {i}, j: {j}')

実行結果

i: 0, j: 0
i: 0, j: 1
i: 0, j: 2
i: 1, j: 0
i: 1, j: 1
i: 1, j: 2
i: 2, j: 0
i: 2, j: 1
i: 2, j: 2
for文はいくつでも重ねることが可能ですが、重ねるごとに可読性が下がるので、基本的には「三重ループ」までしか使いません

多次元配列の展開

多次元配列は、多重ループを使うことで展開することができます。

l = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

for i in l:
    for j in i:
        print(j)
    print()

実行結果

1
2
3

4
5
6

7
8
9

以下のようにアンパックすることでも展開できます。

point = [[1, 2], [3, 4], [5, 6]]

for x, y in point:
    print(x, y)

実行結果

1 2
3 4
5 6

どのように値が必要なのかに応じて展開方法を切り替えましょう!

多重ループのbreak

多重ループを内側のfor文からbreakで中断しようとしても、内側のfor文しか中断することができず、ループ処理が継続してしまいます。

for i in range(3):
    for j in range(3):
        print(i, j)
        if i == 1 and j == 1:
            print('break 実行')
            break

実行結果

0 0
0 1
0 2
1 0
1 1
break 実行
2 0
2 1
2 2

このような場合は、「フラグを使う」か「elseを使う」ことで解決できます。

フラグを使う方法

以下のようにbool値を使うことで、多重ループを中断することができます。

flag = False

for i in range(3):
    for j in range(3):
        print(i, j)
        if i == 1 and j == 1:
            print('break 実行')
            flag = True
            break
    if flag:
        break

実行結果

0 0
0 1
0 2
1 0
1 1
break 実行

内側のbreakが処理された際、flag変数にTrueを格納することで外側のbreakも処理されます。

elseを使う方法

elsebreakで中断した場合は処理されません。その性質を利用して内側のfor文が正常終了した際にはelseによってcontinueが処理され、外側のbreakが実行されないようにしています。

内側のfor文がbreakによって中断された場合は、elseによってcontinueが処理されないので、外側のbreakが実行される仕組みになっています。

for i in range(3):
    for j in range(3):
        print(i, j)
        if i == 1 and j == 1:
            print('break 実行')
            break
    else:
        print('continue 実行')
        continue
    print('外側のbreak 実行')
    break

実行結果

0 0
0 1
0 2
continue 実行
1 0
1 1
break 実行
外側のbreak 実行

forを使った無限ループ

itertools.count()関数を使うことで、無限に値をカウントするイテレータを作成できます。そのイテレータを使うことで、for文で無限ループすることができます。

import itertools

for i in itertools.count():
    print(i)

実行結果

0
1
2
・
・
・
【Python】無限ループさせるいくつかの方法この記事では、Pythonで無限ループさせる方法を紹介します。無限ループと言えば while文 を思い浮かべるかもしれませんが、実はPythonには無限ループさせる方法がいくつも存在しています。while文は万能で使いやすいですが、状況に合った無限ループが使えるように頭の片隅に置いておきましょう。...

for文と使われる関数

for文と組み合わせて使うことで便利な関数が多数存在しています。

要素とインデックスを同時に取得する:enumrate関数

組み込み関数enumerate()を使うことで、要素とインデックスを同時に取得できます。

enumerate(iterable, start=0)

簡単なサンプルを見てみましょう。

vals= ['a', 'b', 'c']

for i, v in enumerate(vals):
    print(i, v)

実行結果

0 a
1 b
2 c

開始値の変更

start引数に整数を指定することで、開始値を変更することができます。以下のコードでは、開始値を1にして実行しています。

vals = ['a', 'b', 'c']

for i, v in enumerate(vals, 1):
    print(i, v)

実行結果

1 a
2 b
3 c

複数のシーケンスの要素を取得:zip関数

組み込み関数zip()を使うことで1つのfor文で複数のイテラブルを指定して繰り返し処理できます。

nums = [1, 2, 3]
vals = ['a', 'b', 'c']

for n, v in zip(nums, vals):
    print(n, v)

実行結果

1 a
2 b
3 c

2つ以上の場合

2つ以上のイテラブルも同時に処理することができます。

l1= [1, 2, 3]
l2 = ['a', 'b', 'c']
l3 = [4, 5, 6]

for n1, n2, n3 in zip(l1, l2, l3):
    print(n1, n2, n3)

実行結果

1 a 4
2 b 5
3 c 6

要素数が異なる場合

イテラブルの長さが異なる場合は、短い方に合わせて実行されます。

nums = [1, 2, 3]
vals = ['a', 'b']

for num, v in zip(nums, vals):
    print(num, v)

実行結果

1 a
2 b

逆順で処理する:reversed関数

組み込み関数reversed()を使うことで、要素を逆順で取得できます。

nums = [1, 2, 3]

for num in reversed(nums):
    print(num)

実行結果

3
2
1
【Python】リスト含むシーケンスの要素を逆順にする方法この記事では、リストやタプルなどのシーケンスの要素を逆順に取得する方法を解説します。 並び替え(ソート)をしたい場合は、以下の記事...

まとめ

この記事では、Pythonの繰り返し処理の仕方について解説しました。

Pythonに限らずプログラミングでは、条件分岐繰り返し処理を非常によく使います。しっかり覚えておきましょう!

それでは今回の内容はここまでです!ではまたどこかで〜( ・∀・)ノ

最短3か月でエンジニア転職『DMM WEBCAMP COMMIT』