Python

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

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

それでは、for文の使い方を見ていきましょう!

for文の使い方

書式

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

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

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

関連Pythonのイテラブルオブジェクトとイテレータとは?

サンプル

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

l = [1, 2, 3]

for i in l:
    print(i)

実行結果

1
2
3

処理をスキップする:continue

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

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

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(リスト)の使い方この記事では、Pythonのリスト(list)について解説します。リストはPythonでよく使用されるコンテナオブジェクトです。汎用性が...

タプル[tuple]

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

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

実行結果

1
2
3
【Python】tuple(タプル)の使い方この記事では、Pythonのtuple(タプル)について解説します。 tuple(タプル)とは? タプルとは、任意の...

文字列[str]

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

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

実行結果

H
e
l
l
o
 
W
o
r
l
d
!

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

【Python】文字列の使い方 【str型】この記事では、Pythonの文字列の使い方について解説します。Pythonには、文字列を扱うためのstr型というデータ型が用意されていま...

辞書[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の使い方【辞書】この記事では、Pythonのdictionary(ディクショナリ)について解説します。dictionaryは辞書とも呼ばれ、keyとva...

ジェネレータ

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

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

for i in func():
    print(i)

実行結果

1
2
3
【Python】ジェネレータの使い方この記事では、Pythonのジェネレータの使い方を解説します。ジェネレータとは、イテレータを簡単に作成するための機能です。リストやタプル...

バイナリシーケンス型

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

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

実行結果

H 72
e 101
l 108
l 108
o 111

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

for文に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関数の使い方【数列】この記事では、Pythonのrange関数の使い方について解説します。 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】スライスの使い方この記事では、Pythonのスライスの使い方を解説します。スライスを使うことでリストなどのシーケンス型のオブジェクトに格納されている要素...

多重ループ

書式

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

多重ループのberak

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文で複数のイテラブルオブジェクトを同時に処理できます。

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]

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

【Python】内包表記の使い方この記事では、Pythonの内包表記の使い方を解説します。内包表記を使うことで単純なリストを低コストで生成することができます。また、同じ...

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】ラムダ式の使い方【匿名関数】この記事では、Pythonのラムダ式の使い方を解説します。ラムダ式を使うことで、その場限りでしか使用しない関数を1行で生成することができ...

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

プログラミング言語は条件分岐繰り返し処理で成り立っていると言っても過言ではありません。頻繁に使用するのでよく覚えておきましょう!

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

【おすすめ】Python参考書