for-inループを使った反復処理では、リスト、文字列、辞書などをシーケンスとして動かしました。
それ以外にも関数を使った方法があります。
ここではrange()関数とzip()関数を使った処理を見ていこうと思います。
range()で反復処理- 数値のシーケンス生成
forループと一緒にrange()関数が使われることがよくあります。range()関数を使えば、リストなどのシーケンスを用意してそこから変数に格納しなくても、指定した範囲の数値の順に取り出してくれるので、イテラブルなオブジェクト返します。
range()関数の使い方は、range(start値, end値, step値)という形でそれぞれの値に数値を指定して利用します。スライスと同様の使い方ですね。
次のコードを見てみましょう。
for i in range(10):
print(i)
実行するとこうなります。
注意点としては終了値として指定してる10の手前までの値ということですね。
このコードをリストを使って書くと次のコードと同じ処理になります。
some_list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
for i in some_list:
print(i)
range()のstart、end、stepの値を指定してみます。
for i in range(1,10,3):
print(i)
1から9までの間で間隔3ごとに取り出します。
実行するとこうなります。
このrange()関数は、list()を使ってリストに変換することができます。
list(range(1,10,3))
実行すると次のようにリストになっているのがわかります。
zip()で反復処理 – 複数のシーケンスの反復処理
zip関数を使うと複数のシーケンスを並列に反復処理することができます。
ここでは3つのリストを使って見ていきましょう。
次のような変数を用意してコードを書いてみます。
gundam_meisters = ["Setsuna", "Lockon", "Allelujah", "Tieria"]
gundams_1st = ["EXIA", "DYNAMES", "KYRIOS", "VIRTUE"]
gundams_2nd = ["00-GUNDAM", "CHERUDIM", "ARIOS", "SERAVEE"]
for meister, ms_1st, ms_2nd in zip(gundam_meisters, gundams_1st, gundams_2nd):
print(meister, ms_1st, ms_2nd)
機動戦士ガンダム00のガンダムマイスターの名前、ファーストシーズンのモビルスーツ名、セカンドシーズンのモビルスーツ名をそれぞれリストにしてしています。
これらをzip()関数でまとめて、それぞれの位置に対応した変数を準備して出力します。
コードを実行するとこうなります。
それぞれのリストの共通する位置(オフセット)の値が抜き出されて反復処理されているのがわかります。
3つのリストがここでは全て同じ要素数でしたが、要素数がそれぞれ異なる場合は、一番小さい要素数に合わせたオフセットで反復処理がなされます。
このコードをrange()関数を使って書き直すと、次のようになります。
gundam_meisters = ["Setsuna", "Lockon", "Allelujah", "Tieria"]
gundams_1st = ["EXIA", "DYNAMES", "KYRIOS", "VIRTUE"]
gundams_2nd = ["00-GUNDAM", "CHERUDIM", "ARIOS", "SERAVEE"]
for i in range(len(gundam_meisters)):
print(gundam_meisters[i], gundams_1st[i], gundams_2nd[i])
実行すると同様の結果が出力されます。
zip()関数と比べると、少し位置関係がスッキリしない感じはありますね。インデックスを指定しないといけないことも考えるとちょっと複雑です。
まとめ
Pythonのforループ処理には、リスト、文字列、辞書などをシーケンスとして指定する以外にも別の方法があります。
range()関数を使えば、リストなどを用意しなくても数値を指定した範囲で順に取り出してくれます。
zip()関数を使えば、複数のリストといったシーケンスを並列的に取り出して反復処理することができます。