Pythonでfor文による繰り返し(ループ)処理をする方法について解説します。
Contents
for文による繰り返し処理
Pythonでは、for文を用いることで繰り返し(ループ)処理を実行することが可能です。
C言語等の他の言語でも同様にfor文による繰り返し(ループ)処理を実現できることをご存じな方も多いかと思いますが、C言語等のfor文をイメージされている方からするとPythonのfor文の書き方は少し異なっています。
本記事では、Pythonにおけるfor文を使った繰り返し(ループ)処理の基本について紹介していきます。
なお、Pythonの繰り返し処理ではwhile文も使用できます。while文については「while文の基本的な使い方」でまとめていますので興味があれば参考にしてください。
一定条件に一致する場合に処理を繰り返したい場合はwhile文の方が便利ですが、リストなどから要素を取り出しながら繰り返し処理をしたい場合はfor文の方が適しています。
for文の基本的な使い方
Pythonのfor文では、リスト、辞書、集合等のイテラブル(iterable)なオブジェクトから要素を取り出して処理します。C言語等のforでは「for(i =0; i < 10; i++)」のように初期化値、条件、変化式のように指定して繰り返し処理をするので考え方が異なっています。
Pythonにおけるfor文の構文は以下になります。
for 変数 in イテラブルなオブジェクト: 処理コード...
では、簡単な使用例を見ながらPythonのfor文の使い方を確認しましょう。
# for文の基本的な使い方 data = [10, 20, 30, 40, 50] for dt in data: print(f"dt: {dt}")
【実行結果】 dt: 10 dt: 20 dt: 30 dt: 40 dt: 50
上記例では、dataという数値リストを用意し、dataから要素を一つずつ取り出して値を表示する処理をしています。
dataの部分はリストだけではなく辞書、集合等のイテラブル(iterable)なオブジェクトであれば同様に使うことができます。
イテラブル(iterable)なオブジェクトとは反復可能なオブジェクトでリスト(list)、タプル(tuple)、辞書(dict)等が代表的なものになります。また、__iter__()メソッドかもしくは__getitem__()メソッドを持つ任意のクラスのオブジェクトもfor文の繰り返しで使用することができます。
イテラブル(iterable)に関する公式ドキュメントの説明はこちらを参照してください。
break文によるループの終了
for文の繰り返し処理では、一定の条件を満たした場合などにfor文を抜けて次の処理に移りたい場合があります。
このような場合でfor文を途中で抜けるには以下のようにbreak文を使います。
# break文でループを抜ける data = [10, 20, 30, 40, 50] for dt in data: print(f"start: {dt}") if dt > 30: # 30より大きい値の場合はループを抜ける print("break") break print("end")
【実行結果】 start: 10 end start: 20 end start: 30 end start: 40 break
上記例では、for文で順に取り出していった数値が30より大きい数値の場合に処理を抜けるようにしています。
for文の中でifにより判定を行っているため上記例の実行結果では数値が40のループに入っていますが、dt > 30のif文の条件に当てはまることから"break"が表示されています。
その後、break文でループを抜けているため"end"という文字列は表示されません。また、その次の50のループにも入っておらず、for文の処理を抜けていることが分かります。
continue文による次のループへのジャンプ
上記のbreak文は一定条件を満たす場合にfor文の繰り返し(ループ)を抜けてfor文を終了しましたが、一定の条件を満たす場合に、以降の処理をスキップして次のループへ進みたい場合があります。
このような場合で処理をスキップして次のループへ進むためには、以下のようにcontinue文を使います。
# continue文で次のループへ data = [10, 20, 30, 40, 50] for dt in data: print(f"start: {dt}") if dt < 30: # 30より小さい値の場合は、次のループへ continue print("end")
【実行結果】 start: 10 start: 20 start: 30 end start: 40 end start: 50 end
上記例では、数値が30より小さい値の場合は、処理をスキップして次のループへ進むようにしています。
そのため、10, 20の場合は"end"が表示されておらず、print処理がスキップされていることが分かります。しかし、for文を抜けているわけではなく後続する30, 40, 50については処理がされています。
elseによる正常終了の確認
for文の処理が正常に終了しているかを確認したい場合には、elseで確認することができます。ここで、正常終了と言っているのは「break文が実行されていない」ということです。以下の例で見てみましょう。
# elseによるbreakのチェック(breakが呼び出されるケース) data = [10, 20, 30, 40, 50] for dt in data: print(f"start: {dt}") if dt > 30: # 30より大きい値の場合はループを抜ける break print("end") else: # breakが呼び出されなければ実行 print("正常終了") print("\n==========") # elseによるbreakのチェック(breakが呼び出されないケース) data = [10, 20, 30] for dt in data: print(f"start: {dt}") if dt > 30: # 30より大きい値の場合はループを抜ける break print("end") else: # breakが呼び出されなければ実行 print("正常終了")
【実行結果】 start: 10 end start: 20 end start: 30 end start: 40 ========== start: 10 end start: 20 end start: 30 end 正常終了
上記例は、前半部分は「break文が呼び出されて処理を抜けるケース」処理、後半部分は「breakが呼び出されないケース」となっています。
前半の処理では、break文が呼び出されているので"正常終了"というprintをするelseの中に入っていないことが分かります。
一方、後半の処理では、break文が呼び出されないので処理を抜けずにすべての要素を処理しています。この場合にはelseの中に入って"正常終了"というprintが実行されていることが分かります。
このようにbreak文の実行有無を確認するのにelseは便利なものとなっています。
for文でよく使う方法 ~range、enumerate、zip~
rangeを用いたfor文によるループ処理
C言語などの経験がある方は、for(i =0; i < 10; i++)のように数字を順番に増やしていってfor文を使うイメージの方もいるかもしれません。
Pythonでも同様に数字を順番に使ってループ処理をすることができますがその時には、rangeを使用します。rangeを使用したfor文の使用方法については「rangeを用いたfor文の使い方」でまとめていますので興味がある方は参考にしてください。
enumerateを用いたfor文によるループ処理
for文でリスト等から値を取り出して処理する場合に、その要素が何番目の要素かを使いたい場合があるかと思います。
現在処理している要素が何番目の要素かを取得しつつfor文を利用するには、enumerateを使用します。enumerateを使用したfor文の使用方法については「enumerateを用いたfor文の使い方」でまとめていますので興味がある方は参考にしてください。
zipを用いたfor文によるループ処理
for文を使用する場合に、複数のリスト等をまとめて処理をしたい場合があるかと思います。
複数のリスト等をまとめてfor文で利用するには、zipを使用します。zipを使用したfor文の使用方法については「zipを用いたfor文の使い方」でまとめていますので興味がある方は参考にしてください。
まとめ
Pythonでfor文による繰りし(ループ)処理をする方法について解説しました。
Pythonのfor文では、リスト、辞書、集合等のイテラブル(iterable)なオブジェクトから要素を取り出して処理します。C言語等のforでは「for(i =0; i < 10; i++)」のように初期化値、条件、変化式のように指定して繰り返し処理をするのでC言語などからPythonに移ってきた人には慣れるまで時間がかかるかもしれません。
for文による繰り返し(ループ)処理は、Pythonに限らず、いずれのプログラミング言語でも中心的な処理のため、しっかり使えるようにしましょう。
上記で紹介しているソースコードについてはgithubにて公開しています。参考にしていただければと思います。