この文書は、Linux magazine 2005年1月号〜3月号に掲載された連載の草稿を、(株)アスキーLinux magazine編集部の許可を得て公開するものです。校正前の原稿なので読みづらいところもあるかと思いますが、不明な点などありましたらコメントをお送りください。
文:堀川 久 Text: HORIKAWA Hisashi
今回の目次
コンピュータを使うのは今やありふれたことであり、多くの人が日常的にコンピュータに触れています。しかし、プログラミングしようという人は、表計算ソフトでマクロを作ったりする場合を含めても、ごく僅かです。
プログラミングは、決して特別な技術ではありません。コツさえつかめば、誰でもできるようになります。
プログラミングができるようになると、毎回手でしていたことを自動化できるようになります。例えば、ファイルとして保存されているデータをいろいろな方法で集計したり、加工したりできるようになります。いちいち手作業でデータを操作したりするのが面倒だと感じるなら、プログラミングを覚える価値があります。
プログラムはどうやって動くのか、あるいはどうすれば作れるようになるのでしょうか。イメージを掴むために、Webページの表示とプログラミングを対比してみましょう。
Webページを表示するには、HTMLファイルが必要です。
<a href="foo.html">foo</a> <img src="bar.png">
このファイルをWebブラウザ、例えばMozillaで開きます。そうすると、Webブラウザがファイルの内容を解釈して、リンクとして表示したり、画像を表示したりします。
一方、プログラミングでは、まずプログラムを書き、ファイルとして保存します。
a = 10 * 2 print "foo" + a
このファイルを読み込み、解釈するプログラムをインタプリタといいます。インタプリタは、プログラムの内容にしたがって、データファイルを開いて読み込んだり、データを加工したりします(図1)。

プログラムを書くというのは、インタプリタが解釈できるようなテキストファイルを作ることと言えます。
しかし、プログラムを書くには、
HTMLでは、あらゆるタグは <タグ名 属性名="属性値" ...>と書きます。このように、表示する内容によらず守らなければならない決まりごとがあります。これが文法です。また、「a」はリンクを張る、「img」は画像を埋め込むなど、表示する内容を決める単語があります。
プログラミングでも、どのような順序でプログラムを解釈するのか、など一定の文法があります。加えて、計算する命令、データファイルを開く命令などの単語があります。
HTMLではページを作るだけですが、プログラムは様々なことができます。そのため、文法はHTMLよりもだいぶ複雑です。また、命令の単語も、いろいろなことをさせようとするとそれだけ多くのものを使いこなさなければなりません。ただ、文法も命令の単語も、最初から一から十まで完全に覚えなくても大丈夫です。必要なときにリファレンスマニュアルで調べることもできますし、使っているうちに覚えてきます。
ところで、プログラムの中には、インタプリタで解釈せずに、直接Linuxで動かせるようになっているものもあります。これは、人間が作成するプログラムを事前にコンパイラというプログラムで変換したものです。このとき、元のプログラムをソースコード、変換後のものを実行形式のプログラムといいます(図2)。
プログラミングの学習に当たっては、プログラムを書くたびにその場ですぐさま実行できたほうが、試行錯誤しやすく、手軽です。この連載では、インタプリタを使い、あらかじめコンパイラで実行形式に変換することはしません。
プログラムを書くための文法とボキャブラリを併せたものをプログラミング言語といいます。インタプリタでプログラムを動かすプログラミング言語のことをスクリプト言語といい、そのプログラムをスクリプトといいます。
プログラミング言語は一つだけではありません。世の中には星の数ほどプログラミング言語があります。これらは、目的(製作するプログラムの種類)によって使い分けられます。例えば、Windows用ですが、HSP (http://www.onionsoft.net/hsp/) というゲーム作成のための言語であれば、ゲームを作るのに威力を発揮します。
とはいうものの、作るプログラムごとに毎回別の言語を覚えるのは大変です。そのため日常的には、汎用的なプログラミング言語を使います。
この連載では、「Python(パイソン)」というプログラミング言語を使います。
まず、Pythonの特徴、どのように使われているか、などを簡単に説明します。
Pythonは、1990年代初頭に登場した、比較的新しい汎用的なプログラミング言語です(新しいといっても、すでに10年以上になりますが)。
Pythonは、便利で直感的な文法は採り入れるが、複雑な文法の拡張は行わない方針で開発されています。そのため、シンプルで明確な文法であり、習得が容易です。他人が書いたプログラムであっても、かなり読みやくなっています。
プログラミング言語の優劣の基準の一つは、どのぐらいプログラムが簡潔に書けるか、です。同じことをするプログラムを2種類のプログラミング言語で書いてみます。これは、あらかじめ用意した1, 5, 10という数値を順番に表示するプログラムです。
C言語で書くと、次のようになります。
#include <stdio.h>
int main() {
const int ary[] = {1, 5, 10, -1};
int i;
for (i = 0; ary[i] != -1; i++)
printf("%d\n", ary[i]);
}
一方、Pythonで書くと次のようになります。
for elem in (1, 5, 10):
print elem
実行結果は、いずれでも同じです。
1 5 10
このように、Pythonは非常に簡潔に書けます。
そのほかにも、Pythonには次のような特徴があります。
特に、ライブラリは充実していて、標準ライブラリとして、HTML解析、CGIライブラリ、eメール操作、XML操作などが添付されています。また、標準添付されない追加ライブラリについても、様々なものが開発されています。
何にしても、ツールというものはある程度メジャーなものを使ったほうが便利なことが多いものです。プログラミング言語でも同じで、その使い手が多いと、改良が早く進み、追加ライブラリの開発も活発になり、より使いやすく、強力になるものです。その点、Pythonはどうでしょうか。
freshmeat.net (http://freshmeat.net/) で見てみると、一番よく登場するプログラミング言語はC言語で、執筆時点で6645プロジェクトあります。以下、Java、C++、Perl、PHP、Python、Unixシェルと続きます。Pythonは十分メジャーだと言えます。
Pythonで書かれたソフトウェアには、例えば次のようなものがあります。
このように、デスクトップ向けのソフトウェアからサーバー構築のためのものまで、多岐に亘るものがあります。そのほか、GIMPのプラグインなど、プログラムの拡張モジュールとしてもよく使われています。
加えてLinuxでは、知らず知らずのうちにPythonで書かれたプログラムをよく使っています。Linuxディストリビューションのひとつ、Fedora Core (フェドーラコア) では、次のものがPythonで書かれています。
このように、Pythonは幅広く使われており、特にLinux使いにとっては、実は馴染み深いものなのです。
大抵のLinuxディストリビューションでは、あらかじめPythonインタプリタはインストールされているので、自分でインストールする必要はありません。もしインストールされていない場合は、お使いのLinuxディストリビューションのサイトからダウンロードし、インストールしてください。例えばFedora Core 3 にはバージョン2.3.4がインストールされています。
次のようにすれば、インストールされているかどうかとインストールされているバージョンを確認できます。
$ rpm -q python python-2.3.4-11
もしインストールされていない場合は、使っているディストリビューションのサイトからダウンロードし、インストールしてください。
この連載では、ウィンドウを表示させたりするため、Tkinter というパッケージも必要です。インストールされているかどうかは、Pythonを起動し(後述:対話的に使う)、「import Tkinter」と入力することで確認できます。インストールされている場合は、画面2のように何も表示されません。インストールされていない場合は、画面3のようにエラーが表示されます。
インストールされていないときは、rootユーザになり、次のようにしてインストールします。
$ su # yum install tkinter
なお、yumコマンドを使うときはインターネットに接続されている必要があります。
コンソールで単にpythonコマンドを実行すると、対話モードで起動します。対話モードとは、1行1行プログラムを打ち込み、そのつど実行されるモードです。エラーがある場合は、その場で指摘されます。ちょっとした動作確認や簡単な計算に便利です。
「>>>」がプロンプト(入力を促す文字)です。ここに直接プログラムを入力していきます。Enterを打つとすぐその結果が表示されます。試しに、簡単な式を入力してみます(画面4)。
対話モードから抜け、pythonを終了させるには、Ctrl-Dキーを打ちます。
対話モードは手軽ですが、その場限りでプログラムは消えてしまいます。何度も使用するプログラムを書くのには向いていません。通常は、プログラム(スクリプト)をファイルに保存し、それをpythonコマンドで実行します。
スクリプトを書くには、テキストエディタが必要です。この連載ではウィンドウを作ったりしますが、日本語を表示するには、スクリプトの文字コードがUTF-8でなければなりません。テキストエディタは、少なくとも文字コードがUTF-8のファイルを編集できるものを用意してください。このようなテキストエディタには、gedit、kwrite、Emacs + Mule-UCSなどがあります。
Pythonでは、スクリプトに日本語を含める場合、スクリプトの先頭(1行目か2行目)で文字コードを明示的に指定しなければなりません。次のようにして指定します。
# coding:文字コード名または
# coding=文字コード名というように指定します。
「#」と「coding」の間、それから文字コード名の後ろには何を書いても構いません。テキストエディタがEmacsの場合、次のように、文字コード指定の前後に「-*-」を入れることで、ファイルを開くときにEmacsが文字コードを認識してくれます。
# -*- coding:utf-8 -*-
UTF-8での保存方法はテキストエディタによって違うので、詳しくはお使いのテキストエディタのマニュアルを参照してください。
(2006.5.15追加)
第2回で、文字データがコンピュータ内部でどのように格納されるかについて触れます。そちらも参照してください。
それではスクリプトを書いてみましょう。まずはコンソールに「こんにちは。」と出力するだけの、ごく簡単なものです。
Pythonスクリプトの拡張子は、「.py」とするのが一般的です。ファイル名は何でもいいのですが、次のスクリプトを1st.pyという名前で保存します。
# -*- coding:euc-jp -*- print "こんにちは。" # 画面に出力する。
「#」はコメントの開始で、「#」から行末までがコメントとなります。文字コードの指定以外、何を書いても実行時には無視されます。
printは、文字列(文字の連なり)や数値を画面に出力する命令です。Pythonでは、「文」を単位として実行されます。「print "こんにちは。"」が一つの文になります。
このファイルを実行するには、pythonコマンドの引数としてファイルを指定します。
$ python 1st.py こんにちは。
以上のように表示されるはずです。
単に文字列を表示するだけでは面白くないので、次は画面にウィンドウを表示してみます。次のスクリプトは、ウィンドウを表示するだけです。
import Tkinter window = Tkinter.Tk() window.mainloop()
このスクリプトをtk_01.pyという名前で保存してください。スクリプトを実行すると、画面5のようにウィンドウが開きます。
tk_01.pyは3つの文からできています。まずは何をしているのか、順番に見ていきましょう。
Pythonも含め、大抵のプログラミング言語では、最初からすべてのボキャブラリが使えるわけではありません。最小限の機能以外は、使いたいときにプログラムの中で明記する必要があります。これらは、カレンダー、HTML操作など、まとまった大きさになっていて、これをモジュールといいます。ちょうど、ピザのトッピングのように、必要なものを盛り付けていきます。
import文は、モジュールを使えるようにするためのものです。ここでは、Tkinterモジュールを取り込んでいます。これは、ウィンドウを生成したり、画像を描いたりするためのものです。
Tkinter.Tk()は、ウィンドウを扱うためのオブジェクトを生成し、変数windowに代入します。これについては、すぐ後で解説します。
mainloop()は、ウィンドウを表示し、ユーザーからのアクションを待ちます。windowで示されるオブジェクトに対して作用します。オブジェクトに対して何らかの操作を行ったり、何か問い合わせたりするものをメソッドと呼びます。
tk_01.pyはウィンドウを表示するだけの短いものでしたが、何をしているか追いかけるためには、オブジェクト、メソッド、変数、クラスを理解する必要があります。
プログラムで扱うデータについて考えてみましょう。ワープロを例にとると、文書は、文字やスタイル指定、あるいは画像データなどからなります。文書に埋め込まれた画像データは、大きさ、色数、そして内容からなります。画面に表示されるウィンドウも、表示位置、大きさ、載っている部品(ボタンなど)の情報を内部に持っています。このような文書、画像、ウィンドウなど内部情報を持つデータのことをオブジェクトといいます。
オブジェクトは、自分自身で内部情報の操作方法を知っています。そのため、オブジェクトを使う側は、オブジェクトの内部情報に直接アクセスするのではなく、オブジェクトに対して命令を出します。
文書を操作するプログラムを例にとると、図3のようにして文書オブジェクトに対して命令を出します。
オブジェクトが受け付けることができる命令をメソッドといいます。図3でいう、「段落を取り出す」あるいは「段落を更新」がメソッドです。オブジェクトに対してメソッドを発令することをメソッド呼び出しといいます。
メソッドが呼び出されたオブジェクトは、何らかの処理を行い、何らかのオブジェクトを返すことができます。この返ってくるものを戻り値といいます。
プログラムの中で、実際にメソッドを呼び出すには、次のように書きます。
オブジェクト . メソッド名 ( 引数, ... ) # 文法
命令を出す対象となるオブジェクトをまず書き、ピリオドに続けてメソッド名、括弧を書きます。必要であれば、括弧の中に引数(ひきすう)をカンマで区切って書きます。引数は、メソッド呼び出しに付随するデータ(値、オブジェクト)です。
オブジェクトを操作するためには、そのオブジェクトを指し示すことができなければなりません。変数はどこにオブジェクトがあるかを示すためのものです。変数という付箋から紐が出ていて、それがオブジェクトに繋がっているイメージです。
変数とオブジェクトを結びつける命令を、代入といいます。「=」で表し、次のように書きます。
変数 = オブジェクト # 文法
変数に代入することで、その変数を通じてオブジェクトを操作することができます(図4)。
(2006.6.13追記)
変数を収納する名前空間については、次回に解説します。
先ほどのワープロ文書の例を考えると、文書の内容はまちまちです。文書ごとにオブジェクトが生成されます。しかし、その操作方法は共通です。たとえば「文字列を取り出す」、「太字に変える」などです。Pythonでは、オブジェクトは各々が違うメソッドを持つのではなく、種類が同じであれば同じメソッドを持つようになっています。このようなオブジェクトの種類のことをクラス、あるいはデータ型といいます。
そして、オブジェクトを生成するには、次のようにします。この戻り値として新しいオブジェクトが得られます。
クラス名 ( 引数, ... ) # 文法
ウィンドウを表示する例では、Tkinter.Tkがクラス名であり、Tkinter.Tk()でオブジェクトを生成します。
今度はラベルとボタンを表示してみます。サンプルプログラムはリスト1です。
実行結果は、画面6のようになります。
Tkinter.Labelクラスはラベルを扱うクラス、Tkinter.Buttonクラスは押しボタンを扱うクラスです。Labelオブジェクト、Buttonオブジェクトを生成するとき、キーワード引数を使っています。キーワード引数は、引数の名前を指定するもので、引数を書く順序を呼び出し側が自由にできるものです。
pack()メソッドは、ラベルやボタンをウィンドウの中に配置するメソッドです。どのように配置するかを引数で指定できます。例のように引数を省略すると、順に上から並べます。(1)の行を次のようにすると、ラベルがボタンの下にきます。
label.pack(side = Tkinter.BOTTOM)
メソッド呼び出しはオブジェクトに対して行いますが、オブジェクトと結びつかない命令もあります。このようなものを関数といい、次のように書きます。
[ モジュール名 . ] 関数 ( 引数, ... ) # 文法
[ ... ] の部分(ここでは「モジュール名 .」、以下でも[ ]内は省略可能。)は省略できます。対象となるオブジェクトがないので、その部分を省略したように見えます。
関数には、例えば、数値を16進数の文字列に変換するhex()などがあります。
print hex(15) #=> '0xf'
print文は、一見関数のようですが、関数呼び出しで必須の( )を省略できる特別な文です。普段使う分には、カンマで区切って複数の値を表示できますし、関数のように使えます。
今回は、Tkinterを使ってごく単純なウィンドウを表示したり、オブジェクトの生成、操作について簡単に見てきました。作成できるプログラムの幅を広げるには、ボキャブラリを増やすのが近道です。
ボキャブラリを増やすには、まずはどんな機能があるのかをざっと見ておくのがいいでしょう。プログラムを書くときに、「あんな機能があったな」ということを思い出せれば、そのページを見て、クラスやそのメソッドを知ることができます。
Pythonのライブラリリファレンス(日本語訳)は、http://www.python.jp/pub/doc_jp/lib/lib.html にあります。
例えば、「7.11 dbhash -- BSD データベースライブラリへの DBM 形式のインタフェース」を見ると、この機能を使うにはdbhashモジュールをimportすることが分かります。
また、次の記述から、このモジュールはopen()関数を持つことが分かります。
今回取り上げたTkinterについては、「16. Tkを用いたグラフィカルユーザインターフェイス」を参照してください。
どんな関数があるのか、あるいは関数の機能を調べるときは、「2.1 組み込み関数」を見てみるといいでしょう。
このほか、グローバルモジュールインデクス(http://www.python.jp/pub/doc_jp/modindex.html)にモジュール一覧があります。これも役に立つでしょう。
Pythonは、幅広く使われているプログラミング言語であり、Linux使いであれば、ぜひとも押さえておきたいところです。
今回は、次のことを学習しました。
次回は、Pythonの文法、重要なクラスなどについて学習していきましょう。
Netsphere Laboratories http://www.nslabs.jp/
[PR]