PHPしか知らない僕がPythonを少し触ってみたよ 〜永久不変のループループ〜

この記事はだいぶ前に書かれたものなので情報が古いかもしれません
オペレーション・ループループを発動する

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

繰り返し処理について見ていきたい
for文とwhile文について触れておこう
電話レンジ(仮)とは一切何の関係もない
今日から何回かに分けて絶望的な未来を変えるために何度も過去へのタイムスリップを繰り返す一人の男の物語……つまり繰り返し処理について見ていきたいと思います。

Pythonにはforeach文がないのでPHPのforeach文に相当する処理もfor文で行うことになりますが、いろいろとパターンが多いっぽいのでforeachは次回に回します。あとcontinueやbreakも必ずしもPHPと同じように書けるわけではないようなので、また改めてやります。今日はPHP的なfor文とwhile文をPythonでやってみましょう。



基本的なfor文

ループの基本といえばfor文っすね。まずは一番シンプルに10回のループ処理を行うようなfor文を作ってみましょう。

//PHP
for($i = 0; $i < 10; $i++) {
  echo $i;
}

#Python
for i in range(10):
  print(i)

Pythonには「range()」という関数があります。これは電話レンジ(仮)のようなSF的な機能ではなく、数列を作成する関数です。上記のように「range(10)」と書いた場合は「0〜9」までの整数の数列が生成されます。

Pythonではfor文にかっこを使いません。for文やif文のネストの書き方について疑問がある場合はこちらをご確認くだせえ。
ネストについて



初期値や変化値を変える

range()関数は初期値や変化数(ステップ数)も指定できます。

例えば5〜10を出力するfor文を書きたいならこんな感じ。

//PHP
for($i = 5; $i <= 10; $i++) {
  echo $i;
}

#Python
for i in range(5, 11):
  print(i)

ちょいややこしいかもですが、「range(5, 10)」としてしまうと5〜9までの数列ができてしまうので、10も含めるには「range(5, 11)」とする必要があります。

では次は、1〜10のうち、奇数だけを表示するfor文を書いてみます。

//PHP
for($i = 1; $i <= 10; $i += 2) {
  echo $i;
}

#Python
for i in range(1, 11, 2):
  print(i)

range()は3番目の引数にステップ数をセットすることができます。今回の場合だと数字を2ずつ変化させる感じ。PHPのfor文で$iを2ずつ増やすのと同じ動きですね。



数を減らす

では今度は「10 → 1」に向かって数を減らしていく場合を考えてみます。

//PHP
for($i = 10; $i > 0; $i--) {
  echo $i;
}

#Python
for i in range(10, 0, -1):
  print(i)

range()関数で初期値を10にして1ずつ減らすというやり方です。

同じ要領で、2ずつ減らすならこう。

//PHP
for($i = 10; $i > 0; $i -= 2) {
  echo $i;
}

#Python
for i in range(10, 0, -2):
  print(i)



複数の変数を使ったfor文

PHPのfor文には二つ以上の変数を同時に扱うことができますが、Pythonでもそれは可能です。

//PHP
for($i = 1, $j = 1; $i <= 10, $j <= 20; $i++, $j += 2) {
  echo $i.','.$j;
}

#Python
for i, j in zip(range(1, 11), range(1, 21, 2)):
  print(str(i) + ',' + str(j))

上記のコードはどちらも「1〜10」と「1〜20の奇数」を出力するfor文です。

Pythonでは「zip()」という関数を使うことで複数の数列などを一挙に扱うことができます。

気をつけたいこととしては、zip()はループする回数は一番少ないものに依存する点ですかね。

for i, j in zip(range(10), range(5, 0, -1)):
  print(str(i) + ',' + str(j))

#出力結果
0,5 
1,4 
2,3 
3,2 
4,1

例えばこれだと、先頭の「range(10)」は本来10回分のループをするはずですが、二番目の「range(5, 0, -1)」が5回分しかループしないため、このfor分自体が5回しかループしません。



while文の基本

次はwhile文についてです。1〜10までを表示するwhile文を書いてみます。

//PHP
$i = 1;
while($i <= 10) {
  echo $i;
  $i++;
}

#Python
i = 1
while i <= 10:
  print(i)
  i += 1

基本的な書き方は一緒ですね。「i++」という書き方はPythonではできないので「i += 1」とか「i = i + 1」とかでインクリメントする必要があります。



条件式にリストは使える?

配列やリストをwhile文で回したい場合。

例えばPHPならこんな書き方ができます。

//eachを使う
$array = array(1, 2, 3, 4, 5);
while(list($k, $i) = each($array)) {
  echo $i;
}

//array_shiftを使う
$array = array(1, 2, 3, 4, 5);
while($i = array_shift($array)) {
  echo $i;
}

「each()」や「array_shift()」を使ってwhileの条件式の中で変数に値を渡すことができます。

でもPythonではこういう書き方はできないっぽいです。僕の調査不足なだけでやり方があるのかもしれませんが、ちょっと分からなかった。

#エラーになる
array = [1, 2, 3, 4, 5]
while i = array.pop(0):
  print(i)

#エラーにならない
array = [1, 2, 3, 4, 5]
while array:
  i = array.pop(0)
  print(i)

PHPのarray_shiftみたいな書き方をするなら、while文の中で処理をしないとダメみたいですね。






基本はこんな感じでしょうか。

冒頭でも言ったようにPythonにはforeach文がありません。だからディクショナリの場合も上記のfor文で回せるんですが、PHPのforeachとはちょい扱い方が違うようなので、次回はその違いを見てみましょー。



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