言語バージョン 3.9.0

公開日 2020年11月13日 JST

更新日 2020年12月10日 JST

コード例の出力としてprint関数を使用しています。

使用方法がわからない場合は以下のページを参照してからコード例を確認してください。

print関数の使用方法

for

このページでは豊富な例を用いてPythonのforの使い方を学ぶことができます。

forはPythonの構文の1つです。 list(リスト)型や辞書(dict)型などの反復可能(iterable)なオブジェクトに対して繰り返し処理を実行する際によく用いられる構文です。 whileに似た特徴を持ち、 繰り返し処理の間はfor文内に記述した処理が繰り返されます。 基本的には対象の反復可能オブジェクトのすべての要素の数だけ繰り返し処理が行われます。

break(break statements)やcontinue(continue statements)を用いることにより処理をスキップしたり中断させたりすることも可能です。
また、elseを使用することができ、breakで中断したとき以外のfor文の処理の後に実行する処理を記述すること出来ます。

TL;DR

基本

list1 = ['first', 'second', 'third']
for e in list1:
    print(e, end=' ')
==> first second third



tuple1 = (1.1, 2.2, 3.3)
for e in tuple1:
    print(e, end=' ')
==> 1.1 2.2 3.3



dict1 = {"key1": 11, "key2": 22}
for e in dict1:
    print(e, end=' ')
==> key1 key2
for k in dict1.keys():
    print(k, end=' ')
==> key1 key2
for v in dict1.values():
    print(v, end=' ')
==> 11 22
for k, v in dict1.items():
    print(k, v, sep=':', end=' ')
==> key1:11 key2:22



string1 = "Python"
for e in string1:
    print(e, end=' ')
==> P y t h o n



class Person:
    def __init__(self, number, name):
        self.number = number
        self.name = name

list2 = [Person(1, 'Django'), Person(2, 'Python')]
for e in list2:
    print(e.number, e.name, sep=':', end=' ')
==> 1:Django 2:Python



int1 = 123
for e in int1:
    print(e, end=' ')
==> (エラー) TypeError: 'int' object is not iterable

関連情報:list(リスト・配列)の使用方法

関連情報:class(クラス定義)の使用方法

インデックスの取得(enumerate)

list1 = ['Python', 'JavaScript']
for i, v in enumerate(list1):
    print(i, v, end=' ')
==> 0 Python 1 JavaScript



tuple1 = ('apple', 'banana', 'kiwi')
for i, v in enumerate(tuple1):
    print(i, v, sep=':', end=' ')
==> 0:apple 1:banana 2:kiwi



dict1 = {"x-A": 1000, "x-B": 2000}
for i, k in enumerate(dict1.keys()):
    print(i, k, sep=':', end=' ')
==> 0:x-A 1:x-B



list2 = ['first', 'second', 'third', 'fourth']
for i, v in enumerate(list2, 1):
    print(i, v, sep=':', end=' ')
==> 1:first 2:second 3:third 4:fourth

関連情報:enumerateの使用方法

n回の繰り返し処理(range)

# 3回繰り返し処理を実行
for _ in range(3):
    print('Python')
==> Python
==> Python
==> Python



# 3回繰り返し処理を実行(iは0から開始され9で終了)
for i in range(10):
    print(i, end=' ')
==> 0 1 2 3 4 5 6 7 8 9



# 7回繰り返し処理を実行(iは3から始まり9で終了)
for i in range(3, 10):
    print(i, end=' ')
==> 3 4 5 6 7 8 9



# 5回繰り返し処理を実行(iは0から始まり2飛ばしで8で終了)
for i in range(0, 10, 2):
    print(i, end=' ')
==> 0 2 4 6 8

関連情報:rangeの使用方法

複数オブジェクトの同時処理(zip)

list1 = ['Sophia', 'Emma', 'John']
list2 = ['peach', 'grape', 'strawberry']
for v1, v2 in zip(list1, list2):
    print(v1, v2)
==> Sophia peach
==> Emma grape
==> John strawberry



for v1, v2, v3 in zip(list1, list2, ['first']):
    print(v1, v2, v3)
==> Sophia peach first



for v1, v2 in zip('ABCDEF', 'abc'):
    print(v1, v2)
==> A a
==> B b
==> C c

関連情報:zipの使用方法

処理のスキップ(continue)

for i in range(10):
    if i % 2 == 0:
        continue
    print(i, end=' ')
==> 1 3 5 7 9



list1 = ['Python', 'Kotlin', 'Groovy']
for i, v in enumerate(list1):
    if i == 1:
        continue
    print(v, end=' ')
==> Python Groovy



class Language:
    def __init__(self, identifier, name):
        self.identifier = identifier
        self.name = name

dict1 = {
    'py': Language(1, 'Python'),
    'go': Language(2, 'Golang'),
    'js': Language(3, 'JavaScript')
}
for k, v in dict1.items():
    if k == 'go':
        continue
    print(k, vars(v), sep=':')
==> py:{'identifier': 1, 'name': 'Python'}
==> js:{'identifier': 3, 'name': 'JavaScript'}

処理の停止(break)

for i in range(999):
    if i > 4:
        break
    print(i, end=' ')
==> 0 1 2 3 4



list1 = [100, 200, 300]
for e in list1:
    print(e, end=' ')
    break
==> 100



my_sum = 0
for i in range(1000):
    my_sum += i
    if my_sum > 100:
        print('i', i, sep='=')
        break
==> i=14
print('my_sum', my_sum, sep='=')
==> my_sum=105

すべて繰り返された場合の処理(else)

# すべての繰り返し処理が実行されるとelseの処理も実行される
for i in range(3):
    print(i)
else:
    print('OK')
==> 0
==> 1
==> 2
==> OK



# 途中でbreakでforを抜けるとelseの処理は実行されない
for i, v in enumerate(['Python', 'Scala', 'Ruby']):
    if i > 0:
        break
    print(v)
else:
    print('OK')
==> Python



# forの処理が行われない場合もelseの処理は実行される
for i in range(0):
    print(i)
else:
    print('OK')
==> OK



# continueの場合はelseの処理は実行される
for i in range(10):
    continue
else:
    print('OK')
==> OK

リスト内包表記(list comprehension)

list1 = [i for i in range(10)]
print(list1)
==> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]



matrix = [
    [1, 2, 3],
    [1.1, 2.2, 3.3],
    [100, 200, 300],
]
list2 = [[row[i] for row in matrix] for i in range(len(matrix[0]))]
print(list2)
==> [[1, 1.1, 100], [2, 2.2, 200], [3, 3.3, 300]]

解説

基本

forはinの後ろに繰り返し処理をしたい対象を指定し、forの後ろに対象の繰り返し中の各要素を格納する変数を定義します。

リスト型やタプル型の場合は各バリューが変数に格納されますが、辞書型の場合は各キーが格納されるので注意が必要です。

list1 = [100, 200, 300]
for e in list1:
    print(e, end=' ')
==> 100 200 300



dict1 = {'py': 'Python', 'js': 'JavaScript'}
for e in dict1:
    print(e, end=' ')
==> py js

インデックスの取得(enumerate)

繰り返し中のインデックス番号を取得したい場合、 enumerate関数 を使用することで取得できます。

enumerateを使用するとforの後ろの変数として、第1変数にインデックス、第2変数に繰り返し対象の値を取得することができます。
enumerateの第2引数にインデックス番号の始まりの値を指定することが出来ます。指定しない場合のデフォルト値は0です。

list1 = ['Emma', 'Ava']
for i, v in enumerate(list1):
    print(i, v, sep=':', end=' ')
==> 0:Emma 1:Ava
for i, v in enumerate(list1, 5):
    print(i, v, sep=':', end=' ')
==> 5:Emma 6:Ava

n回の繰り返し処理(range)

特定の回数だけ繰り返し処理を行いたい場合、 range関数 を使用するとシンプルに記述できます。

n回の繰り返しを行いたい場合、inの後にrange(n)とすることで実現可能です。 また、第2引数や第3引数を指定することでより高度な使用が可能です。(複数引数を用いた例

for i in range(3):
    print(i, end=' ')
==> 0 1 2



list1 = ['William', 'James', 'Oliver']
for i in range(2):
    print(list1[i], end=' ')
==> William James

複数オブジェクトの同時処理(zip)

zip関数 を使用すると複数の反復可能なオブジェクトを同時に繰り返し処理することが可能になります。

複数のオブジェクトの長さが異なる場合、一番短いオブジェクトに合わせた反復回数になることに注意してください。

list1 = ['first', 'second', 'third']
list2 = ['Python', 'JavaScript', 'Smalltalk']
for value1, value2 in zip(list1, list2):
    print(value1, value2)
==> first Python
==> second JavaScript
==> third Smalltalk



tuple1 = (0, 1)
for value1, value2, value3 in zip(list1, list2, tuple1):
    print(value1, value2, value3)
==> first Python 0
==> second JavaScript 1

処理のスキップ(continue)

特定の条件下などで繰り返し処理をスキップしたい場合、whileと同じようにcontinueを用いることができます。 (while文でのcontinue使用方法

continueが評価されるとfor文内のそれ以降の処理がスキップされ、次の繰り返し処理が行われます。
次に説明するbreakとの挙動の違いに注意して使用してください。

for i in range(1001):
    if 2 < i < 999:
        continue
    print(i, end=' ')
==> 0 1 2 999 1000

処理の停止(break)

breakを使用することで、while文と同様にfor文の処理から抜けることが出来ます。 (while文でのbreak使用方法

breakが評価されるとすべての繰り返し処理が行われていなくとも、breakが評価された瞬間にfor文外へと処理が移ります。
前項のcontinueとの挙動の違いに注意して使用してください。

for i in range(10):
    print(i)
    break
==> 0



for i in range(10):
    if i > 3:
        break
    print(i, end=' ')
==> 0 1 2 3

すべて繰り返された場合の処理(else)

Pythonのforはwhileと同様にelseを使用することが出来ます。 (while文でのelse使用方法

forとelseを使用すると、繰り返し処理がすべて完了した場合(0回の繰り返しの場合を含む)にelseで指定した処理が実行されます。

breakで処理が中断した際にはelseの処理は実行されません。continueでスキップされた場合にはelseの処理は実行されます。

list1 = ['January', 'February', 'March']
for e in list1:
    print(e)
else:
    print('OK')
==> January
==> February
==> March
==> OK



for e in list1:
    print(e)
    break
else:
    print('OK')
==> January

リスト内包表記(list comprehensions)

リスト内包表記(list comprehensions)はリスト型の生成方法を提供してくれるものです。

リスト型の値を生成する際に角括弧[]の中に値を直接記述したり、 appendを利用する方法 がありますが、リスト内包表記は角括弧[]の中にforを直接記述してリスト型を生成することが出来ます。

list1 = [0, 1, 2, 3, 4, 5]
# リスト内包表記を用いたリスト生成
list2 = [i for i in range(6)]
print(list1)
==> [0, 1, 2, 3, 4, 5]
print(list2)
==> [0, 1, 2, 3, 4, 5]



list3 = ['first', 'second', 'third']
# リスト内包表記を用いて辞書型の要素を持ったリストを生成
list4 = [{i: list3[i]} for i in range(len(list3))]
print(list4)
==> [{0: 'first'}, {1: 'second'}, {2: 'third'}]

1次情報

for文 - Pythonドキュメント

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

シーケンス型 - Pythonドキュメント

リストの内包表記 - Pythonドキュメント

break文とcontinue文とループのelse節 - Pythonドキュメント