条件が成立する時に反復処理(イテレーション)をするのにwhileを使った処理をみてきましたが、反復処理が可能(イテラブル)なオブジェクト(文字列、リスト、タプル、辞書など)を使って繰り返し処理をするにはfor文を利用します。
ここではPythonのforループの処理をみていこうと思います。
for-in文でループ処理をする
Pythonでfor文を使ってループ処理のコードを書くには、forの後ろに繰り返し変数を置きます。続けてinキーワードを置いて後ろにリストなどのシーケンスを記入し、末尾にコロン(:)を置きます。その行の下にインデントで字下げして、繰り返し処理をするコードをブロックとして記述します。
形としては次のようになります。
for 繰り返し変数 in シーケンス:
実行コード
for文を使う前に、一度while文のコードを見ておこうと思います。
while文とfor文
wihleを使ってリストから取り出すコードを書いてみます。
gundam_list = ["EXIA","DYNAMES","KYRIOS","VIRTUE"]
i = 0
while i < len(gundam_list):
print(gundam_list[i])
i += 1
リストの中にガンダムが格納されています(笑)
これを1機ずつwhileを使って取り出しているコードです。Atomで実行するとこうなります。ファイル名はfor.pyにしています。
ガンダムが1機ずつ出撃しているのがわかります(笑)
冗談はこのくらいにしておきましょう。
このwhileを使ったコードをfor文で書いてみるとこうなります。
gundam_list = ["EXIA","DYNAMES","KYRIOS","VIRTUE"]
for i in gundam_list:
print(i)
とてもスッキリした形になりました。変数iを繰り返し変数として用意し、リストから一つずつ取り出してprintで出力という形になっています。
コードを実行するとこうなります。
while文で書いたコードを#でコメントアウトして比較してみることができるようにしてみました。
結果は一緒になっていますね。
今度は文字列をシーケンスとして利用してみます。
for s in "Python":
print(s)
対話型シェルで実行してみます。
「python」という文字列を繰り返し変数をsとして、1文字ずつ取り出しているのがわかります。
for文とbreakでループを抜ける
for文でも、whileと同様にbreakを使って途中でループ処理を抜けることができます。
上のコード例を書き換えてみましょう。
for s in "Python":
if s == "h":
break
print(s)
文字列がhの時にループから抜ける処理をしています。実行するとこうなります。
途中で処理が中断しているのがわかります。
for文とcontinueで処理をスキップ
同様にcontinueを使って処理をスキップして再度繰り返し処理に戻ることもできます。
同様にコードを書き換えてみるとこうなります。
for s in "Python":
if s == "h":
continue
print(s)
実行するとこうなります。
指定した文字列hのところだけ処理がスキップされて文字列が1文字ずつ出力されているのがわかります。
for文のelseとbreak
for文もwhileループと同じように、処理が終わったら何か別の処理をする場合にelseと組み合わせることができます。
次のようにelse文を最後に付け加えるだけです。
gundam_list = ["EXIA","DYNAMES","KYRIOS","VIRTUE"]
for i in gundam_list:
print(i)
else:
print("TRANS-AM!")
実行するとこうなります。
モビルスーツを全部取り出した(ループ処理終了)後ろにトランザムが発動(else文以下の処理)しています(笑)
これもbreak文と組み合わせるとどうなるでしょうか。
以下のように書き換えてみます。
gundam_list = ["EXIA","DYNAMES","KYRIOS","VIRTUE"]
for i in gundam_list:
if i == "KYRIOS":
break
print(i)
else:
print("TRANS-AM!")
実行するとこうなります。
breakでループを抜けると、elseでの処理は実行されていません。このような処理はbreakが実行されなかった場合をelse文でチェックするような時に利用します。
for文と辞書 – values()、items()
辞書型のデータをfor文で処理する場合を見てみましょう。
次のような辞書型データを用意してfor文で処理してみましょう。
foods = {"breakfast":"miso soup", "lunch":"sandwich", "dinner":"steak"}
for food in foods:
print(food)
コードを実行するとこうなります。
printで出力されているものは、辞書のキーの部分です。このように、辞書型をfor文で処理するとキーが処理されます。
このコードは次のように辞書型データの後に.keys()を使った処理と同じです。
foods = {"breakfast":"miso soup", "lunch":"sandwich", "dinner":"steak"}
for food in foods.keys():
print(food)
for文で辞書をそのまま使っても、keys()を使っても結果はどちらもキーが取り出されるということになります。
for文と辞書とvalues()
辞書のキーではなく値を反復処理したい場合はvalues()関数を使います。
上のコードを書き換えるとこうなります。辞書.values()で使います。
foods = {"breakfast":"miso soup", "lunch":"sandwich", "dinner":"steak"}
for food in foods.values():
print(food)
コードを実行してみましょう。
辞書のキーではなく、値の方が取り出されているのがわかります。
for文と辞書とitems()
キーと値をセットでタプルの形で反復処理する場合はitems()関数を使います。
コードをitems()を使って書き換えるとこうなります。辞書.items()で使います。
foods = {"breakfast":"miso soup", "lunch":"sandwich", "dinner":"steak"}
for food in foods.items():
print(food)
コードを実行してみましょう。
タプルの形で出力処理されているのがわかりますね。
このタプルを使ってそれぞれの変数に代入して処理するような作業を次のようなコードで書くことができます。
foods = {"breakfast":"miso soup", "lunch":"sandwich", "dinner":"steak"}
for food, menu in foods.items():
print("Yesterday, I had", menu, "for", food, end=".\n")
変数を二つ用意してキーと値をそれぞれ代入する処理です。ピリオドを文末にスペース無しで改行して出力するために、print()関数のendオプションも使っています。
実行するとこうなります。
それぞれキーと値が対応した位置に出力されているのがわかります。
まとめ
Pythonの反復処理にはwhile文以外にもfor文があります。
forに続けて繰り返し変数を用意し、続けてinキーワードを置きます。その後にリストや文字列、辞書などのシーケンスを置き文末にコロンを書きます。インデントしたブロックに処理を記述します。
break文で処理を抜けることができ、continue文で処理をスキップすることができます。else文を使って反復処理終了後の処理を記述したり、break実行のチェックをすることができます。
辞書型をそのままfor文で処理すると、キーが扱われます。keys()を利用することと同じです。
辞書型の値を利用したい場合は、values()関数を使います。キーと値をセットで利用する場合はitems()関数を使ってタプルで抜き出すことができます。