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'}]