Pythonのfor文を使うには
for文は、プログラミング言語の中で反復処理を行うための言語仕様です。Pythonにおいても、反復処理のためにfor文が定義されています。ここでは、反復処理で使う関数や手順を中心にサンプルコードを用いて解説していきます。
反復処理とは
反復処理とは、特定の条件で終了するループ構造を取る処理を指します。Pythonの反復処理の構文には、代表的なものとして条件分岐を実行するif文、式が真である間、実行を繰り返すwhile文、オブジェクトの要素に従って実行するfor文などがあります。
【参考】:Python: Python 言語リファレンス 複合文 (compound statement)
Pythonのfor文の使い方
Pythonのfor文は、変数に静的なタプルや動的なリストなどのイテラブルオブジェクトを取り込んで使用します。イテラブルとは順番に取り出せるオブジェクトで、for文などの反復処理で使用する他のプログラミング言語の変数配列のようなイメージです。
ここからは、実際にサンプルコードを用いて解説します。
【参考】:Python: Python 言語リファレンス for 文
for文の文法と使い方
for文の文法は、簡単に”for i in list:”などと記します。このPythonで用いるiとは、カウンターを意味するもので、正確には、次のように表すことができます。
for 変数 in イテラブルオブジェクト :
コード
for文で用いるイテラブルオブジェクトには、タプルやリストなどのオブジェクトを使用します。
タプルは、変更不可の静的な配列のデータ型を持つオブジェクトで、イミュータブル(変更不可)と呼ばれます。リストは、動的に変更可能な配列のデータ型を持つオブジェクトで、こちらはミュータブル(変更可能)と呼ばれます。
for文を実際に使ってみる
ここで実際に、for文を使ってみましょう。イテラブルオブジェクトには、タプルとリストそれぞれを使ってみます。
タプルの例では、数字を代入していますが、静的であり値の変更はできません。リストの例では、文字列を用いており、変更可能です。文字列はシングルクォーテーション、またはダブルクォーテーションいずれかを用い、違いはありません。
# タプルの例
number = (1, 2, 3, 4, 5)
print ("タプル=", number)
for i in number:
print (i)
# リストの例
favorite = ["apple", "banana", "chocolate"]
print ("リスト=", favorite)
for i in favorite:
print (i)
実行結果は、次の通りです。
タプル= (1, 2, 3, 4, 5)
1
2
3
4
5
リスト= ['apple', 'banana', 'chocolate']
apple
banana
chocolate
このように、for文は、タプルやリストに格納された値を順に取り出し、利用することができます。
for文をさらに使いこなす
Pythonのfor文は単純ではあるものの、他のプログラミング言語と違い初期値を設定したり、ループ回数を指定したりすることはそのままではできません。ここからは、for文を使いこなすための関数や手続きなどを学びます。
range関数の概要と使い方
range関数を使用すると、C言語などのように変数の初期値(開始値)や加算値、終了条件(終了値)などを設定することができます。この関数は、for文の反復処理ループを制御することを目的として実装されています。
使い方は次の通りです。
range(終了値)
range(開始値、終了値[、加算値])
加算値は省略可能で、省略した場合は値が1つずつ加算されます。終了値のみ指定した場合は、開始値が0で、1つずつ加算されます。1から始める場合は、終了値だけでなく開始値と終了値を指定します。終了値は、終わりとして識別され、反復処理ループの終了条件となります。
【参考】:Python: Python 言語リファレンス range
range関数でfor文を使ってみる
ここでは、実際にrange関数を使用してfor文を使ってみます。加算値は正が加算、負が減算に対応します。
サンプル1は、0〜4の5つの変数(ターゲット)の値を示します。サンプル2は、 1〜9まで2つずつ加算し、表示します。サンプル3は、5~(-4)まで1つずつ減算します。指定した終了値は、反復処理に含まれません。
# 1: 終了値のみ指定
print("サンプル1")
for i in range(5):
print("1", i)
# 2: 1~9まで2つずつ加算
print("サンプル2")
for i in range(1,10,2):
print("2", i)
# 3: 5~(-4)まで1つずつ減算
print("サンプル3")
for i in range(5,-5,-1):
print("3", i)
実行結果は、次の通りです。
サンプル1
0
1
2
3
4
サンプル2
1
3
5
7
9
サンプル3
5
4
3
2
1
0
-1
-2
-3
-4
このように、range関数で自由にカウンターを設定できますので、ほとんどの処理はこの関数で足りるでしょう。
反復処理を処理に応じて変更する
先ほどのrange関数で、ほとんどの処理にfor文を使用することができます。ここでは反復処理のループから条件に応じて抜けだしたり、次の処理にスキップしたりする方法を学びます。
反復処理ループから抜けるには、break文を用います。ここでは、自分の作成したmyfunc関数の戻り値を調べて、-1の場合はエラーとしてループから抜け出すサンプルです。
for i in range(10):
ret = myfunc(i)
if ret == -1:
break
print(i, ret)
【参考】:Python: Python 言語リファレンス break文
続いて、反復処理ループを条件に応じてスキップする場合には、continue文を用います。ここでは、自分の作成したmyfunc関数の戻り値を調べて、99の場合は除外する値としてループをスキップし、次のfor文を続けるサンプルです。
for i in range(10):
ret = myfunc(i)
if ret == 99:
continue
print(i, ret)
【参考】:Python: Python 言語リファレンス continue文
break文とcontinue文の違いは、for文の反復処理ループから抜けるのか続けるのかの違いです。break文は、for文のループから抜け出して次のステップに進みますが、continue文は、for文の先頭に戻って、次のループすなわちrange関数の加算(または減算)を行って次の処理が始まります。
for文で文字列を扱う
for文で文字列をイテレータに用いると、文字列の要素を個々の要素に分解してくれます。つまり、文字列を単一の文字に分解して扱うことができます。文字列の区切り文字を識別したり変更したりする場合などに用います。
ここでは、”Hello World”をイテレータとして変数に渡して、表示させてみます。
strings="Hello World"
for i in strings:
print(i)
サンプルコードは、単純に変数を表示するだけですが、実行結果を見ると単一の文字単位で表示されていることがわかります。
H
e
l
l
o
W
o
r
l
d
反復処理を高速化する
for文などで用いる反復処理は、何度もコードを実行するため少しのオーバーヘッドでも、処理時間の累積によってスローダウンを引き起こす場合もあります。反復処理ループの内部は、簡潔に記述し使用する関数もオーバーヘッドの少ないものを採用するなどの工夫が必要です。
ループ内で使用するアルゴリズムによっても実行速度の違いが生じますので、コードの実行結果を比較して最良のコードを選択するのが良いでしょう。
Pythonのfor文は手軽に使える
Pythonは、簡単にコード作成ができるプログラミング言語です。for文はほとんどのプログラムコードで使用します。想定通りに動作した場合は、その処理をライブラリ化するなど、基本を理解して活用の幅を広げていくと良いでしょう。
編集部オススメコンテンツ
アンドエンジニアへの取材依頼、情報提供などはこちらから