Python PR

【Python】for文を使ってループ処理をする方法

記事内に商品プロモーションを含む場合があります

この記事では、Pythonのfor文の使い方を解説します。

for文は、反復(ループ)を行うための制御構造です。リストタプルなどシーケンスや他のイテラブルオブジェクトの要素を1つずつ取り出し、任意の操作を各要素に対して順次実行します。

同じような処理を何度も実行したい場合やシーケンスを含むイテラブルオブジェクトの各要素に対してなんらかの処理を行いたい場合に使用されます。

また、条件式がTrueの間だけループ処理するwhile文も用意されています。

それでは、for文について見ていきましょう!

for文の使い方

for文は以下のように定義できます。

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

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

要素を受け取った変数はfor文ブロック内で呼び出すことができます。

イテラブルとは?

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

Linkイテラブルとイテレータについて解説

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

items= [1, 2, 3]

for item in items:
    print(item)

実行結果

1
2
3

リストitemsの要素が変数itemに1つずつ代入され、for文ブロック内のprint()関数がループ処理されることによってすべての要素が一度ずつ出力されます。

これがfor文の基本的な使い方となります。

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

for文とrange()関数を組み合わせることで任意の回数だけループ処理させることができます。range()関数は、数列を生成する関数です。

Linkrange関数を使って数列を生成する方法を解説

以下のコードでは、3回ループ処理しています。

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

実行結果

0
1
2

range関数の引数として負の整数や初期値を指定することもできる。

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

実行結果

2
1
0
-1
-2

イテラブルオブジェクトから取り出した要素をfor文ブロック内で使用しない場合は、変数名を_(アンダースコア)にしておくと安全です。

for _ in range(3):
    print('abc')

実行結果

abc
abc
abc

ループ処理をスキップ:continue

ループ処理をスキップするには、continue文を使います。

処理をスキップしたい回でcontinue文が実行されるようにfor文ブロック内に記述することで、その回のループ処理をスキップすることができます。

continue文が実行された回の処理のみスキップするので以降もループ処理は継続されます。

例えば、値が偶数の時のみ処理をスキップしたいと思ったら以下のように記述します。

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

for i in l:
    # 2で割り切れるかどうか
    if i % 2 == 0:
        # 割り切れたら実行
        continue
    # 割り切れなかったら処理される
    print(i)

実行結果

1
3
5

i の値が偶数の時にcontinue文が実行され、処理がスキップされているのでprint()が実行されず、奇数の値みが出力されています。

ループ処理を中断:break

ループ処理を中断するには、break文を使います。

何かしらの要素を取り出した際にbreak文が実行されるようにfor文ブロック内に記述することでループ処理を途中で終了することができます。

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

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

実行結果

a
b

'end'が処理される際にbreak文が実行されてループが中断したのでそれ以降の要素である'c'は処理されませんでした。

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

for文のオプションとしてelse節が用意されています。else節は、for文が正常終了した際に処理されるブロックを定義できます。

l = [1, 2, 3]

for i in l:
    print(i)
# for文の後に記述する
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の要素のみを使ってループ処理しました。

Linkシーケンスの要素を任意の範囲で取得するスライスの使い方

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

for文とenumerate()関数を組み合わせることで要素とインデックスを扱うことができます。

enumerate(iterable, start=0)

enumerate()関数は2つの要素(インデックス, 引数に指定されたイテラブルの要素)を返すので受け取る変数を2つ用意する必要があります。

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

for index, val in enumerate(vals):
    print(index, val)

実行結果

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

関連enumerate() - 組み込み関数 — Python 3.11.3 ドキュメント

受け取る変数を増やす場合

要素を受け取る変数は、状況によって増やすことができます。

2次元配列のループ

2次元配列をfor文でループ処理する場合は、ネストされた配列の要素の分だけ変数を用意することで要素をそれぞれ取り出すことができます。

l = [[1, 2], [11, 22], [111, 222]]

for v1, v2 in l:
    print(v1, v2)

実行結果

1 2
11 22
111 222

ネストされた配列に要素数が異なるものが1つでも混じっているとValueErrorが発生するので注意してください。

l = [[1, 2], [11, 22], [111, 222, 333]]

for v1, v2 in l:
    print(v1, v2)

実行結果

1 2
11 22
Traceback (most recent call last):
  File "main.py", line 3, in 
    for v1, v2 in l:
ValueError: too many values to unpack (expected 2)

関連配列の要素を展開して変数に代入する方法を解説【アンパック】

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

for文とzip()関数を組み合わせることで複数のイテラブルをまとめて扱うことができます。

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

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

実行結果

1 a
2 b
3 c

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

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

for v1, v2, v3 in zip(l1, l2, l3):
    print(v1, v2, v3)

実行結果

1 a 4
2 b 5
3 c 6

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

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

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

実行結果

1 a
2 b

長い方に合わせて処理したい場合は、itertoolsモジュールのzip_longest()を使います。足りない部分はNoneで補完されます。

import itertools

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

for num, val in itertools.zip_longest(nums, vals):
    print(num, val)

実行結果

1 a
2 b
3 None

for文を何度も実行するのはコストがかかるのでできだけまとめて処理しちゃいましょう。

逆順で処理する:reversed関数

for文とreversed()関数を組み合わせることで要素を逆順で取得することができます。

nums = [1, 2, 3]

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

実行結果

3
2
1

まとめ

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

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

また、状況によってはwhile文を使うことを検討しましょう!

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