for文は一定回数だけ指定の処理を繰り返すループ処理を書くために使います。そして、Pythonではfor文とrange関数を組み合わせることで、見た目的にも簡潔な「Pythonらしい」コードを書くことができます。
ここでその方法と仕組みを詳しく解説します。
なおfor文の基本に関しては、「Pythonのfor文による繰り返し処理(forループ)の基本」で解説しているので、しっかりとマスターしておきましょう。
1. for文のループ処理の回数について
Pythonではfor文(forループ)は次のように書きます。
for 変数名 in イテラブル:
処理
変数名の部分は一時的な変数であり任意の名称を書きます。イテラブルとは要素を順番に取り出すことができるオブジェクトのことです。文字列やリスト、タプル、セット、辞書などは全てイテラブルです。for文では、ほとんど誰もがリストを例にして解説するので、ここでもその慣習にしたがって解説します。
さて、for文は一定回数同じ処理を繰り返したい時に使うのですが、繰り返しの回数は、イテラブルの長さ(要素数)と同じになります。例えば5回ループ処理するなら次のように長さ(要素数)が5のリストを使います。
num_list = [1, 2, 3, 4, 5]
for i in num_list:
print(10)
あくまでもリストの長さ(要素の数)だけ繰り返し処理を行うのでリストに含まれている値は関係がありません。例えば次のコードでは数値のリストではなく名前のリストを使っていますが、値の種類に関係なく要素の数(=5回)だけループ処理をしています。
# リストの長さ(要素)の数だけ処理を繰り返すのであって値は関係ない。
name_list = ['たろう', 'じろう', 'さぶろう', 'しろう', 'ごろう']
for i in name_list:
print(10)
このように、for文のループの回数はリストの長さ(要素数)と同じになるということをしっかりと抑えておきましょう。
ループ処理を書くたびに、任意の繰り返し回数に相当する長さのリストを作るのも可能なのですが、例えば何百回も何千回もループ処理を繰り返したい場合、いちいちそれだけの長さのリストを作るのは、とても面倒で非効率です。
そこでPythonではrange関数を使って、簡単に任意の回数の処理を繰り返すループを作ることができるようになっています。
2. for 変数 in range() での繰り返し処理の書き方
「for 変数 in range()」を使って任意の回数の繰り返し処理を行うには以下のように書きます。
'''for 変数 in range() の書き方'''
for i in range(n) :
処理文1 #半角4文字のインデント
処理文2 #半角4文字のインデント
range関数の引数に繰り返しの数を書きます。そして、その下に半角4文字の空白を開け処理文を書きます。この処理文が指定回数のn回繰り返されます。range()の後ろのコロン「:」を忘れがちなので注意しましょう。
また上でも触れていますが、for文の中の変数はイテラブルから要素を取り出す時に使う一時的なもので変数名は任意です。
例を見てみましょう。
count = 0
for i in range(5):
print(i)
count += 1
print(f'ループ回数:{count}')
ループを繰り返す度に、一時的な変数’i’に、0、1、2、3、4と数値が1つずつ入っていきます。print(i)で繰り返しのたびにそれが出力されていますね。数値を順番に繰り返しているように見えますが、実際にはrange(5)の関数の中に含まれる 0 ~ 4 の数値が、ループを繰り返すごとに一つずつ’ i ‘ に代入されていくという処理になっています。
なおrange関数は、引数を一つだけ与えた場合、数値は0が先頭になり最後がn-1の数値のイテラブルを生成します。より理解するために、もう一歩踏み込んでみましょう。range関数では、以下のように第三引数まで指定することができて、様々な数値のリストを作ることができます。
range(開始位置, 終了位置, ステップ)
以下のコードを見ると使い勝手が分かると思います。
print(list(range(0, 10))) # 0 ~ 9 の昇順リスト
print(list(range(5, -6, -1))) # 5 ~ -5 の降順リスト
print(list(range(2, 11, 2))) # 2 ~ 10 の2の倍数(偶数)のリスト
print(list(range(3, 13, 3))) # 3 = 12 の3の倍数のリスト
これを使うと、「for 変数 in range()」と書いた時のPythonの挙動がよくわかります。
例えば、以下の例では、range関数で 3 ~ -3 の数値を逆順で作成しています。ループ処理のprint(i)の出力結果を見ると、3から-3まで順番に表示されていますね。
count = 0
for i in range(3, -4, -1):
print(i)
count += 1
print(f'ループ回数:{count}')
3 ~ -3までには数値が全部で7つあるので(0を含む)、合計7回ループしています。これは、次のコードと同じ意味のものになっています(注:処理速度はrange関数を使った方が早いです)。
for i in [3, 2, 1, 0, -1, -2, -3]:
print(i)
リストの長さ(要素数)が7なのでループ処理を7回繰り返すのですね。これらを見比べてみると繰り返し処理の回数が長くなればなるほど、range関数を使った方が手軽であることがわかります。
もう一つ見てみましょう。range関数で0から10までの間で0を含む3の倍数を作っています。
count = 0
for i in range(0, 10, 3):
print(i)
count += 1
print(f'ループ回数:{count}')
これは、次のコードと同じ意味です。
for i in [0, 3, 6, 9]:
print(i)
リストの長さ(要素数)が4なのでループ処理の回数も4回ですね。
3. 【注】Python2とPython3のrange関数の違い
range関数でfor文(forループ)の繰り返し処理の回数を指定する方法を見てきましたが、Python2に慣れている方は少し混乱したかもしれません。Python2とPython3でrange関数の違いに大きな違いがあるからです。ここで解説しておきます。
Python3から始めた方でも、Python2で書かれたコードを見る機会は多いのでサッと確認しておきましょう。
3.1. 【Python2】range関数とxrange関数
Python2ではrange関数はリスト型オブジェクトを返し、xrange関数はxrange型のオブジェクトを返します。
''' Python2の場合 '''
# range関数
print range(3)
print type(range(3))
# xrange関数
print xrange(3)
print type(xrange(3))
注:printはPython2ではステートメントでPython3では関数です。混乱のないように。
Python2のrange関数は値をすぐに作るためprint文で出力するとリストが表示されます。xrange関数は値を保持せず必要な時に生成するため、そのままprint文で出力すると中身の数値は表示されずxrange型のオブジェクトが表示されます。
そのためPython2ではfor文(forループ)の繰り返し処理の回数を指定する時はxrange関数を使っていました。
''' Python2の場合 '''
for i in xrange(3):
print i
3.2. 【Python3】range関数
しかっしPython3ではxrange関数は廃止されてrange関数のみになりました。Python3のrange関数はPython2のxrange関数に対応しておりrange型のオブジェクトを返します。そのためPython3でforループを書く時はrange関数を使います。
''' Python3のrange関数 '''
# Python2のxrange関数に相当する。
print(range(3))
print(type(range(3)))
# そのためPython3のループ処理ではrange関数を使います。
for i in range(3):
print(i)
余談ですが、Python3ではrange関数からリストを作る場合は、次のようにlist関数と組み合わせます。
list = list(range(10))
print(list)
当記事での「for 変数 in range()」の書き方の解説はPython3のものなのでサンプルコードはPython2では動きません。xrange()に起因するエラーの場合はrange()に変更すれば動くと思います。またprint文とprint関数の違いもありますので、Python2の方は適宜ご対応ください。
4. まとめ
range関数を使ってfor文の繰り返し処理を書く方法について解説してきました。
知識としておさらいしておきたいのは次の3点です。
- 「for 変数 in イテラブル」文では、イテラブルの長さ(要素数)の分だけ処理を繰り返す。
- イテラブルの代わりにrange(n)で繰り返し回数を手軽に指定することができる。
- Python3のrange関数は、Python2のxrange関数に相当する。
ぜひ、参考にして頂ければと思います。
コメント