繰り返し処理をする際、Pythonではfor文が使用できます。このページではfor文について解説します。
Contents
for文の基本
Pythonのfor文は以下のように記述します。
ループ内処理
イテラブルオブジェクトというのは、listのようなシーケンスや辞書型のような複数の要素からなり、反復処理が可能なオブジェクトのことを指します。変数の型で既にループに関する話題に触れましたが、それらに加え、for-else文、break句について説明します。
[参考] range型まずは基本のfor文について解説します。
listのfor文
listの要素の先頭から順番に表示する場合、以下のように記述します。
datas = ['a', 'b', 'c'] for v in datas: print(v) # listの各値が表示される
rangeのfor文
C言語やJavaのループカウンタを利用したループのように、初期値、限界、増分を指定します。
for v in range(1, 5, 2): print(v) # 1から2飛ばしで5未満まで出力されます。この場合、1、3が出力されます。
※ 2020/06/20 修正 上コードのコメントに誤りがありました。ご連絡くださった方、ありがとうございます。
(誤:この場合、3、5が出力されます。正:この場合、1、3が出力されます。)
dictionaryのfor文
keyのループ
辞書型の場合、keyでループすることができます。
dic = {'key1': 110, 'key2': 270, 'key3': 350} for key in dic: print(key, dic[key])
valueのループ
値でループしたい場合はvaluesメソッドを利用します。
dic = {'key1': 110, 'key2': 270, 'key3': 350} for value in dic.values(): print(value) # 値が出力される
keyとvalueのループ
key、valueの両方をループで取得したい場合は、items()メソッドを利用します。
dic = {'key1': 110, 'key2': 270, 'key3': 350} for key, value in dic.items(): print(key, value) # keyと値が出力される
ループインデックスを取得する場合
何番目の要素だけは処理をしない、等の処理を入れたい場合はループインデックスを利用します。
組込みのenumerate関数を利用することで取得することができます。
リストの場合
l = ['a', 'b', 'c'] for i, value in enumerate(l): print(i, value) # ループインデックスとリストの値が出力 for i, (key, value) in enumerate(dic.items()): print(i, key, value) # ループインデックスとkeyと値が出力
辞書の場合
dic = {'key1': 110, 'key2': 270, 'key3': 350} for i, value in enumerate(dic): print(i, value) # ループインデックスと値が出力 for i, (key, value) in enumerate(dic.items()): print(i, key, value) # ループインデックスとkeyと値が出力
break
ループを途中で抜ける場合、breakを使用します。サンプルで確認してみましょう。
data_list = [1, 2, 3] # 空のリスト for data in data_list: print(data) if data > 1: break
2まで出力された後、breakが実行され処理が終了します。
for-else
Pythonのfor文はelseと併用することができます。elseブロックに記述した処理は、以下の動作となります。
- forループ処理回数によらず実行される
- breakした場合は実行されない
サンプルで動作を確認してみましょう。
data_list = [] # 空のリスト for data in data_list: print(data) else: print('ループ処理が終わりました') # ここが出力される。
ループで回すリストが空なので、forブロック内の処理は行われませんが、elseブロック内の処理は呼びだされます。また、breakと組み合わせて使用する場合が多いです。例えば、数値のリストで負の数の要素をループで見つけ、なければその旨を表示する場合、以下のように記述します。
l = [0, 3, 1, 10] for x in l: if x < 0: print("負の数を検知しました") break else: print("負の数は見つかりませんでした")
breakしない場合は最後のメッセージが表示されますが、breakすると最後のメッセージは表示されません。