11. 繰り返し処理(For文)

Python for ループ文の徹底解説(条件分岐、配列、rangeでの回数指定、continueなど)

更新日:

for文とは、ある処理を決められた回数実行したい、あるリスト(配列)やタプルなどのオブジェクトから順にデータを取り出して処理をしたいという時に利用します。
 
この記事では、Pythonにおけるforループ文の使い方を初心者向けに解説しております。for文の定義方法や注意点、rangeを用いた指定回数の繰り返し処理など、for文についてはこれだけを読んでおけば良いよう、徹底的に解説しています。
 

 

Pythonにおけるfor文の書き方

for文の書き方は以下のとおりで、オブジェクトから要素を順に変数に代入していき、要素の数だけ処理を繰り返します。オブジェクトには、リスト(配列)、タプル、文字列などを指定することができます。

for 変数 in オブジェクト:
      処理1
      処理2

for文に含まれる処理は、インデント(字下げ)して記述します(通常、インデントには半角スペース4つが使われます。)。処理が複数行ある場合も、全てインデントします。インデントが終わると、for文の一連の処理は終わります。またオブジェクトの後には、必ず :(コロン)を付けてください。

 
 
オブジェクトとして、a、b、cの3つの要素が格納されたリストのfor文の処理イメージは次のようになります。

 

 
以降、リストの要素が無くなるまで、順に処理が実行されます。この例では、要素「c」が変数に格納され、処理1~3まで実行されれば、for文が終了します。
 

 

Pythonにおけるfor文の使い方の例

for文の使い方に関する例をいくつか見ていきましょう。
 

リスト(配列)

リスト(配列)に格納された数値4、3、12を順に変数i へ代入していき、変数numに加算します。最後に変数numを確認すると、リスト(配列)の数値が合計された値19(= 4 + 3 + 12)が表示されました。

In [1]: num = 0
...: for i in [4, 3, 12]:
...:       num = num + i
...: num
Out[1]: 19

 

タプル

先ほどの例について、リスト(配列)では無く、同じ数値(4, 3, 12)を格納したタプルを利用しても同様の結果になります。

In [2]: num = 0
...: for i in (4, 3, 12):
...:       num = num + i
...: num
Out[2]: 19

 

文字列

文字列’Hello’を順に1文字ずつ変数charへ代入していき、printで表示すると、1文字ずつ’H’、’e’、’l’、’l’、’o’と表示されました。

In [3]: for char in 'Hello':
...:       print(char)
Out[3]: H
            e
            l
            l
            o

 
 

Python for文における指定回数の繰り返し処理 (range)

またfor文において、指定した回数だけ繰り返しを行いたい場合にはリストの章で説明したrangeを使うと便利です。

rangeは指定した長さの、連続した整数のリストを自動で生成する関数ですので、for文とrangeを組み合わせることで、任意の回数だけループをすることができます。
 
 
rangeに対しては、開始値、終了値、増減量を引数として渡してあげると、その法則に則った数値を含むリストを自動的に作成してくれます。

range([開始値,] 終了値 [, 増減量])

開始値、増減量は省略することも可能です。その場合は、開始値は0、増減量は1とみなされます。また終了値はインデックスと同様、その数値は含まれません。
 
 

Python for文におけるrangeの例

それでは、for文におけるrangeの使用例を見ていきましょう。
 

rangeでの終了値のみの指定(0~終了値-1)

rangeの引数に5を渡すことで、0から4までの値のリストが自動的に作成され、順に値を読み込むことで、指定した回数分、処理を繰り返すことができます。ここでは順に読み込まれたリストの値をprintで表示しています。

In [4]: for i in range(5):
...:       print(i)
Out[4]: 0
            1
            2
            3
            4

 

rangeでの開始値、終了値の指定(開始値~終了値-1)

またリストの章で説明したように、rangeは始まりから終わりまでの範囲を指定できます。次の例は、3から6までの値を格納したリストを順に読み込み、値をprintで順に表示しています。

In [5]: for i in range(3,7):
...:       print(i)
Out[5]: 3
            4
            5
            6

 
 

rangeでのインクリメント(増分)の指定

rangeでは増減量を指定することができます。次の例は、1から10までの値を格納したリストをインクリメント(増分)+2で読み込み、値をprintで順に表示しています。

In [6]: for i in range(1, 11, 2):
...:       print(i)
Out[6]: 1
            3
            5
            7
            9

 
 

rangeでのデクリメント(減分)の指定

また、rangeの増減量としてはマイナスも指定することができます。次の例は、5から1までの値を格納したリストをデクリメント(減分)-1で読み込み、値をprintで順に表示しています。

In [7]: for i in range(5, 0, -1):
...:       print(i)
Out[7]: 5
            4
            3
            2
            1

 
 

rangeを応用したある範囲の数の合計の算出方法

rangeを応用してある範囲の数の合計を求めることができます。次の例は、1から100までの値を合計した値を表示しています。

In [8]: num = 0
...: for i in range(1,101):
...:       num = num + i
...: num
Out[8]: 5050

 
 

Python for文の繰り返し処理を抜ける方法 (break)

またfor文において、繰り返し処理の途中で特定の条件を満たした場合、繰り返し処理を抜けたい時には、breakを使います。

 
それでは、for文におけるbreakの使用例を見ていきましょう。
 
rangeにより、0から4まで順に変数iに代入され、処理を繰り返していますが、if文で変数iが2の場合、breakが実行されます。

In [9]: for i in range(5):
...:        if i == 2:
...:            break
...:        print(i)

 
実行結果では、printで表示された変数iの値は、0、1で止まっており、2の所で繰り返し処理が終わったことがわかります。

Out[9]: 0
            1

 
 

Python for文の繰り返し処理をスキップする方法 (continue)

一方で、for文において、ある特定の条件を満たした場合、その要素の処理をスキップし、次の要素の処理へ移りたい時には、continueを使います。

 
for文におけるcontinueの使用例は、次のようになります。
 
rangeにより、0から4まで順に変数iに代入され、処理を繰り返していますが、if文で変数iが2の場合、continueが実行され、以降の処理がスキップされます。その後、3、4と処理が続きます。

In [10]: for i in range(5):
....:        if i == 2:
....:            continue
....:        print(i)

 
実行結果では、printで表示された変数iの値は、0、1、3、4と、2の処理がスキップされたことがわかります。

Out[10]: 0
             1
             3
             4

 
 

Python for文の繰り返し処理後に特定の処理を実行する方法 (for else)

for文のよる繰り返し処理が全て実行された後に特定の処理を行いたい場合はelseを利用します。通常はbreakと合わせて利用し、for文の繰り返し処理が全て実行された場合には特定の処理が実行され、for文の処理がbreakにより抜けた場合は、特定の処理は実行しないというように使います。
 
elseの記述方法は、次のとおりです。

for 変数 in オブジェクト:
      処理1
      処理2
else:
      処理3

for文の後にelseを記述します。else文に含まれる処理は、インデント(字下げ)して記述します(通常、インデントには半角スペース4つが使われます。)。処理が複数行ある場合も、全てインデントします。またelseの後には、必ず :(コロン)を付けてください。

 
それでは、for文におけるelseの実行例を見ていきましょう。
 
rangeにより、0から4まで順に変数iに代入され、処理を繰り返していますが、if文で変数iが2の場合、breakが実行されます。

In [11]: for i in range(5):
....:        print(i)
....:        if i == 2:
....:            print("for文の処理はbreakしました。")
....:            break
....: else:
....:        print("for文の処理は全て終了しました。")

 
実行結果では、printで表示された変数iの値は、0、1で止まっており、2の所で繰り返し処理が終わったことがわかります。

Out[11]: 0
             1
             2
             for文の処理はbreakしました。

 
 
今度はif文の条件を変数iが6の場合、breakに変更してみましょう。

In [12]: for i in range(5):
....:        print(i)
....:        if i == 6:
....:            print("for文の処理はbreakしました。")
....:            break
....: else:
....:        print("for文の処理は全て終了しました。")

 
この場合はfor文の処理は全て実行され、最後にelseの処理が実行されています。

Out[12]: 0
             1
             2
             3
             4
             for文の処理は全て終了しました。

 
 

Python for文で複数のオブジェクトを同時に処理 (zip)

for文で複数のオブジェクトを同時に処理したい時にはzipを利用します。複数のオブジェクトで要素数が異なる場合は、一番少ないものに合わせられます。
 
zipの記述方法は、以下のようになります。

for 変数1, 変数2,…, 変数n in zip(オブジェクト1, オブジェクト2, …, オブジェクトn):
      処理1
      処理2
      処理3

 
オブジェクトとして2つのリストを元に、zipを利用したfor文の処理イメージは次のようになります。オブジェクトとして、リスト1、リスト2があり、それぞれリスト1にはa1、b1、c1、リスト2にはa2、b2、c2の3つの要素が格納されています。

 

 
以降、リストの要素が無くなるまで、順に処理が実行されます。この例では、要素「c1」が変数1に、要素「c2」が変数2に格納され、処理1~3まで実行されれば、for文が終了します。
 

 
それでは、for文におけるzipの使用例を見ていきましょう。
 
zipの引数にリストname、salesを渡すことで、リストの値が順に、変数product_nm、product_salesに格納され、処理が繰り返されています。ここでは順に読み込まれたリストの値をprintで表示しています。

In [13]: name = ["Cooktops", "Dryers", "Ranges", "TV", "Washers"] # (1)製品名
....:        sales = [124000, 60000, 70000, 133000, 12000] # (2)売上
....:        for product_nm, product_sales in zip(name, sales):
....:              print(product_nm, product_sales)
Out[13]: Cooktops 124000
             Dryers 60000
             Ranges 70000
             TV 133000
             Washers 12000

 
 

Python for文で要素とインデックスを同時に取得する方法 (enumerate)

for文でリストやタプルなどのオブジェクトから、要素とインデックスを同時に取得したい場合、enumerateを利用すると非常に便利です。
 
enumerateは、次のように記述します。オブジェクトから取得したインデックスは変数1へ、要素は変数2へ格納されます。

for 変数1, 変数2 in enumerate(オブジェクト):
      処理1
      処理2
      処理3

 
それでは、for文におけるenumerateの使用例を見ていきましょう。
 
enumerateの引数にリストnameを渡すことで、リストのインデックスが、変数iに、要素が変数product_nmに格納され、処理が繰り返されています。ここでは順に読み込まれたリストの値をprintで表示しています。

In [14]: name = ["Cooktops", "Dryers", "Ranges", "TV", "Washers"] # (1)製品名
....:        for i, product_nm in enumerate(name):
....:              print(i, product_nm)
Out[14]: 0 Cooktops
              1 Dryers
              2 Ranges
              3 TV
              4 Washers

 
 

Python for文でオブジェクトの要素を逆順で取得する方法 (reversed)

for文でオブジェクトの要素を逆から取得したい場合、reversedを用います。
 
reversedは、次のように記述します。オブジェクトから取得したインデックスは変数1へ、要素は変数2へ格納されます。

for 変数1, 変数2 in reversed(オブジェクト):
      処理1
      処理2
      処理3

 
オブジェクトにリストを用いた場合の通常のfor文と、reversedを用いたfor文との違いは、次のとおりです。

 
for文におけるreversedの例を見ていきましょう。
 
reversedの引数にリストnameを渡すことで、逆から(”Washers”から)リストの要素が変数product_nmに格納され、処理が繰り返されています。ここでは順に読み込まれたリストの値をprintで表示しています。

In [15]: name = ["Cooktops", "Dryers", "Ranges", "TV", "Washers"] # (1)製品名
....:        for product_nm in reversed(name):
....:              print(product_nm)
Out[15]: Washers
              TV
              Ranges
              Dryers
              Cooktops

 
 

-11. 繰り返し処理(For文)

Copyright© AI-interのPython3入門 , 2019 All Rights Reserved.