Pythonのfor文とは?同じ処理を繰り返したい場合に知っておきたいfor文の書き方
Pythonにおいて同じ処理を繰り返したい場合、for文を使って処理を行うことがあります。
Pythonにおけるfor文は、イテラブルオブジェクトの要素を1つずつ取り出して処理を繰り返すのが基本となります。
しかし、Pythonで用意されている様々な関数を組み合わせることができるので、使用例は多岐にわたります。
本記事ではfor文の基本的な書き方と様々な使用例を解説します。
1.Pythonにおけるfor文について
まずは、Pythonにおけるfor文がどういうものかを解説します。
1-1.イテラブルオブジェクトの要素を1つずつ取り出して繰り返す
Pythonにおけるfor文はイテラブルオブジェクトの要素を1つずつ取り出すことによって繰り返し処理を実現します。イテラブルオブジェクトとは、リスト、タプル、辞書などの「繰り返し可能なオブジェクト」のことを指します。また、後述するrange()関数やzip()関数などの様々な関数によって生成されたオブジェクトも1つずつ取り出して処理を行えます。
2.for文の基本的な書き方
続いて、最も基本的なfor文の書き方を解説します。
2-1.イテラブルオブジェクトを指定して、処理内容はインデントする
for文の書き方は以下の通りです。
for 変数 in イテラブルオブジェクト: 処理内容
inの後にイテラブルオブジェクトを指定し、コロン「:」を入力してください。するとforの後ろの変数に、指定されたイテラブルオブジェクトの要素が1つずつ格納され、処理内容に記載された処理が実行されます。このとき、処理内容は必ずインデントしてください。そうしないと、繰り返す処理内容と認識されないだけでなく、エラーとなってプログラムが止まってしまいます。
2-2.リストを用いた基本的な書き方
では、上記を具体的なソースで解説します。ここでは、イテラブルオブジェクトのうち、リストを用いたソースコードの例を記載します。
places = ["東京","神奈川","千葉","埼玉"] for place in places: print(place + "に行きました")
実行結果
ここでは、1行目で記述したplacesというリストを、3行目から始まるfor文のinの後ろで指定しています。すると、placesから1つずつ取り出して変数placeに格納し、4行目で「に行きました」という文字をつけて出力させています。4行目の繰り返し処理は、placesに4つの要素が格納されているため、4回繰り返されます。このとき、4行目以降の繰り返す処理内容は必ずインデントして記述してください。
2-3.breakを用いて途中で処理を抜ける
今度は繰り返し処理を最後まで実行せず、途中で処理を抜ける方法を紹介します。そのためには、breakを使用します。下記のソースを見てください。
places = ["東京","神奈川","千葉","埼玉"] for place in places: if place == "神奈川": break print(place + "に行きました")
実行結果
先ほどとほぼ同じソースですが、4行目にif文が、5行目にbreakが記述されています。これは、「placeが神奈川だったら繰り返し処理を抜けろ」という意味です。従って、placesの1番目は「東京」なので1回目の繰り返しは実行されて6行目のprint文は実行されますが、placesの2番目が神奈川なので2回目の繰り返しの時点でbreakが実行され、繰り返し処理を抜けます。従って、実行すると「東京に行きました」と出力されるのみです。このように、特定の条件で繰り返し処理を抜けたいときにbreakが用いられます。
2-4.continueを用いて途中で処理を飛ばす
今度は繰り返し処理の途中で処理を飛ばしたい場合の記述方法を紹介します。そのためには、continueを使用します。以下のソースを見てください。
places = ["東京","神奈川","千葉","埼玉"] for place in places: if place == "神奈川": continue print(place + "に行きました")
実行結果
breakで紹介したソースとほぼ同じですが、今度は5行目にcontinueを使用しています。すると、1回目の繰り返し処理では6行目のprint文が実行されますが、2番目の繰り返しでplaceが神奈川のときにcontinueが実行されます。すると、6行目のprint文は飛ばされ、3回目の繰り返し処理に移ります。従って、実行結果は「東京に行きました」、「千葉に行きました」、「埼玉に行きました」の3行が出力されます。
2-5.elseを用いて繰り返し終了後の処理を記述する
繰り返し終了後に何らかの処理を実行したい場合、elseを用いれば可能です。以下のソースを見てください。
places = ["東京","神奈川","千葉","埼玉"] for place in places: print(place + "に行きました") else: print("繰り返し終了")
実行結果
ここでは、4行目のprint文を4回繰り返した後、5行目にelse:を挟んで6行目のprint文が実行されています。このように、繰り返し処理を記述した部分の直下にelse:と記述すれば、繰り返し処理終了後の処理を記述できます。ただし、breakで処理を抜けてしまうと、else:で記述した内容は実行されないので注意してください。
3.for文の様々な書き方
以上に記述したのがfor文の基本的な書き方となりますが、それ以外にもPythonでは様々な書き方を実現することができます。繰り返したい処理内容に応じて使い分けてください。
3-1.スライスを用いてオブジェクトの一部要素のみを取り出す
スライスを用いてオブジェクトの一部要素のみを取り出して繰り返し処理を実行する方法を紹介します。スライスとは、リストやタプルなどの一部分を、インデックスを指定して切り取る方法です。基本的な書き方は下記です。
obj[開始位置:終了位置:増分]
上記の書き方をすることで、開始位置から終了位置までの値を、何個おきに取得するかを指定することができます。尚、開始位置と終了位置はインデックスを指定するのですが、最初の値は0から始まることに注意してください。これを応用すれば、下記のような繰り返し処理を実現できます。
places = ["東京","神奈川","千葉","埼玉"] for place in places[0:3:2]: print(place + "に行きました")
実行結果
注目すべきは3行目のplaces[0:3:2]の部分です。これは、placesに格納されている最初の値からインデックス3に格納されている値を、増分2ずつ(つまり、1つおきに)取得して、その値を用いて繰り返し処理を実行しています。従って、placesの東京と千葉が取り出されて繰り返し処理が実行され、上記のような実行結果になります。以上のように、オブジェクトの一部要素を取得して繰り返し処理を実行したい場合、スライスを用いれば簡単に実行することができます。
3-2.range()関数で繰り返す回数を明示的に指定する
Pythonのfor文ではイテラブルオブジェクトを1つずつ取り出して繰り返すので、「何回繰り返すか」を指定したい場合はrange()関数を使用します。range()関数とは、連続した数値のオブジェクトを生成するための関数です。例えば、
range(5)
と記述すると、0~4までの5つの値を持つオブジェクトを生成できます。これを用いると、下記のような繰り返し処理を実現できます。
for i in range(5): print("Engineer.club")
実行結果
これは、1行目のinの後ろにrange(5)を指定しており、0~4までの5つの値を持つオブジェクトが生成されます。これによって、「Engineer.club」を出力される処理が5回繰り返されます。range()関数は、あくまでも連続した値を持つオブジェクトを生成するための関数なのですが、上記のように繰り返し処理に用いるオブジェクトにrange(5)を指定すると5回繰り返すことが可能なので、何回繰り返すかを明示的に指定したいときにrange()関数が用いられることが多いです。
3-3.zip()関数で複数のイテラブルオブジェクトを処理する
複数のイテラブルオブジェクトを同時に繰り返し処理に用いる簡単な方法があります。それは、zip()関数を用いることです。zip()関数は、複数のイテラブルオブジェクトをまとめることができる関数です。例えば、以下のように用います。
places = ["東京","神奈川","千葉","埼玉"] kanaPlaces = ["トウキョウ","カナガワ","チバ","サイタマ"] for place, kanaPlace in zip(places,kanaPlaces): print(place + "の読み方は" + kanaPlace + "です")
実行結果
これは、zip()関数内で指定されているplacesとkanaPlacesというオブジェクトに格納されている要素を1つずつ取り出しながら繰り返し処理を実行しているため、上記のような実行結果になります。このように、zip()関数を用いれば簡単に複数のイテラブルオブジェクトを同時に繰り返し処理に使用することができます。
3-4.enumerate()関数で要素とインデックスを同時に取得する
enumerate()関数は、指定されたイテラブルオブジェクトに対してインデックスを付与したイテラブルオブジェクトを生成する関数です。これも繰り返し処理に用いることが可能です。
places = ["東京","神奈川","千葉","埼玉"] for i, place in enumerate(places): print(i,place)
実行結果
enumerate(places)とすることで、変数iにインデックスが、placeに値が格納されて、それぞれ出力される処理が繰り返されます。尚、インデックスを取得するのですが、デフォルトだと初期値が0となってしまいます。このときに、enumerate(places,1)とすることで、初期値を1とすることが可能です。このことにより、下記のような処理を実現できます。
places = ["東京","神奈川","千葉","埼玉"] for i, place in enumerate(places,1): print(str(i) + "番目に" + place + "に行きました")
実行結果
0から始まるのでは不自然な場合でも、初期値を1にすれば上記のような処理が可能となります。このように、enumerate()関数を使えば要素とインデックスを簡単に取得して処理を行うことが可能です。
3-5.reversed()関数で要素を後ろから取得する
イテラブルオブジェクトの要素を先頭からではなく、後ろから取得したいときは、reversed()関数を用いれば簡単に実現できます。以下のソースを見てください。
places = ["東京","神奈川","千葉","埼玉"] for place in reversed(places): print(place + "に行きました")
実行結果
inの後ろにreversed(places)を指定することで、places内の要素を後ろから取得しています。そのため、最初に埼玉が表示され、最後に東京が表示されます。このように、イテラブルオブジェクトの要素を後ろから取得したいときは、reversed()関数を用いれば簡単に実現できます。
3-6.リストの中でfor文を実行する(リスト内包表記)
Pythonでは、リストの中でfor文を実行し、新しいリストを作成する「リスト内包表記」と呼ばれる書き方があります。基本的な書き方は下記です。
[処理 for 変数 in イテラブルオブジェクト]
通常のfor文と同じように、イテラブルオブジェクトに格納された値を1つずつ取り出して処理を行い、その結果を新しいリストを生成します。それを用いると、例えば以下のような処理を実現できます。
title = ["e","n","g","i","n","e","e","r","c","l","u","b"] upperTitle = [i.upper() for i in title] print(upperTitle)
実行結果
これは、2行目でtitleに格納された要素をすべて大文字にしてupperTitleに格納するという処理を行っています。3行目のprint文でupperTitleの要素を出力するとすべて大文字で出力されていることがわかります。このように、for文を用いて新たにリストを作成する処理はリスト内包表記を用いるとたった1行で作成できます。
4.さいごに
Pythonにおけるfor文の書き方と使用例を解説しました。これらだけではなく、紹介した例を組み合わせると実現できる処理の幅は無限に広がります。試行錯誤を繰り返すことによってスキルアップにつながるので、ぜひ様々な処理の仕方を試してみてください。
コメント