for文とは、ある処理を決められた回数実行したい、あるリスト(配列)やタプルなどのオブジェクトから順にデータを取り出して処理をしたいという時に利用します。
この記事では、Pythonにおけるforループ文の使い方を初心者向けに解説しております。for文の定義方法や注意点、rangeを用いた指定回数の繰り返し処理など、for文についてはこれだけを読んでおけば良いよう、徹底的に解説しています。
発売数9,000本突破を記念して、今だけ期間限定で87%オフの大セール中!!!
Pythonにおけるfor文の書き方
for文の書き方は以下のとおりで、オブジェクトから要素を順に変数に代入していき、要素の数だけ処理を繰り返します。オブジェクトには、リスト(配列)、タプル、文字列などを指定することができます。
処理1
処理2
for文に含まれる処理は、インデント(字下げ)して記述します(通常、インデントには半角スペース4つが使われます。)。処理が複数行ある場合も、全てインデントします。インデントが終わると、for文の一連の処理は終わります。またオブジェクトの後には、必ず :(コロン)を付けてください。
オブジェクトとして、a、b、cの3つの要素が格納されたリストのfor文の処理イメージは次のようになります。
以降、リストの要素が無くなるまで、順に処理が実行されます。この例では、要素「c」が変数に格納され、処理1~3まで実行されれば、for文が終了します。
for文とwhile文は同じ繰り返し処理ですが、次の点が異なります。
- for文は回数を指定して、指定した回数分の繰り返し処理を行います。
- 一方でwhile文は、条件を指定して、その条件がTrueの間は繰り返し処理を行い、Falseになれば繰り返し処理を抜けます。
while文の詳しい説明は、「図解!Python while文のループ処理を徹底解説!」を参照ください。
Pythonにおけるfor文の使い方の例
for文の使い方に関する例をいくつか見ていきましょう。
リスト(配列)
リスト(配列)に格納された数値4、3、12を順に変数i へ代入していき、変数numに加算します。最後に変数numを確認すると、リスト(配列)の数値が合計された値19(= 4 + 3 + 12)が表示されました。
...:
for i in [4, 3, 12]:...:
num = num + i...:
num
タプル
先ほどの例について、リスト(配列)では無く、同じ数値(4, 3, 12)を格納したタプルを利用しても同様の結果になります。
...:
for i in (4, 3, 12):...:
num = num + i...:
num
文字列
文字列’Hello’を順に1文字ずつ変数charへ代入していき、printで表示すると、1文字ずつ’H’、’e’、’l’、’l’、’o’と表示されました。
...:
print(char)e
l
l
o
発売数9,000本突破を記念して、今だけ期間限定で87%オフの大セール中!!!
for文における範囲指定の繰り返し処理 (range)
またfor文において、範囲を指定し、定められた回数だけ繰り返しを行いたい場合にはリストの章で説明したrangeを使うと便利です。
rangeは指定した長さの、連続した整数のリストを自動で生成する関数ですので、for文とrangeを組み合わせることで、範囲を指定し任意の回数だけループをすることができます。
rangeに対しては、開始値、終了値、増減量を引数として渡してあげると、その法則に則った数値を含むリストを自動的に作成してくれます。
開始値、増減量は省略することも可能です。その場合は、開始値は0、増減量は1とみなされます。また終了値はインデックスと同様、その数値は含まれません。
それでは、for文におけるrangeの使用例を見ていきましょう。
rangeでの終了値のみの指定(0~終了値-1)
rangeの引数に5を渡すことで、0から4までの値のリストが自動的に作成され、順に値を読み込むことで、指定した回数分、処理を繰り返すことができます。ここでは順に読み込まれたリストの値をprintで表示しています。
...:
print(i)1
2
3
4
rangeでの開始値、終了値の指定(開始値~終了値-1)
またリストの章で説明したように、rangeは始まりから終わりまでの範囲を指定できます。次の例は、3から6までの値を格納したリストを順に読み込み、値をprintで順に表示しています。
...:
print(i)4
5
6
for文でrangeの利用方法の詳しい説明は、「Python for 文でのrangeによる指定回数の繰り返し処理」を参照ください。
条件によりfor文の繰り返し処理を抜ける方法 (break)
またfor文において、繰り返し処理の途中で特定の条件を満たした場合、繰り返し処理を抜けたい時には、breakを使います。
それでは、for文におけるbreakの使用例を見ていきましょう。
rangeにより、0から4まで順に変数iに代入され、処理を繰り返していますが、if文で変数iが2の場合、breakが実行されます。
...:
if i == 2:...:
break...:
print(i)
実行結果では、printで表示された変数iの値は、0、1で止まっており、2の所で繰り返し処理が終わったことがわかります。
1
発売数9,000本突破を記念して、今だけ期間限定で87%オフの大セール中!!!
条件によりfor文の繰り返し処理をスキップする方法 (continue)
一方で、for文において、ある特定の条件を満たした場合、その要素の処理をスキップし、次の要素の処理へ移りたい時には、continueを使います。
for文におけるcontinueの使用例は、次のようになります。
rangeにより、0から4まで順に変数iに代入され、処理を繰り返していますが、if文で変数iが2の場合、continueが実行され、以降の処理がスキップされます。その後、3、4と処理が続きます。
...:
if i == 2:...:
continue...:
print(i)
実行結果では、printで表示された変数iの値は、0、1、3、4と、2の処理がスキップされたことがわかります。
1
3
4
for文の処理が終わった後に特定の処理を実行する方法 (for else)
for文のよる繰り返し処理が全て実行された後に特定の処理を行いたい場合はelseを利用します。通常はbreakと合わせて利用し、for文の繰り返し処理が全て実行された場合には特定の処理が実行され、for文の処理がbreakにより抜けた場合は、特定の処理は実行しないというように使います。
elseの記述方法は、次のとおりです。
処理1
処理2
else:
処理3
for文の後にelseを記述します。else文に含まれる処理は、インデント(字下げ)して記述します(通常、インデントには半角スペース4つが使われます。)。処理が複数行ある場合も、全てインデントします。またelseの後には、必ず :(コロン)を付けてください。
それでは、for文におけるelseの実行例を見ていきましょう。
rangeにより、0から4まで順に変数iに代入され、処理を繰り返していますが、if文で変数iが2の場合、breakが実行されます。
...:
print(i)...:
if i == 2:...:
print("for文の処理はbreakしました。")...:
break...:
else:...:
print("for文の処理は全て終了しました。")
実行結果では、printで表示された変数iの値は、0、1で止まっており、2の所で繰り返し処理が終わったことがわかります。
1
2
for文の処理はbreakしました。
今度はif文の条件を変数iが6の場合、breakに変更してみましょう。
...:
print(i)...:
if i == 6:...:
print("for文の処理はbreakしました。")...:
break...:
else:...:
print("for文の処理は全て終了しました。")
この場合はfor文の処理は全て実行され、最後にelseの処理が実行されています。
1
2
3
4
for文の処理は全て終了しました。
for文で複数の変数・オブジェクトを同時に処理 (zip)
for文で複数の変数・オブジェクトを同時に処理したい時にはzipを利用します。複数のオブジェクトで要素数が異なる場合は、一番少ないものに合わせられます。
zipの記述方法は、以下のようになります。
処理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で表示しています。
....:
sales = [124000, 60000, 70000, 133000, 12000] # (2)売上....:
for product_nm, product_sales in zip(name, sales):....:
print(product_nm, product_sales)Dryers 60000
Ranges 70000
TV 133000
Washers 12000
for文で要素とインデックスを同時に取得する方法 (enumerate)
for文でリストやタプルなどのオブジェクトから、要素とインデックスを同時に取得したい場合、enumerateを利用すると非常に便利です。
enumerateは、次のように記述します。オブジェクトから取得したインデックスは変数1へ、要素は変数2へ格納されます。
処理1
処理2
処理3
それでは、for文におけるenumerateの使用例を見ていきましょう。
enumerateの引数にリストnameを渡すことで、リストのインデックスが、変数iに、要素が変数product_nmに格納され、処理が繰り返されています。ここでは順に読み込まれたリストの値をprintで表示しています。
....:
for i, product_nm in enumerate(name):....:
print(i, product_nm)1 Dryers
2 Ranges
3 TV
4 Washers
for文でオブジェクトの要素を逆順で取得する方法 (reversed)
for文でオブジェクトの要素を逆から取得したい場合、reversedを用います。
reversedは、次のように記述します。オブジェクトから取得したインデックスは変数1へ、要素は変数2へ格納されます。
処理1
処理2
処理3
オブジェクトにリストを用いた場合の通常のfor文と、reversedを用いたfor文との違いは、次のとおりです。
for文におけるreversedの例を見ていきましょう。
reversedの引数にリストnameを渡すことで、逆から(”Washers”から)リストの要素が変数product_nmに格納され、処理が繰り返されています。ここでは順に読み込まれたリストの値をprintで表示しています。
....:
for product_nm in reversed(name):....:
print(product_nm)TV
Ranges
Dryers
Cooktops
for文を1行でシンプルに書くリスト内包表記
for文を一行で記述し、for文から取得した要素をリストに格納することができます。
for文を一行で記述する方法は次のようになります。
処理には通常、変数が用いられ、リストから順に取得した要素に対して何らかの処理を行います。そして、その結果がそのままリストに格納されます。
for文の中の処理の順番が変わり、わかりづらくなりましたので、通常のfor文との違いを、番号を付けて、確認しましょう。
通常のfor文の構成要素に番号を振ると次のようになります。
これをリスト内包表記で記述するには、次のように順番を変える必要があります。
3.の処理が一番前に来ています。
それでは、リスト内包表記の例を確認しましょう。
list1には[1,3,5,7]が格納されており、これらの各要素に対して2倍して1を加える場合、次のように記述します。
....:
list2 = [ i * 2 + 1 for i in list1 ] ....:
print(list2) 次にlist1の2番目の要素3が変数iに格納され、3 * 2 + 1 = 7が、新たなリストの2番目の要素となります。
これらの計算をfor文でlist1の全ての要素に対して繰り返し、 結果として[3, 7, 11, 15]が出力されました。
このようにして、for文はリスト内包表記を使って、for文で計算・取得した要素を新たなリストに格納することができます。
関連記事です。
Pythonに関する重要なトピック全般について学んでいきたいと考えておられる方には、次のリンクをお勧めします。