PHPしか知らない僕がPythonを少し触ってみたよ 〜ネストについて〜

この記事はだいぶ前に書かれたものなので情報が古いかもしれません
見たことはないです

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

ネストに関するPHPとPythonの違いを見ておきたい
Pythonの場合はネストにインデントを取るのが必須
必ず一行以上のコードを書く
次あたりから分岐処理や繰り返し処理の話に入ると予想されるので、その前にちょいとだけ、ネストに関するPHPとPythonの違いを見ておきたいと思います。



ネストの基本

論より証拠っつーことで、とりあえず簡単なif文やfor文を書いてみましょう。

PHPだとこう。

//if文
if($i == true) {
  echo 'Trueです';
}

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

条件式を()で囲って、中身を{}で囲うように書きます。

続いてPython。

#if文
if i == True:
  print('Trueです')

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

Pythonはかっこで囲いません。if文やfor文の条件式の最後にコロンをつけて、あとはその下に中身を書いてく。

条件式にもかっこはつけない。つけてもエラーにはならないっぽいけど。

PHPも{}で囲わずに書いてもエラーにはならないですが、その場合は最初の一行だけしかループの中身だと判定されない。

for($i = 0; $i < 10; $i++)
  echo $i;
  echo $i * 2;

この場合「echo $i * 2」の方はfor文の外の処理になります。



Pythonはインデント必須

かっこで囲わなかったらどこまでが中身か判定できねーじゃんって言いたくもなりますが、Pythonの場合はネストにインデントを取るのが必須なので、それで中身を判定しています。

例えばPHPはインデントがなくても正常に動作させることができる。

//if文
if($i == true) {
echo 'Trueです';
}

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

コードの可読性を考えるとこんな書き方はしない方が良いですが、とりあえずエラーではない。

でもPythonだとエラーになります。

#if文
if i == True:
print('Trueです')

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

こういう書き方をすると「IndentationError」とかいうエラーが出るので、忘れずにインデントを取らなければならない。

逆にいうと、インデントを取らずに書けばそれはif文やfor文の外にあるという判断になるってことですね。

for i in range(10):
  print(i)
print('ループの外です')

これをPHPで書き直すとこうなる。

for($i = 0; $i < 10; $i++) {
  echo $i;
}
echo 'ループの外です';

インデントの書き方は半角スペースでもタブでもどっちでもオッケー。それはPHPもPythonも一緒です。



必ず一行以上のコードを書く

それからPythonの方はif文やfor文の中身が何もないとエラーになります。

//PHP(エラーにならない)
if($i == true) {
  echo 'Trueです';
} else {

}

#Python(エラーになる)
if i == True:
  print('Trueです')
else:

こんな書き方をするかどうかは別として、例えばこんな風にelseの中に何も書いてなかったりすると、Pythonの場合はSyntaxエラーになります。コメントしか書いてない場合も同じエラーが出ます。

if i == True:
  print('Trueです')
else:
  #コメント

もし何も書くことがないって場合は「pass」というのを使えばエラーを回避できます。

if i == True:
  print('Trueです')
else:
  pass

これならオーケー。関数やクラスの時も同様です。



一行にまとめて書く場合

改行せずに一行に書くことは可能です。

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

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

これはどちらもオーケー。ただ、PHPの方は{}を省略して書くことができますが、Pythonのコロンは省略できないです。

//PHP(大丈夫)
for($i = 0; $i < 10; $i++) echo $i;

#Python(エラー)
for i in range(10) print(i)



おまけ

一応PHPでもコロンをつけてif文やfor文を書くことはできます。その場合は{}は使わない。

//if文
if($i == true) :
  echo 'Trueです';
endif;

//for文
for($i = 0; $i < 10; $i++) :
  echo $i;
endfor;

Pythonと違うところは「endif」や「endfor」の記述が必要になることですね。foreach文やwhile文も「endforeach」「endwhile」が必要です。

PythonとPHPの両刀使いの場合は、Pythonに近いこっちの書き方をする方が混乱しなくて済む……のか?

僕の場合はHTMLとPHPが入り混じるコードではこっちの書き方を多様します。WordpressやCakePHPのテンプレートファイルとか。

<div>
  <?php for($i = 0; $i < 10; $i++) : ?>
    <p><php echo $i ?></p>
  <?php endfor ?>
</div>

や、好みの問題なんですけどね。「<?php } ?>」みたいに「}」一文字のためにPHPタグを使うってのがどーにも馴染まなくて……コーディング規約でそっちの書き方をしろって言われたらおとなしく従うけども。






慣れればなんてことない話なのですが、僕の場合だと、中身がコメントしかないとエラーになるってのは結構やっちゃうんで、自分的にそこはしっかり意識しておきたい感じですね。動作テストしてる時にドバーッと中身をコメントアウトすることってわりとあるので。



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