モンキーPython (Python3対応): 第1回 プログラミング初めの一歩 後編

前編で、Python をインストールするところまでを見てきました。いよいよ、実際にソースコード (スクリプト) を書き始めます。

今回の目次:

スクリプトは文の集まり

それではスクリプトを書いてみましょう。まずはコンソールに「こんにちは。」と出力するだけの、ごく簡単なものです。

Pythonスクリプトのファイル拡張子は、「.py」とするのが一般的です。次のスクリプトを 01-03.pyという名前で保存します。

Python
[RAW]
  1. # -*- coding:utf-8 -*-
  2. print( "こんにちは。" ) # 画面に出力する.

Pythonでは、スクリプトに日本語などを含める場合、ファイルの文字コードは UTF-8 でなければなりません。UTF-8での保存方法はテキストエディタによって違うので、詳しくはお使いのテキストエディタのマニュアルを参照してください。

スクリプトの先頭 (1行目か2行目) で文字コードを明記すると、テキストエディタで開くときに正しく文字コードを判定してくれるので、次のように書いておいた方がベターです。

# -*- coding:utf-8 -*-

「#」と「coding」の間、それから文字コード名の後ろには何を書いても構いません。

(2006.5.15追加)
 第2回で、文字データがコンピュータ内部でどのように格納されるかについて触れます。そちらも参照してください。

「#」はコメントの開始で、「#」から行末までがコメントとなります。先頭行の文字コードの指定以外、何を書いても実行時には無視されます。

print は、文字列 (文字の連なり) や数値を画面に出力する命令です。Pythonでは、「文」を単位として実行されます。「print "こんにちは。"」が一つの文になります。

このファイルを実行するには、python3 コマンドの引数としてファイルを指定します。

$ python3 01-03.py
こんにちは。

以上のように表示されましたか?

ウィンドウを表示する

単に文字列を表示するだけでは面白くないので、次は画面にウィンドウを表示してみます。次のスクリプトは、ウィンドウを表示するだけです。

01-04.py

Python
[RAW]
  1. import tkinter
  2. window = tkinter.Tk()
  3. window.mainloop()

このスクリプトを 01-04.py という名前で保存します。スクリプトを実行すると、画面5のようにウィンドウが開きます。

画面5 01-04.pyの実行結果

01-04.py は3つの文からできています。まずは何をしているのか、順番に見ていきましょう。

(1) import tkinter

Pythonも含め、大抵のプログラミング言語では、最初からすべてのボキャブラリが使えるわけではありません。最小限の機能以外は、使いたいときにプログラムの中で明記する必要があります。これらは、カレンダー、HTML操作など、まとまった大きさになっていて、これをモジュールといいます。ちょうど、ツールボックスから必要なものを取り出して、それを使うイメージです。

import文は、モジュールを使えるようにします。ここでは、tkinter モジュールを取り込んでいます。これは、ウィンドウを生成したり、画像を描いたりするためのものです。

(2) window = tkinter.Tk()

tkinter.Tk() は、ウィンドウを扱うためのオブジェクトを生成し、変数 window に代入 (紐付け) します。これについては、すぐ後で解説します。

(3) window.mainloop()

mainloop() は、ウィンドウを表示し、ユーザからのアクションを待ちます。windowが格納するオブジェクトに対して作用します。

このような, オブジェクトに対して何らかの操作を行ったり、何か問い合わせたりするものをメソッドと呼びます。

オブジェクト

先ほどの 01-04.pyはウィンドウを表示するだけの短いものでしたが、何をしているか追いかけるためには、オブジェクト、メソッド、変数、クラスを理解する必要があります。

■オブジェクトとメソッド呼び出し

プログラムで扱うデータについて考えてみましょう。

ワープロを例にとると、文書は、文字やスタイル指定、あるいは画像データなどからなります。文書に埋め込まれた画像データは、大きさ、色数、そして内容からなります。画面に表示されるウィンドウも、表示位置、大きさ、載っている部品(ボタンなど)の情報を内部に持っています。このような文書、画像、ウィンドウなど内部情報を持つデータのことをオブジェクトといいます。

Pythonプログラミングでは, いちいちオブジェクトの内部情報を個別に操作するのではなく、それぞれのオブジェクトに対して, いろいろな命令を出します。それぞれのオブジェクトは, その外部からの操作にもとづいて、オブジェクト内の内部情報をうまくコントロールするようになっています。

まどろっこしいですか? でも、このようにしないと、内部状態が矛盾してしまう危険性が高まります。

文書を操作するプログラムを例にとると、図3のようにして文書オブジェクトに対して命令を出します。

図3 文書を操作するプログラムの例

オブジェクトが受け付けることができる命令をメソッドといいます。図3でいう,「段落を取り出す」あるいは「段落を更新」がメソッドです。オブジェクトに対してメソッドを発令することをメソッド呼び出しといいます。

メソッドを受け付けたオブジェクトは、何らかの処理を行い、何らかのオブジェクトを返すことができます。この返ってくるものを戻り値といいます。

ソースコードの中で、実際にメソッドを呼び出すには、次のように書きます。

    オブジェクト . メソッド名 ( 引数, ... )            # 文法

命令を出す対象となるオブジェクトをまず書き、ピリオドに続けてメソッド名、括弧を書きます。必要であれば、括弧の中に引数 (ひきすう) をカンマで区切って書きます。引数は、メソッド呼び出しに付随するデータ(値、オブジェクト)です。

■変数

オブジェクトを操作するためには、どのオブジェクトなのかを指し示さなければなりません。変数はどこにオブジェクトがあるかを示すためのものです。変数という付箋から紐が出ていて、それがオブジェクトに繋がっているイメージです。

変数とオブジェクトを結びつける命令を、代入といいます。「=」で表し、次のように書きます。

    変数 = オブジェクト                                # 文法

変数に代入することで、あるオブジェクトを何回でも指し示すことができるようになります。その変数を通じてオブジェクトを操作することができます(図4)。

図4 変数とオブジェクト

ところで、変数を容器あるいは入れ物に見立てて説明しているWeb上の解説ページを見かけます。これはまったく不正確です。

次の例は、あるオブジェクトを a_list という変数と b_list という変数に代入し、そのオブジェクトを操作します。

01-05.py

Python
[RAW]
  1. a_list = ["a", "fuga", "ほげ"]
  2. b_list = a_list
  3. b_list.append(True) # リストに追加
  4. print(a_list) # オブジェクトは共有される
$ python3 01-05.py 
['a', 'fuga', 'ほげ', True]

b_list 経由でオブジェクトを操作したにも関わらず、a_list を表示すると、同じものが表示されます。変数は、あくまでもオブジェクトに紐付けされるだけなのが分かります。

(2006.6.13追記)
 変数を収納する「名前空間」については、次回に解説します。

■クラスとオブジェクトの生成

先ほどのワープロ文書の例を考えると、文書の内容はまちまちです。文書ごとにオブジェクトが生成されます。しかし、その操作方法は共通です。たとえば「文字列を取り出す」、「太字に変える」などです。Pythonでは、オブジェクトは各々が違うメソッドを持つのではなく、種類が同じであれば同じ内容のメソッドを持つようになっています。このような, オブジェクトのそれぞれの種類のことをクラス、あるいはデータ型といいます。

自分でクラスを作る際は、それぞれのオブジェクトではなく、クラスにメソッドを作っていきます。

そして、オブジェクトを生成するには、次のようにします。この戻り値として新しいオブジェクトが得られます。

    クラス ( 引数, ... )                # 文法

ウィンドウを表示する例では、tkinter.Tk がクラス名であり、tkinter.Tk() でオブジェクトを生成します。

もう少し細かく言うと, ドットの左側の「tkinter」は変数で, import時に 'tkinter'モジュールが代入されていました。その Tkアトリビュート (これも変数) に 'tkinter.Tk'クラスが代入されていました。そのクラスに () を与えることで、オブジェクトが生成されます。

テキストとボタンを表示する

今度はラベルとボタンを表示してみます。サンプルプログラムは 01-06.py です。

01-06.py
Python
  1. # -*- coding:utf-8 -*-
  2. import tkinter
  3. window = tkinter.Tk()
  4. label = tkinter.Label(window, text = "サンプル")
  5. label.pack() # --- (1)
  6. button = tkinter.Button(window, text = "ボタンです。押しても何も起きません")
  7. button.pack()
  8. window.mainloop()

実行結果は、画面6のようになります。

図6 01-06.pyの実行結果

tkinter.Labelクラスはラベルを扱うクラス、tkinter.Buttonクラスはユーザが押せるボタンを扱うクラスです。Labelオブジェクト、Buttonオブジェクトを生成するとき、キーワード引数を使っています。キーワード引数は、引数の名前を指定するもので、引数を書く順序を呼び出し側が自由にできるものです。

pack()メソッドは、ラベルやボタンをウィンドウの中に配置するメソッドです。どのように配置するかを引数で指定できます。例のように引数を省略すると、順に上から並べます。(1)の行を次のようにすると、ラベルがボタンの下に来ます。

    label.pack(side = Tkinter.BOTTOM)

関数呼び出し、print文

メソッド呼び出しはオブジェクトに対して行いますが、オブジェクトと結びつかない命令もあります。このようなものを関数といい、次のように書きます。

    [ モジュール名 . ] 関数 ( 引数, ... )             # 文法

[ ... ] の部分(ここでは「モジュール名 .」、以下でも[ ]内は省略可能。)は省略できます。対象となるオブジェクトがないので、その部分を省略したように見えます。

関数には、例えば、数値を16進数の文字列に変換するhex()などがあります。

Python
[RAW]
  1. print( hex(15) ) #=> '0xf'

print文は、カンマで区切って複数の値を表示することもできます。

マニュアルの読み方

今回は、tkinter を使ってごく単純なウィンドウを表示したり、オブジェクトの生成、操作について見てきました。作成できるプログラムの幅を広げるには、ボキャブラリを増やすのが近道です。

ボキャブラリを増やすには、まずはどんな機能があるのかをざっと見ておくのがいいでしょう。ソースコードを書くときに,「あんな機能があったな」ということを思い出せれば、そのページを見て、クラスやそのメソッドを知ることができます。

Pythonの標準ライブラリのリファレンスマニュアル (日本語訳) はここにあります;

例えば,「12.5. dbm -- Unix“データベース”へのインタフェース」を見ると、この機能を使うには import dbm することが分かります。

また、次の記述から、このモジュールは open()メソッドを持つことが分かります。

dbm.open(file, flag='r', mode = 0o666)
データベースファイル file を開いて対応するオブジェクトを返します。

今回取り上げた tkinter については、「25. Tkを用いたグラフィカルユーザインターフェイス」を参照してください。

どんな関数があるのか、あるいは関数の機能を調べるときは、「2. 組み込み関数」を見てみるといいでしょう。

このほか、次のページにモジュールの一覧があります。これも役に立つでしょう。

今回のまとめ

Pythonは、幅広く使われているプログラミング言語であり、Linux使いであれば、ぜひとも押さえておきたいところです。

今回は、次のことを学習しました。

  • プログラミングは、インタプリタやコンパイラが解釈できるようなソースコードを作ることである。
  • Pythonは、強力で、広く使われているプログラミング言語である。
  • 対話モードを利用すると、ちょっとした動作確認などができる。
  • オブジェクトは内部に情報を持っていて、メソッドを呼び出すことで操作できる。
  • 変数は、オブジェクトを指し示すもの。
  • クラスはオブジェクトを分類するもので、クラスごとにメソッドが決まる。
  • 関数呼び出しは、オブジェクトのないメソッド呼び出し。
  • リファレンスマニュアルは重宝する。

次回は、Pythonの文法、重要なクラスなどについて学習していきましょう。