PHPしか知らない僕がPythonを少し触ってみたよ 〜How do you do foreach?〜

この記事はだいぶ前に書かれたものなので情報が古いかもしれません
無限ループするトランプ大統領

この記事を三行にまとめると

Pythonにはforeach文がない
インデックスが取れる
慣れちゃえばたいしたことないと思う
今日もループの話です。前回触れなかったPHPで言うところのforeach文に関する部分です。

前回も言いましたがPythonにはforeach文がないので、リストやディクショナリの繰り返し処理もfor文で行うことになります。



リストのfor文

まずは一番基本の形ってことでリストをfor文で回してみます。

//PHP
$array = array(1,2,3,4,5);
foreach($array as $v) {
  echo $v;
}

#Python
array = [1,2,3,4,5]
for v in array:
  print(v)

特に変則的な書き方をする必要はないです。通常のfor文の書き方で問題ない。



インデックスが欲しい場合

先ほどのfor文だと要素しか取得できません。PHPのforeachではキーも一緒に取ることができますけど、同じようにfor文の中でリストのインデックスが欲しい場合は「enumerate()」という関数が必要になります。

//PHP
$array = array(1,2,3,4,5);
foreach($array as $k => $v) {
  echo $k.':'.$v;
}

#Python
array = [1,2,3,4,5]
for k, v in enumerate(array):
  print(str(k) + ':' + str(v))

enumerate()を使わずに「for k, v in array」とやるとエラーになります。

enumerateっていうのは……何でしょうね。日本語でいうと数えるみたいな意味ですが、これを使うことでループ中に今何番目か数えてくれるようになる、みたいなことなんですかね。



ディクショナリのfor文

ディクショナリにもfor文は使えますが、リストと全く同じ感覚で使おうとするといろいろややこしいことになる。

array = {'1':'a', '2':'b', '3':'c'}
for v in array:
  print(v)

こんな感じにループさせることはできるのですが、この書き方だと取得できるのは要素ではなくキーの方です。つまりvの中には1、2、3が入ってくる。aやbは取れない。

要素が欲しい場合は「values()」を使って要素のリストをfor文で回す必要があります。

array = {'1':'a', '2':'b', '3':'c'}
for v in array.values():
  print(v)

これならa、b、cを取得できます。ただし順番通りに取得できるとは限らないので、取得する順番も大事な場合は「OrderedDict」で辞書を作成しておく必要がある。

順番の保持うんぬんって話については以前にも書いたのでこちらにて。
配列の基礎



キーも欲しい場合

キーと要素が両方欲しい場合は「values()」ではなく「items()」を使います。

array = {'1':'a', '2':'b', '3':'c'}
for k, v in array.items():
  print(k + ':' + v)

この場合はenumerate()は使わなくても大丈夫です。enumerate()はインデックスを取得するために使用するものなので、for文で辞書を回す際にenumerate()を使っても取れるのは0からの連番だけです。






慣れちゃえばたいしたことないと思うのですが、PHPのforeach文だと一通りのパターンで済むから、書き方がいくつかあることに若干戸惑いました。

PHPのforeach文よりも便利だなって思うのはインデックスが取れるところでしょうか。foreachは今がループの何番目か知りたきゃ自分でコード書く必要があるからな……イテレータのどうにかするクラスがあったような気がするけど。



その他のPythonを少し触ってみたの記事はこちら
前書きと索引的な
 もしかしたら何か関連しているかも? 
 質問や感想などお気軽にコメントしてください