この記事では、Pythonのfor文の使い方を解説します。
for
文は、反復(ループ)を行うための制御構造です。リストやタプルなどシーケンスや他のイテラブルオブジェクトの要素を1つずつ取り出し、任意の操作を各要素に対して順次実行します。
同じような処理を何度も実行したい場合やシーケンスを含むイテラブルオブジェクトの各要素に対してなんらかの処理を行いたい場合に使用されます。
また、条件式がTrue
の間だけループ処理するwhile文も用意されています。
それでは、for
文について見ていきましょう!
for文の使い方
for
文は以下のように定義できます。
for 変数名 in イテラブル:
何かしらの処理
指定されたイテラブルの要素が1つずつ順番に変数に代入され、ブロック内の処理が反復されます。イテラブルの要素が取り出せなくなった時点でループが終了します。
要素を受け取った変数はfor
文ブロック内で呼び出すことができます。
リストの要素を1つずつ出力するには、以下のようなコードになります。
items= [1, 2, 3]
for item in items:
print(item)
実行結果
1
2
3
リストitems
の要素が変数item
に1つずつ代入され、for
文ブロック内のprint()
関数がループ処理されることによってすべての要素が一度ずつ出力されます。
これがfor
文の基本的な使い方となります。
任意の回数だけループ:range関数
for
文とrange()
関数を組み合わせることで任意の回数だけループ処理させることができます。range()
関数は、数列を生成する関数です。
以下のコードでは、3回ループ処理しています。
for i in range(3):
print(i)
実行結果
0
1
2
range
関数の引数として負の整数や初期値を指定することもできる。
for i in range(2, -3, -1):
print(i)
実行結果
2
1
0
-1
-2
イテラブルオブジェクトから取り出した要素をfor
文ブロック内で使用しない場合は、変数名を_(アンダースコア)
にしておくと安全です。
for _ in range(3):
print('abc')
実行結果
abc
abc
abc
ループ処理をスキップ:continue
ループ処理をスキップするには、continue
文を使います。
処理をスキップしたい回でcontinue
文が実行されるようにfor
文ブロック内に記述することで、その回のループ処理をスキップすることができます。
continue
文が実行された回の処理のみスキップするので以降もループ処理は継続されます。
例えば、値が偶数の時のみ処理をスキップしたいと思ったら以下のように記述します。
l = [1, 2, 3, 4, 5, 6]
for i in l:
# 2で割り切れるかどうか
if i % 2 == 0:
# 割り切れたら実行
continue
# 割り切れなかったら処理される
print(i)
実行結果
1
3
5
i の値が偶数の時にcontinue
文が実行され、処理がスキップされているのでprint()
が実行されず、奇数の値みが出力されています。
ループ処理を中断:break
ループ処理を中断するには、break
文を使います。
何かしらの要素を取り出した際にbreak
文が実行されるようにfor
文ブロック内に記述することでループ処理を途中で終了することができます。
以下のコードでは、'end'
が処理される際にbreak
文が実行されてループが終了します。
for v in ['a', 'b', 'end', 'c']:
if v == 'end':
break
print(v)
実行結果
a
b
'end'
が処理される際にbreak
文が実行されてループが中断したのでそれ以降の要素である'c'は処理されませんでした。
for文が正常終了した際の処理:else
for
文のオプションとしてelse
節が用意されています。else
節は、for
文が正常終了した際に処理されるブロックを定義できます。
l = [1, 2, 3]
for i in l:
print(i)
# for文の後に記述する
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, 4, 5, 6, 7, 8, 9]
for i in l[4:7]:
print(i)
実行結果
5
6
7
上記コードは、スライスを用いてstart
に4
、stop
に7
を指定し、インデックスが4 < N <= 7
の要素のみを使ってループ処理しました。
Linkシーケンスの要素を任意の範囲で取得するスライスの使い方
要素とインデックスを同時に取得する:enumrate関数
for
文とenumerate()
関数を組み合わせることで要素とインデックスを扱うことができます。
enumerate(iterable, start=0)
enumerate()
関数は2つの要素(インデックス, 引数に指定されたイテラブルの要素)を返すので受け取る変数を2つ用意する必要があります。
vals= ['a', 'b', 'c']
for index, val in enumerate(vals):
print(index, val)
実行結果
0 a
1 b
2 c
start
引数に整数を指定することで開始値を変更することができます。以下のコードでは、開始値を1
にして実行しています。
vals = ['a', 'b', 'c']
for i, v in enumerate(vals, 1):
print(i, v)
実行結果
1 a
2 b
3 c
関連enumerate() - 組み込み関数 — Python 3.11.3 ドキュメント
受け取る変数を増やす場合
要素を受け取る変数は、状況によって増やすことができます。
2次元配列のループ
2次元配列をfor
文でループ処理する場合は、ネストされた配列の要素の分だけ変数を用意することで要素をそれぞれ取り出すことができます。
l = [[1, 2], [11, 22], [111, 222]]
for v1, v2 in l:
print(v1, v2)
実行結果
1 2
11 22
111 222
ネストされた配列に要素数が異なるものが1つでも混じっているとValueError
が発生するので注意してください。
l = [[1, 2], [11, 22], [111, 222, 333]]
for v1, v2 in l:
print(v1, v2)
実行結果
1 2
11 22
Traceback (most recent call last):
File "main.py", line 3, in
for v1, v2 in l:
ValueError: too many values to unpack (expected 2)
関連配列の要素を展開して変数に代入する方法を解説【アンパック】
複数のシーケンスの要素を取得:zip関数、zip_longest関数
for
文とzip()
関数を組み合わせることで複数のイテラブルをまとめて扱うことができます。
nums = [1, 2, 3]
vals = ['a', 'b', 'c']
for num, val in zip(nums, vals):
print(num, val)
実行結果
1 a
2 b
3 c
2つ以上のイテラブルも同時に処理することができます。
l1= [1, 2, 3]
l2 = ['a', 'b', 'c']
l3 = [4, 5, 6]
for v1, v2, v3 in zip(l1, l2, l3):
print(v1, v2, v3)
実行結果
1 a 4
2 b 5
3 c 6
渡されたイテラブルの長さが異なる場合は、短い方に合わせて実行されます。
nums = [1, 2, 3]
vals = ['a', 'b']
for num, val in zip(nums, vals):
print(num, val)
実行結果
1 a
2 b
長い方に合わせて処理したい場合は、itertools
モジュールのzip_longest()
を使います。足りない部分はNone
で補完されます。
import itertools
nums = [1, 2, 3]
vals = ['a', 'b']
for num, val in itertools.zip_longest(nums, vals):
print(num, val)
実行結果
1 a
2 b
3 None
for
文を何度も実行するのはコストがかかるのでできだけまとめて処理しちゃいましょう。
zip() - 組み込み関数 — Python 3.11.3 ドキュメント |
zip_longest() - itertools --- 効率的なループ実行のためのイテレータ生成関数 — Python 3.11.3 ドキュメント |
逆順で処理する:reversed関数
for
文とreversed()
関数を組み合わせることで要素を逆順で取得することができます。
nums = [1, 2, 3]
for num in reversed(nums):
print(num)
実行結果
3
2
1
リスト含むシーケンスの要素を逆順にする方法 |
リストやイテラブルの要素を昇順・降順で並び替える【ソート】 |
まとめ
この記事では、for
文を使った繰り返し処理の仕方について解説しました。
Pythonに限らずプログラミングでは「条件分岐」と「繰り返し処理」を非常によく使います。しっかり覚えておきましょう!
また、状況によってはwhile
文を使うことを検討しましょう!
それでは今回の内容はここまでです!ではまたどこかで〜( ・∀・)ノ