Pythonをこれから始めようとする人、又は始めたばかりの人に向けて、for 文の使い方を解説します。
前半はエッセンスだけまとめていますので、忘れた部分を思い出すためにお使い下さい。
後半はfor 文について詳しく説明していますので、for文について不安がある方は最後までお読みください。
for 文については他のサイトで数多く解説されていますが、具体的な応用事例はあまり紹介されていないようですので、この記事ではその辺についても触れるようにしています。
for文の基本形
for文はループ処理(繰り返し処理)を行うものですが、 Pythonの for文は配列の先頭から順に要素を取り出す仕組みだと考えた方が分かりやすいかと思います。
forループは、in の後に指定した配列データの先頭から、1つづつ要素を取り出して変数 X に格納してくれます。
for ループ内の処理は、この x という変数に格納された値を使って処理を行います。
ループの回数を指定するRange関数
for ループは配列のデータから値を取り出すことしか出来ませんので、指定した回数だけループさせるには、その分の配列が必要になります。
実は、ループを回すのに必要な配列を、簡単に生成してくれる range 関数が用意されており、通常はこれを使います。
指定した回数だけ単純にループする
例えば10回とか100回とか、単純に指定した回数だけループさせたい場合は、range関数に回数を指定します。
例えば、100回ループを回す場合は、次の様に記述できます。
for x in range(100): print(x)
range(100) により配列の要素は100個作成されますが、各要素に格納される値は0から始まるため、先頭から順に0,1,2,3,4 ・・・99 の値が格納されます。
開始と終了の値を指定してループする
単純なループ回数ではなく、例えば 5から始まり10までの数値を使いたい(要素の値に意味がある)場合)は、rangeに開始と終了の値を指定できます。
例えば、10から100 までの値を使いたい場合は次の様に記述します。
for x in range(10,100): print(x)
この場合、先頭の要素は 5 から始まり、99までの値が格納された95個の要素を持つ配列が生成されます。
開始と終了の値を、飛び飛びでループする
先ほどは開始と終了だけでしたが、例えば5~10までの間を2個飛びでループしたい場合は、3番目の引数にステップ数を指定できます。
配列に格納される値は飛び飛びになるので、その分作成される配列の要素数は減ります。
例えば、10から100までの間、3個置きの値が使いたい場合は次の様になります。
for x in range(10,100,3): print(x)
この場合、先頭の要素が 5 から始まり、続けて 8,11,14,・・・98 までの値を持つ、合計32個の配列が生成されます。
配列に連番を付与してくれる enumerate 関数
range関数は引数に指定した範囲で整数値の配列を生成してくれるものでした。
enumerate関数は、引数に渡された配列に対して、連番を自動生成してくれる便利な関数です。
enumerate(配列構造のデータ,連番の開始番号)
第一引数に「配列構造のデータ」、第2引数に「連番の開始番号」を指定することが可能で、第2引数は省略可能(省略した場合は連番が0から開始)されます。
for の直後に n と x の変数が記述されていますが、n に連番が格納されます。
data = ['dog','cat','tiger','rat'] for n,x in enumerate(data) : print('{0}-{1}'.format(n,x))
複数の配列を1つにまとめてループできる zip 関数
例えば、とあるペットショップで売られている動物について、英語表記、日本語表記、購入ポイントの一覧を作ることを考えます。
英語表記、日本語表記、購入ポイントのデータをそれぞれ eng , jp , point という名前の配列に格納して、for ループで print するような場合、次の様な処理を書けば実現できます。
eng = ['dog','cat','tiger','rat'] jp = ['犬','猫','虎','ネズミ'] point = [10,20,100,3] for i int range(len(eng)): print('{0}-{1}-{2}'.format(x[i],y[i],z[i]))
このような場合、Python では zip関数を使って eng , jp , point という3つの配列を1つにまとめておいて、for ループで処理することが可能です。
纏める方法は簡単で、zip 関数の引数に配列構造のデータを指定してあげればOKです。
zip(eng,jp,point)
zip でまとめた配列構造のデータは、for の後に変数を羅列するだけで、簡単に forループ内で値を参照することが可能になります。
尚、zip に渡す配列構造のデータは、全て同じ個数の要素を持つことが前提です。
もし、要素数が異なるものが指定された場合、一番少ない要素数の数でループが行われます。
zip を使って先ほどのプログラムを書き直すと次の様になります。
eng = ['dog','cat','tiger','rat'] jp = ['犬','猫','虎','ネズミ'] point = [10,20,100,3] for x,y,z in zip(eng,jp,point) : print('{0}-{1}-{2}'.format(x,y,z))
zip を使うことで、少しだけスッキリと書くことが可能になります。
この例は1か所しか値を参照していないため、それほど zip のメリットはありませんが、参照箇所が多くなほど zip の便利さが実感できるでしょう。
ループの先頭に戻る continue 文
for の中に continue を記述すると、それが実行された時点で後続の処理をスキップし、for ループの先頭に戻ります。
下記の例は x に 0~9 の値が順次渡される for ループですが、x % 2 (x を2で割った余りを求める式)を if文 の条件に指定することで、偶数のみ print するようにしています。
if文 の条件式に計算式を指定した場合、 1以上なら True 、0 なら False と解釈されるため、x % 5 の結果が奇数の場合は continue により後続の処理である print(x) がスキップされ、結果的に偶数の値だけが print されます。
for x in range(0,10) : if x % 2 : continue print(x)
ループから抜ける break 文
for の中に break を記述すると、それが実行された時点で処理を中断し、for ループから抜けます。
下記は x に 0~9 の値が順次渡される for ループ内に掛かれた if 文で、x % 2 (x を2で割った余りを求める式)の結果が 1 (True)になったら break 文を実行する例です。
この場合、x が 0 の場合は print(x) が実行されますが、x が 1になると if 文に指定した x % 2 が1(True)似なるため break 文が実行されます。
この結果、ループ処理がそこで中断されるため、print(x) は1回だけ実行されるという結果になります。
for x in range(0,10) : if x % 2 : break print(x)
for が 終了した直後に実行される else 文
for の else 文は 、for ループが終了した直後に実行させたい処理を記述します。
但し、break 文で for ループを抜けた場合、 else に記述した処理は実行されないので、あくまでも「 ループ処理の一部として最後に実行される」と考えた方が分かりやすいでしょう。
for x in range(0,10) : if x % 2 : print(x) else: print('終了')
for の else 文は C# や Java など、他の言語には存在しない Python 特有のものなので、通常はあまり使われません。
まとめ
今回は python の for 文について、良く使われるものを紹介しました。
for は 配列構造のデータ(リスト、タプルなど)から1つづつ要素を取り出し、取り出すものが無くなるまでループ処理を行うものです。
指定した回数だけループさせたい場合は、range 関数の引数に回数を指定することで実現できます。
これ以外にも、enumrate や zip などの関数が用意されていて、for ループと組み合わせることでプログラムをスッキリ記述することが可能になります。
また、for ループの先頭に戻る continue 文や、for ループを途中で中断する break文が用意されていて、ループ内で特定の条件を満たした時、後続の処理をスキップさせたり、ループから抜けたい場合に利用します。
if 文と並んで for文は非常によく使いますので、使い方を是非マスターして下さい。
今回の記事が参考になれば幸いです。