foreach とは、スクリプト言語のなかでよく使われている繰り返し文です。配列から中身を取り出して、繰り返し処理したいときにとてもよく使われます。
スクリプト言語を使うときは、たいてい一律にまとまった処理をさせたいことが多いので、繰り返し文をマスターする事が出来れば、作業性も大幅アップ間違いなしです。
まず最初に、スクリプト言語の代表格であるperl でちょっとした foreach 文を書いてみましょう。
my @sports = ("baseball", "tennis", "soccer", "volleyball"); foreach my $name (@sports){ print "$name\n" } $ perl foreach.pl baseball tennis soccer volleyball
foreach文のなかで、 sports という配列の1番目からアクセスして、一番最後の要素にたどり着くまで、要素の表示をひたすら実行しています。
python でforeach をやってみよう
それでは、さっそく python で foreach にトライしてみましょう!
と言ったものの、実はpython に foreach という名の関数がありません。
ではどうすればいいかというと、for 文がその代理を果たしてくれます。
では具体的に書いてみましょう。
>>> sports = ["baseball", "tennis", "soccer", "volleyball"] >>> for name in sports: ... print name ... baseball tennis soccer volleyball
このように、foreach とほとんど同じような記述で、python でも繰り返し文を実行する事が出来ますね。
For文のTips: foreach の感覚でさらに便利な使い方をマスター
配列の中身を逆順に表示させたい
これまでのperl などでのスクリプト言語で配列の中身を逆順に表示させようと思うと、
・一度配列を逆順に詰め直してそれを表示する、
・配列の番号を取得してそれを後ろの番号からアクセスする、
といった方法がありますが色々と手間ですよね。このような方法をとらずに、簡単に行う事が出来る例を示しましょう。
>>> sports = ["baseball", "tennis", "soccer", "volleyball"] >>> for name in reversed(sports): ... print name ... volleyball soccer tennis baseball
このように読み込ませる配列に reversed() をつけるだけで簡単に逆順に出来ます。
配列の中身を昇順に表示させたい
ばらばらの数字が入った配列を昇順に表示させたいと思う事があるでしょう。
そのときは以下のようにしてみましょう。
>>> numbers = [8, 2, 7, 4, 3] >>> for num in sorted(numbers): ... print num ... 2 3 4 7 8
このようにsorted 関数を用いる事で簡単に並び替える事が出来ます。
配列の中身を降順に表示させたい
先ほどの例では、昇順に表示させていました。ただ場合によっては、逆に降順に並び替えたいということもあるでしょう。
その場合は以下のように書く事が出来ます。
>>> sports = ["baseball", "tennis", "soccer", "volleyball"] >>> for num in sorted(numbers, reverse=True): ... print num ... 8 7 4 3 2 >>> sorted 関数の reverse というキーワードを True に設定する事で降順にする事が出来ます。要素の番号を知りたい
今アクセスしている配列要素の番号を知りたいときがあると思います。そういったときには2通りの方法があります。 ・range 関数を使った方法>>> sports = ["baseball", "tennis", "soccer", "volleyball"] >>> for i in range(0, len(sports)): ... print i, sports[i] ... 0 baseball 1 tennis 2 soccer 3 volleyballこれはC言語チックな感じですね。range関数を使って、アクセスする配列の要素番号を決定するやりかたです。正しいやり方ですが、少しめんどくさいですよね。
今回で学んだように foreach チックに楽に進めてみたいという方は次のやり方を試してみてはどうでしょう。
・enumerate 関数を使った方法>>> sports = ["baseball", "tennis", "soccer", "volleyball"] >>> for i, name in enumerate(sports): ... print i, name ... 0 baseball 1 tennis 2 soccer 3 volleyballさっきのrange関数を使ったのとは違って、どこからどこまで配列を表示する、といった記述をすることなく、さっぱりした記述で書けるのがいいですね。
2つの配列をまとめて、表示したい
配列が2つあったときに、その配列をまとめて処理したいときは、zip関数を使うと便利です。
例は以下のような感じです。>>> sports = ["baseball", "tennis", "soccer", "volleyball"] >>> people = ["Ichiro", "Nishikori", "Nakata"] >>> for name, person in zip(sports, people): ... print name, person ... baseball Ichiro tennis Nishikori soccer Nakataここでミソなのは、配列の要素の個数が違っていても、短い方に自動的に合わせて処理してくれるのがいいですね。
おわりに
for文を foreach のように使うやり方を紹介しました。
for文を書くときに、書き方次第でとても簡単に書けることができるとわかったと思います。
知っているのと知っていないとでは、個人的には天と地の差があるように思います。
また今回の例とはとても簡単でしたが、実際の場面でプログラムを書いていくと複雑奇怪なものになって行きがちです。
そのときは完成したと思っても、よくよく見返すと間違っていたり、自分でも何を書いたのかわからなくなったりします。
今回学んだような書き方を習得できれば、少しでも簡潔に記述できるのでその後のデバッグがとても楽になると思います。