Shoeisha Technology Media

CodeZine(コードジン)

記事種別から探す

Pythonを始めよう

最近普及が進みつつあるスクリプト言語Pythonに挑戦してみよう

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2007/09/12 14:00

Pythonは純粋オブジェクト指向言語であり、最近はGoogleでの利用や、.NET環境でのIronPythonなど、徐々に有名になってきています。この記事では、他言語での素養がある方を対象にPythonによる開発の概観を紹介し、そんなPythonの楽しさをみなさんに伝えたいと思います。

目次

はじめに

 こんにちわ、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とはどんな言語なのか、紹介していきます。百聞は一見にしかずです。まずは、以下のスクリプトをご覧下さい。

mycount.py
#!/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を実行する
% ./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コマンドでドキュメント化すると、以下のような表示となります。

mycount.pyのドキュメント
>>> 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を使うからには、この強力なドキュメント機能を使わないわけにはいきません。


  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

  • hiratara(ヒラタラ)

    1977年に苫小牧市で生まれる。北海道大学理学部数学科卒。小学生の頃、両親に買い与えられたMZ-2500でプログラミングを始めた。学生時代、CGIの自作に没頭し、それ以降WEB開発の魅力に憑かれる。社会人になっても数学好きは変わらず、専門書を買い集めるのが最近の趣味。 id:hirataraに...

All contents copyright © 2005-2018 Shoeisha Co., Ltd. All rights reserved. ver.1.5