Python – ブロックの書き方
2009年5月9日 1:45 AM by Abalone




さらにPythonの勉強を進めている。

私が Python を始めたとき、一番興味を惹かれたのがやっぱりブロックの書き方。
当時、C言語プログラマであった私は、異なるブロックの書き方をしている、他の人が書いたコードを見るたびにこの書き方は統一できないものか、と思っていた。その後に所属したプロジェクトでは、それぞれの人がそれぞれの意見を持っていて全然まとまらないから、特にインデント等には決まりを設けない、という決まりがあったりもした。

そこへ来てPythonのブロックの書き方に出会い、ああ、こりゃいい、となったわけである。

多くの方がすでに知っていることだと思うけれど、Pythonのブロックは、インデントで表す。

lines = ['line1', 'line2', 'line3']
for str in lines:
    print str       # This line is inside the loop.
print 'Finished'    # This is not inside the loop.

コード行のインデントが同じ場合には同じブロックにあると見なされる。基本的にブロックが終わるのは、ファイルの終わりか、次の行が自分のインデントよりも浅い時。
だから上のコードの最終行はforループの外側にあることになる。実際に実行してみると、’Finished’が表示されるのは一回だけである。
次に、例えば”print ‘@@@’”という行を以下のように追加してみる。

lines = ['line1', 'line2', 'line3']
for str in lines:
    print str       # This line is inside the loop.
    print '@@@'     # This line is inside the loop as well.
print 'Finished'    # This is not inside the loop.

そうすると、新たに追加された行のインデントは、既に書かれていた”print str”と同じなので、これは同じブロックにあると見なされ、forループを回るたびに実行される。
if文なんかも次のようになる。

if x==y:
    print "x = y"
else:
    print "x != y"

ここで、ifとelseのインデントは一致していなくてはならない。このインデントでelseに対応するif文を識別するので、このインデントが異なっているとelseに対応するifが見つからないというエラーになる。こういうルールがあるので、if文がネストしている場合とかでも非常にすっきり書ける。

if x==y:
    if y==z:
        print "x = y = z"
    else:
        print "x = y, x != z"
else:
    print "x != y"

C言語とかでよくある次のやつ。

if (x==y)
   if (y==z) printf("x = y = z\n") ;
else
   printf("x != y\n");

これだとxとyの保持している値が等しいときでも”x != y”と表示されてしまうことがあるが、こんなバグも発生しない。C言語をご存じない方のために説明しておくと、この例だと、else 節が、内側にあるif文、つまり “if(y==z) ・・・”に対応していると見なされるため、x=y で、x!=zの時に”x != y”が表示されることになってしまう。Pythonではこういうミスは最初から起こりにくくなっている(とは言え、書き間違えればPythonだろうと何だろうと意図しない動作をするので無縁だとまでは言わない)。

以上、Pythonのブロックの書き方についてちょこっとまとめてみた。トリプルクォートで囲った文字列とか、バックスラッシュを使った場合等の例外はあるものの、原則インデント幅で決まるこの書き方はとても分かりやすいと思っている。最初こそ、なんかFortranのようだ、とか思ったものの慣れてしまえば非常に分かりやすい。
あんまり時間が取れなくて困ってはいるのだが、面白いのでPython、少しずつ基本部分から復習込みで勉強していくつもりだ。





トラックバックURL


この記事に対するコメント/トラックバックはまだありません


コメントをどうぞ

お名前(必須)
Eメールアドレス(公開されません)(必須)