はじめに
こんにちわ、hirataraです。
本稿では、オブジェクト指向のスクリプト言語であるPythonの紹介をしたいと思います。と言っても、実は私がPythonを勉強し始めたのは数ヶ月前のことで、まだPythonに関してさほど詳しいとは言えません。それでもこの記事を書こうと思い立ったのは、ある言語が他の言語に比べて面白い部分と言うのは、その言語にどっぷり漬かってその言語を使うことが当たり前になっている人間よりも、その言語を好きになり始めたくらいの人間の方が見つけやすいのではないかという思いからです。
そのような事情で、もしかすると本当のPythonistaからお叱りを受けるような内容も含まれるかもしれませんが、その点はTBやコメントでご教授頂けると幸いです。この記事で、少しでもPythonに興味を持ってくれる方が増えることを願っています。
対象読者
- 他言語でのプログラミング経験者
- Pythonがどんなものかを知りたい方
- 次に学ぶ言語を探している方
必要な環境
- テキストエディタ
- Python2.5
Pythonのインストール
Pythonのダウンロードページから、ご利用のプラットホームのバイナリをダウンロードし、実行してインストールして下さい。この記事では、Python2.5系を使って説明していますので、最新バージョンである2.5.1をダウンロードするとよいでしょう(2007/9/4執筆時点)。
なお、Windowsを利用している場合は、「python.exe」にPATHが通ってない可能性があります。環境変数のPATHに、pythonのインストールディレクトリのPATHを追加して下さい。
Pythonの特徴
では、早速Pythonとはどんな言語なのか、紹介していきます。百聞は一見にしかずです。まずは、以下のスクリプトをご覧下さい。
#!/usr/bin/env python2.5 # coding: utf-8 """ファイルの行数を数えるプログラム """ def wordcount(iter): """ 与えられたイテレータに含まれる行数を数える chr_cnt, line_cnt = mycount.wordcount( file("mycount.py") ) """ chr_cnt = 0 # 文字数 line_cnt = 0 # 行数 for l in iter: chr_cnt += len(l) # この行の文字数を数えて積算する line_cnt += 1 # 行数を積算する return (chr_cnt, line_cnt) if __name__ == '__main__': # メインルーチン import fileinput # ファイルインプットで引数をファイルとして処理する print "%d characters, %d lines" % wordcount( fileinput.input() )
これは、与えられたファイルの文字数と行数を数える単純なスクリプトです。以下のように実行します。
% ./mycount.py hogehoge.txt 4831 characters, 165 lines
このスクリプトを解説しながら、Pythonの特徴について簡単に説明していきます。
ブロックは全てインデントで記述する
最初に気がつくことは、中括弧が一つもないということです。また、VBやrubyのようにブロックの終端を示すendの記述も一切見当たりません。実はPythonは、ブロックを全てインデントで表現します。コロンで終わる行がブロックの始まりを表し、それ以下のインデントが同じ行を同じブロックと見なします。ちょうど、以下のようなイメージです。
ブロック1の始まり: ブロック1 ネストしたブロック2: ここはブロック2 ここもブロック2 ブロック1に戻って来た ブロックの外
この記法の利点は、プログラマーにインデントを強要できることにあります。プログラミング言語の初学者には、インデントの重要性がわからずに全て左詰めでコードを書いてしまうようなことがたまにあります。しかし、Pythonではそれはできません。ifでブロックを書きたければ、インデントするしかないのです。そのため、Pythonのブロックは誰が書いても見やすい物になります。
中括弧やendがないのも利点です。ソース中のノイズが少ない分、本当の処理に意識を集中しやすくなります。
ただ、この記法にも欠点はあります。例えば、emacs等のエディタの自動インデントにおいては、インデントでブロックを表すというのは不便な仕様です。閉じ括弧(})やendがあれば、エディタはここでブロックを終了することがわかるので、それ以前の記述を適切なインデントに自動調整し、次の行の適切なインデント位置にカーソルを持っていくことができます。しかし、インデントをブロックとしているPythonではエディタがブロックの終わりを知ってインデント位置を調整することはできません。インデントに関してはすべて人間が管理する必要があります。
もう一つ、空のブロックの表現が難しいという欠点があります。例えば、以下のソースをPythonで実行するとエラーとなります。
# これは IndentationError となる def empty_function(): print "out of block."
この問題を回避するために、Pythonにはpassと言う何もしない文が用意されています。
# これは大丈夫 def empty_function(): pass print "out of block."
このように多少欠点もあるインデントによる表記ですが、最大の利点はやはりコーディングしていて非常に気持ちがいいことのような気がします。中括弧等を打たなくて良い分ロジックの打ち込みだけに集中できますし、何より、出来上がったソースを眺めると非常に整っていて気分がいいです。ぜひ一度、コーディングしてみていただきたいと思います。
ドキュメンテーション文字列
Pythonには、コードをそのまま文書化するためのドキュメンテーション文字列があります。これは、javaでいうjavadocのようなもので、ソースとドキュメントをひとまとめで管理するのに非常に役に立ちます。
まず、大前提として、Pythonでは文字列をダブルクォートかシングルクォートでくくって表現します。また、ダブルクォートかシングルクォートを三つ重ねると、改行含みの文字列を作ることができます。
"文字列" 'これも文字列' '''改行を 含んだ 文字列 ''' """ これも そうです """
Pythonのドキュメンテーション文字列は、単なる文字列です。関数ブロックの最初の文字列が、ドキュメンテーションとして扱われます。例えば、先ほどの「mycount.py」をhelpコマンドでドキュメント化すると、以下のような表示となります。
>>> import mycount >>> help(mycount) Help on module mycount: NAME mycount - ファイルの行数を数えるプログラム FILE /Users/tarara/temp/privates/codezine/200708Python/mycount.py FUNCTIONS wordcount(iter) 与えられたイテレータに含まれる行数を数える chr_cnt, line_cnt = mycount.wordcount( file("mycount.py") )
このように、文字列を作っておくだけでそのスクリプトのドキュメントを簡単に作れます。Pythonを使うからには、この強力なドキュメント機能を使わないわけにはいきません。