24: Python基礎文法【反復処理】を身につける

前回の続きです。

反復処理とはなにか

続いて反復処理でさらにプログラミングらしくしていきましょう。

反復処理というのは簡単に言えば繰り返し処理です。処理方法には2種類あり、for文とwhile文という2つがあります。

for文というのは、複数のデータを格納できる型、例えばリスト型とか辞書型とか文字列型などの複数のデータを格納できる型の要素を一つ一つ取り出し、順番に処理をしていく、というものです。

現実で例えると、出荷待ちの車をベルトコンベヤーで1台ずつ出荷する、といったことに例えられるかと思います。

例えば出荷待ちの車が倉庫の出荷待ちエリアに並んでいるとします。出荷のためのベルトコンベアーがあり、車を順次出荷していく。このベルトコンベアーがfor文に相当します。

もう一つのwhile文というのは、指定した条件が成り立っている間、つまりTrueの間処理を繰り返すというものです。

例えば指定した温度に達するまで動き続けるエアコンで考えます。

エアコンの温度を25度に設定し、部屋の温度が30度だった場合に、25度になるまでエアコンが動き続ける、そして温度が25度に達したら止まる。

このように、ある条件が成り立っている間は処理を繰り返す。条件を満たさなくなったら停止する、というように使います。

for文の文法と文字列、リスト、辞書を反復処理してみる

for文を詳しく見ていきます。

for文というのは複数のデータを格納できる型の要素をひとつひとつ取り出して順番に処理していくことです。

複数のデータを格納できる型にはいろいろあり、str型とかlist型とかdict型(辞書)、タプル型などいろいろなものがあります。

これら反復処理対象になるものをひっくるめてイテラブルと呼びます。

順次処理のことをループと言いますが、ループするということをイテレートと言います。

イテラブルをイテレートするといった言い方をします。

ちょっと呪文のようですね。

初めは慣れないと思いますが、次第に慣れていきましょう。

for文の文法

for文の文法ですが、次のように書きます。

for ループ中に使う変数名 in イテラブル:
    # 処理

forから始めて、ループ中に使う変数名を書き、in 「イテラブル」と書きます。

この「ループ中に使う変数名」には例えばリストから取り出されるひとつひとつの要素が変数名のところに入ります。一回ループするたび、この変数の中身が変わります。

先述のしたとおりイテラブルには、listとか辞書がはいります。

そしてPythonではブロック構造を表すときに末尾にコロンを使います。これはif文も同様でした。ループ中に行う処理はTabキーでインデントして記述します。

文字列をループする

それでは実際にいくつかの例でループしてみましょう。まずは文字列をループしてみます。

string = 'Python'
for s in string:
    print(s)

このコードを実行すると、

上の画像のようにひとつずつ文字を取り出すことができます。どういうことかというと、例えば

string = 'Python'
print(string[0])

このようにした場合には、Pythonという文字列の1文字目、インデックス0が取り出されますね。

ループ中はインデックスが一つづつ増え、順次取り出して実行しているというイメージを持っていただければと思います。(あくまでイメージです)

プログラムの動きを順に説明していきます。

string = 'Python'
for s in string:
    print(s)

1行目で、stringという変数の中にPythonという文字列を代入します。

2行目では、sという変数の中に最初はstringの変数の中に格納されている値、”P”がはいります。そしてprint関数でsの中にある”P”が表示されます。

次にはsという変数にPythonの二つ目の文字、”y”が代入され表示されます。このようにPythonという文字列が、ひとつひとつ変数sの中にはいり、そのたびに出力されます。

要素をひとつひとつ、倉庫からベルトコンベアーで取り出すように、順番に処理していくわけです。これがfor文です。

ブレイクポイントを置きながらデバッグ実行してみましょう。

リスト型をループする

次はlistをループしてみます。

days = ["Monday", "Thursday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]
for day in days:
    print(day)

MondayからSundayまで入ったリストをループしてみます。

そしてfor文で、ループ中にこのひとつひとつ取り出した値を呼びあらわすための”day”という変数を書きます。

これでデバッグ実行してみます。

そうするとまずdayにはMondayが入ります。

そして次のループではThursday、次のループではWednesdayと一回ループする度にひとつひとつ値が取り出されていきます。

辞書型をループする

では次は辞書をループしてみましょう。辞書をループするには色々なやり方があります。

fruits = {"apple": "りんご", "banana": "バナナ", "grape": "ぶどう", "orange": "オレンジ", "peach": "もも"}
for fruit in fruits:
    print(f"英語では{fruit}、日本語では{fruits[fruit]}となります。")

実行結果は、下記のようになります。

この「日本語では」の波括弧の中がわかりにくいかもしれませんが、次のコードと同じ考え方です。

print(fruits["apple"])

“apple”はキーですから、[“apple”]と指定するとバリューである日本語名が表示されます。

このような処理をループ中に行っています。

一つ注目していただきたいのは、このように辞書をループした場合ひとつひとつ取り出した時変数には何が入るかというと、キーが入ります。

ループ中に辞書型から値を取り出す

それではキーではなくて値を取り出したい、バリューを取り出したいという時はどうするか?

この時には、辞書型のvaluesメソッドを使用します。

fruits = {"apple": "りんご", "banana": "バナナ", "grape": "ぶどう", "orange": "オレンジ", "peach": "もも"}
for fruit in fruits.values():
    print(fruit)

こうするとキーではなく、バリューを取り出せます。

では、最後にキーとバリューのペアを取り出してループする、といったことをやります。

この場合は、itemsメソッドを使います。

ループ中に使う変数がen_name, jp_nameになっていることに注目してください。

fruits = {"apple": "りんご", "banana": "バナナ", "grape": "ぶどう", "orange": "オレンジ", "peach": "もも"}
for en_name, jp_name in fruits.items():
    print(f"{en_name}は日本語で{jp_name}です。")

これで実行してみます。

すると画像のようにキーと値をそれぞれ別々の変数で呼び表すことができます。

さきほどは以下のように書いて、キーと値を取り出していましたが、この書き方ではなくて、itemsというメソッドを使用してもそれぞれキーとvaluesをセットで取り出すことができます。

fruits[fruit]

デバック実行してみますと、まずen_nameにはapple、jp_nameにはりんごが入り、次のループでは、bananaと日本語のバナナ、次のループでは、bananaとぶどうというふうにそれぞれタプルが返ってきます。

評価ウインドウをみてみましょう。fruits.items()とした場合は何が返ってきているか? (評価ウィンドウはWindowsはAlt+F8、MacはOpt+F8で起動します)

ちょっと見にくいかもしれませんが、丸括弧で囲われたものはタプルです。appleとリンゴというセットで取り出せていますね。

このセットの中身をそれぞれ en_name, jp_name という変数で呼び出して表示しているということになります。

タプル型の復習

タプルの挙動を思い出していただきたいので、もう一回振り返りでやりますが、タプルによる多重代入というものを以前扱いました。

それをちょっと振り返り、復習でやってみます。

a, b = ("apple", "りんご")
print(a, b)

この丸括弧で囲んだ部分がタプルです。

で、実行すると、appleと日本語のりんごが返ってきます。このように、a, b = タプル とやると、多重代入できます。

ですから、items()メソッドを使った場合、タプルが返ってきますので、タプルの最初の要素はキーである”apple”でen_nameに代入されます。jp_nameにはタプルの2番目の要素”りんご”が入ります。

まとめ

今回のまとめです。

for文は、複数のデータを格納できる型の要素をひとつひとつ取り出して順番に処理していくことができます。

複数のデータを格納できる型には、str型、list型、dict型などいろいろあります。

この複数のデータを格納できる型、ループで回せるものたちをひっくるめてイテラブルなんて呼びます。そしてループすることをイテレートという言い方をします。

文字列をループした場合は1文字ずつ取り出されます。

リストの場合は、要素のひとつひとつを順番に取り出していきます。

辞書の場合、特に何も指定しない場合はキーが取り出されます。

バリューだけ取り出したい場合はvalues()を使用します。

キーとバリューのペアを取り出した場合は、items()を使用します。タプルが返ってきますので、それぞれ多重代入で受け取って利用します。

for文はプログラミングにおいて非常によく使いますので、ぜひあなたご自身で何度も練習して身につけるようにしてください。