【Python】for文でループ処理する方法【繰り返し処理】

Python

この記事では、Pythonのfor文でループ処理する方法を解説します!Pythonのfor文はC言語とは違いイテラブルオブジェクトを使って繰り返し処理します。

この記事では以下のことを解説しています。

  • for文の基本的な使い方
  • 指定した回数だけループする方法
  • continueとbreakの使い方
  • 多重ループ
  • for文が正常に終了した際の処理
  • 要素とインデックスを同時に取得する
  • 複数の配列の要素を同時に取り出して処理する
  • 逆順で処理する

プログラミング言語にとってfor文はとても基本的な構文なのでよく覚えておきましょう!

Pythonのfor文の使い方

それではPythonのfor文の使い方を見ていきます!

書式

for文は以下のように記述します。

for 変数名 in イテラブルオブジェクト:
    何かしらの処理

イテラブルオブジェクトの要素が順番に変数に代入されて繰り返し処理が行われます。次の要素が取り出せなくなった場合にループ処理が終了します。

イテラブルオブジェクト一覧

  • シーケンス型(リスト、タプル、range)
  • マッピング型(辞書)
  • テキストシーケンス型(文字列)
  • バイナリシーケンス型(bytes、bytearray、memoryview)

サンプル

試しにfor文にリストを渡して繰り返し処理してみます。

l = [1, 2, 3]

for i in l:
    print(i)

実行結果

1
2
3

処理をスキップする:continue

continue文を使うことで処理をスキップできます。あくまでcontinue文が処理されたときの命令文のみスキップするので、それ以降もfor文ループは継続して処理されます。

if文と組み合わせることで特定の条件で処理をスキップすることができます。

サンプル

以下コードでは『i == 2』ときにcontinueによって処理がスキップされます。

l = [1, 2, 3]

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

実行結果

1
3

continue文によって処理がスキップされたので2は出力されませんでした。

for文を終了させる:break

break文を使うことでfor文を途中で終了させることができます。

サンプル

以下のコードでは『end』という文字列が処理される際にbreak文が実行されるようになっています。

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

実行結果

a
b

break文が実行されるとfor文が終了するのでそれ以降の要素は処理されません。

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

elseを使うことでfor文が正常終了した際の処理を定義できます。

書式

以下のようにfor文の後にelseを記述します。

for 変数 in イテラブルオブジェクト:
    なんらかの処理
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]

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

実行結果

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

色々な型をfor文で実行してみる

色々な型をfor文で処理して挙動の違いを見てみましょう!

リスト[list]

リストに格納されている要素が変数に代入されるたびに繰り返し処理します。

for i in [1, 2, 3]:
    print(i)

実行結果

1
2
3

【関連】Pythonのリスト(list)とはなんぞや?リストの使い方を知ろう!

タプル[tuple]

タプルもリストと同様に処理されました。

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

実行結果

1
2
3

【関連】Pythonのtuple(タプル)とはなんぞや?【タプルの使い方】

文字列[str]

文字列もfor文で処理することができます。

for c in 'Hello World!':
    print(c)

実行結果

H
e
l
l
o
 
W
o
r
l
d
!

文字列は1文字ずつ取り出されて出力されました。

【関連】Pythonの文字列の使い方

辞書[dict]

辞書型ではkeyのみが順番に変数に代入されます。

d = {'one': 1, 'two': 2, 'three': 3}

for key in d:
    print(key)

実行結果

one
two
three

valueのみ取り出したい場合は以下のようにします。

d = {'one': 1, 'two': 2, 'three': 3}

for key in d.values():
    print(key)

実行結果

1
2
3

keyvalueを取り出したい場合は以下のようにします。

d = {'one': 1, 'two': 2, 'three': 3}

for key, value in d.items():
    print(key, value)

実行結果

one 1
two 2
three 3

【関連】Pythonのdictionary(ディクショナリ)とはなんぞや?【辞書の使い方】

ジェネレータ

ジェネレータもfor文で処理することができます。

# ジェネレータ
def func():
    yield 1
    yield 2
    yield 3

for i in func():
    print(i)

実行結果

1
2
3

【関連】Pythonのジェネレータを使ってイテレータを作成しよう!

バイナリシーケンス型

バイナリオブジェクトもfor文で処理できます。

for b in b'Hello':
    print(chr(b), b)

実行結果

H 72
e 101
l 108
l 108
o 111

指定した回数だけ繰り返す:range()

for文にrange関数を渡すことで指定した回数だけ繰り返し処理させることができます。

書式

range関数の引数に指定した回数だけ繰り返し処理されます。

for 変数 in range(stop):
    なんらかの処理

サンプル

試しに適当な整数を指定したrange関数でループ処理してみます。

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

実行結果

0
1
2

0~2が出力されました。stopに指定した値(ここでは3)は出力されないので注意してください。

startの変更

range関数のstartを指定することで初期値を変更することができます。

# range(start, stop)
for i in range(1, 4):
    print(i)

実行結果

1
2
3

詳しくはPythonのrange関数の使い方を知ろう!を参照してください。

任意の範囲の要素のみでループする:スライス

特定の範囲の要素のみを取り出したい場合はスライスを使うことで実現できます。

書式

for文にスライスしたシーケンス型を指定します。

for 変数 in シーケンス[start:stop:step]:
    なんらかの処理

サンプル

以下のコードはstartstopを指定して特定の範囲の要素のみを取り出しました。

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

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

実行結果

5
6
7

【関連】Pythonのスライスを使ってシーケンス型の要素を範囲指定して取得しよう!

多重ループ

for文の中にfor文を書くことで多重ループさせることができます。

書式

以下のようにfor文をネストさせます。

for 変数1 in イテラブルオブジェクト:
    for 変数2 in イテラブルオブジェクト:
        なんらかの処理

サンプル

試しにシンプルな多重ループの挙動を見てみます。

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

多次元配列の展開

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

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

break文では1つの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

フラグを使う方法

以下のように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が処理された時にflagTrueを格納することで外側の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 実行

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

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

サンプル

values = ['aaa', 'bbb', 'ccc']

for i, value in enumerate(values):
    print(i, value)

実行結果

0 aaa
1 bbb
2 ccc

開始値の変更

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

values = ['aaa', 'bbb', 'ccc']

for i, value in enumerate(values, 1):
    print(i, value)

実行結果

1 aaa
2 bbb
3 ccc

複数のイテラブルオブジェクトの要素の取得:zip()

zip関数を使うことで1つのfor文で複数のイテラブルオブジェクトを同時に処理できます。

サンプル

例えば以下のコードでは2つのイテラブルオブジェクトを1つのfor文で処理しています。

nums = [1, 2, 3]
values = ['aaa', 'bbb', 'ccc']

for num, value in zip(nums, values):
    print(num, value)

実行結果

1 aaa
2 bbb
3 ccc

2つ以上の場合

2つ以上のイテラブルオブジェクトも同時に処理できます。

nums = [1, 2, 3]
values = ['aaa', 'bbb', 'ccc']
vals = [4, 5, 6]

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

実行結果

1 aaa 4
2 bbb 5
3 ccc 6

要素数が異なる場合

要素数が異なる場合は少ない方に合わせて実行されます。

nums = [1, 2, 3]
values = ['aaa', 'bbb']

for num, value in zip(nums, values):
    print(num, value)

実行結果

1 aaa
2 bbb

逆順で処理する:reverse()

reversed関数を使うことでイテラブルオブジェクトの要素を逆順で取得できます。

使い方

以下のようにfor文のイテラブルオブジェクトとしてreversed関数の戻り値を渡します。

for 変数 in reversed(イテラブルオブジェクト):
    なんらかの処理

サンプル

nums = [1, 2, 3]

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

実行結果

3
2
1

リストの内包表記

リストの内包表記はリストを簡単に生成するための構文です。

書式

以下のように定義します。

[式(返す値) for 変数名 in イテラブルオブジェクト]

if文で条件を付けることができます。

[式(返す値) for 変数名 in イテラブルオブジェクト if 条件式]

サンプル

内包表記を使うことでイテラブルオブジェクトから簡単にリストを生成できます。
以下のコードはそれぞれの要素を2倍にしたリストを生成しています。

nums = [1, 2, 3]

print([num * 2 for num in nums])

実行結果

[2, 4, 6]

条件に合う要素のみ

以下のコードはif文を使って偶数の値のみを抜き出しています。

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

print([num for num in nums if num % 2 == 0])

実行結果

[2, 4, 6]

内包表記は処理速度も早いので簡単なリストを生成する場合は内包表記を使いましょう!

map関数

map関数を使うことでfor文を使わなくてもイテラブルオブジェクトのそれぞれの要素に指定した関数を適用させた結果を受け取ることができます。

使い方

第一引数で渡した関数の引数として第二引数で渡したイテラブルオブジェクトの要素が引き渡されて処理されます。

map(func, iterable)

map関数で生成されたオブジェクトはマップオブジェクトなのでリストとして扱いたい場合はlist()で変換する必要があります。

list(map(func, iterable))

サンプル

以下のコードはfunc関数をリストの全ての要素に適用しています。

def func(val):
    return val * 2

nums = [1, 2, 3]
nums = list(map(func, nums))

print(nums)

実行結果

[2, 4, 6]

ラムダ式

もちろん、ラムダ式も使えます。

nums = [1, 2, 3]
nums = list(map(lambda num: num * 2, nums))

print(nums)

実行結果

[2, 4, 6]

【関連】Pythonの匿名関数ラムダ式を使おう!

pandas

for文とpandasを組み合わせて使うことでとても便利に要素を扱うことができます。

要素とインデックスを扱う:Series()

pandasSeriesクラスを使うことで要素とインデックスをまとめて扱うことができます。

Seriesクラスをfor文に渡す

Seriesクラスをfor文に渡すとリストと同じように処理されます。

import pandas as pd

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

for i in pd.Series(l):
    print(i)

実行結果

a
b
c

インデックスも同時に取得する

iteritemsメソッドを使うことでインデックス値も同時に取得することができます。

import pandas as pd

l = ['a', 'b', 'c']
s = pd.Series(l)

for idx, val in s.iteritems():
    print(idx, val)

実行結果

0 a
1 b
2 c

Seriesクラスのindex引数にインデックス値を渡すことでインデックス値を変更することができます。

import pandas as pd

l = ['a', 'b', 'c']
data = pd.Series(l, index=[10, 20, 30])

for idx, val in data.iteritems():
    print(idx, val)

実行結果

10 a
20 b
30 c

インデックスのみ取得

以下のようにindexでインデックス値を取得できます。

import pandas as pd

l = ['a', 'b', 'c']
s = pd.Series(l, index=[10, 20, 30])

for i in s.index:
    print(i)

実行結果

10
20
30

2次元データを扱う:DataFrame()

2次元データを扱うDataFrameクラスもfor文でループ処理することができます。

DataFrameクラスをfor文に渡す

項目名のみが出力されました。

import pandas as pd

df = pd.DataFrame({'age': (35, 18, 9), 'gender': ('man', 'woman', 'man')}, index=['Aさん', 'Bさん', 'Cさん'])

for i in df:
    print(i)

実行結果

age
gender

行データを取得

iterrowsメソッドを使うことで行データを取得することができます。

import pandas as pd

df = pd.DataFrame({'age': (35, 18, 9), 'gender': ('man', 'woman', 'man')}, index=['Aさん', 'Bさん', 'Cさん'])

for i, v in df.iterrows():
    print(i, v['age'], v['gender'])

実行結果

Aさん 35 man
Bさん 18 woman
Cさん 9 man

列データを取得

iteritemsメソッドを使うことで列データを取得することができます。

import pandas as pd

df = pd.DataFrame({'age': (35, 18, 9), 'gender': ('man', 'woman', 'man')}, index=['Aさん', 'Bさん', 'Cさん'])

for i, v in df.iteritems():
    print(i, v['Aさん'], v['Bさん'], v['Cさん'])

実行結果

age 35 18 9
gender man woman man

まとめ

今回の記事ではPythonのfor文の使い方を解説しました。

今回のおさらい

  • for文の基本的な使い方 = 『for 変数 in イテラブルオブジェクト:
  • 指定した回数だけ繰り返す = 『range()
  • 多重ループ = 『for文をfor文でネスト
  • for文が正常に終了した際の処理 = 『else
  • 要素とインデックスを同時に取得する = 『enumerate()
  • 複数の配列の要素を同時に取り出して処理する = 『zip()
  • 逆順で処理する = 『reversed()

プログラミング言語は条件分岐繰り返し処理で成り立っている!…っていうのは言い過ぎな気もしますが、繰り返し処理が大切な存在なのは間違いありません。

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

タイトルとURLをコピーしました