LE社のエンジニアたちの風がふくまま気の向くまま本音コラム

Pythonを使ってみよう

»

 初めまして。リーディング・エッジ社に勤務している言語マニアの吉永彰成と申します。現在、Java言語を使ってAndroidアプリを開発しております。

 私は今まで、オブジェクト指向から関数型に至るまでさまざまなプログラミング言語を勉強してきました。最近は、その中でも特にPythonに興味を持って勉強しています。そこで、今回は私が個人的に「Pythonで素晴らしいと思っている特徴」をご紹介したいと思います。

■ Pythonについて

 まず、Pythonの概要を簡単にご紹介します。Pythonは現在Googleに勤務するGuido van Rossum氏によって開発された、オープンソースのスクリプト言語です。オブジェクト指向プログラミング、関数型プログラミング、ジェネリックプログラミングをサポートしており、プログラマの目的や習熟度に応じてさまざまなスタイルでプログラミングが可能です。日本でも多くの使用実績があり、構造解析ソフトウェアの組み込みのスクリプト言語として採用されていたり、流行のソーシャルアプリの開発でも使用されていたりします。また、現在は日本語の解説書やWebサイトなどの情報源も充実しているため、非常に学習しやすい言語だと思います。開発環境としては、Python本体に付属のIDE(統合開発環境)の他、EclipseのプラグインであるPyDevなどがあります。私はPyDevを使用しています。

■ 「リスト」と「リスト内包表記」

 それでは、私がPythonの中でも特にエレガントだと思っている、「リスト」と「リスト内包表記」をご紹介したいと思います。リストはPythonの基本的なデータ構造で、下記のように定義します。

a = [0, 1, 2, 3]

 aは0から3までの整数を要素として持つリストです。Pythonリストは可変長配列として実装されていて、C++のstd::vectorやJavaのjava.util.ArrayListで実装されているような操作を行うことができます(Pythonでは、各行の#より右の部分はコメントになります)。

b = a[0]       # aの0番目の要素「0」を取り出してbに代入
c = []         # 空のリストcを生成
c.append(4)    # cに「4」を追加 (結果、c == [4]になる)
c.append(5)    # cに「5」を追加 (結果、c == [4, 5]になる)
d = a + c      # aとcを連結してdに代入 (結果、d == [0, 1, 2, 3, 4, 5]になる)

 上の例では、最終的に0から5の整数を要素として持つリストdを生成しました。今度はdから偶数の要素だけを取り出したいと思います。このような場合、「リスト内包表記」を使用すると、下記のように書くことができます。

e = [x for x in d if x % 2 == 0]   # (結果、e == [0, 2, 4]になる)

 これは日本語に翻訳すると、「リストdの中の各要素xに対して、x % 2 == 0を満たすxを要素として持つリスト」をeに代入するという意味になります。もう1つリスト内包表記の例を出します。dの各要素を2乗したい場合、下記のように書くことができます。

f = [x ** 2 for x in d]            # (結果、f == [0, 1, 4, 9, 16, 25]になる)

 これも日本語に翻訳すると、「リストdの中の各要素xに対して、x ** 2 (xの二乗)を要素として持つリスト」をfに代入するという意味になります。なお、リストeとfが表現している集合を数学の集合の内包的記法で表現すると、下記のようになります。下記をご覧になると、上記のコードの意味がよりイメージしやすいかもしれません。

Eq1

Eq2

 (ここで、x≡0 (mod 2)はxが2で割り切れることを表します)

 このようにPythonの内包表記は、数学の集合の内包的記法に対応するように、for、if、inというキーワードをうまく組み合わせて表現していることがお分かりになると思います。

■ 「NumPy」「SciPy」「matplotlib」

 次に「NumPy」「SciPy」「matplotlib」というPythonのライブラリをご紹介します。NumPyとSciPyは数値計算ライブラリ、matplotlibは可視化ライブラリです。これらのライブラリを組み合わせることで、1つのPythonコードの中で数値計算と計算結果の可視化が同時に行うことができます。ここでは、NumPyでsinカーブを作成し、matplotlibで表示する例をご覧に入れます。Pythonコードは下記のようになります。

# -*- coding: utf-8 -*-
import numpy                        # NumPyをインポートする。
import pylab                        # matplotlibをインポートする。
N = 51                              # サンプリングする点を数を指定する。
xs = numpy.linspace(0, 1, N)        # 0から1の間で均等にN点を選びリストxsに格納する。
ys = numpy.sin(2 * numpy.pi * xs)   # sinカーブを作成する(引数にリストを渡していることに注目!)
pylab.plot(xs, ys, 'bo')            # 青い(b)点(o)でsinカーブを描画する。
pylab.plot(xs, ys, 'r-')            # 赤い(r)線(-)でsinカーブを描画する。
pylab.xlim(0.0, 1.0)                # X軸の描画範囲を指定する。
pylab.ylim(-1.5, 1.5)               # Y軸の描画範囲を指定する。
pylab.show()                        # sinカーブを実際に表示する。

 ここで、numpy.piは円周率です。また、6行目のys = numpy.sin(2 * numpy.pi * xs)は下記のコードと等値です。

ts = [2 * numpy.pi * x for x in xs]
ys = [numpy.sin(t) for t in ts]

 このコードを実際に実行すると下の図のようなグラフが表示されます。

Zu01

 いかがでしょうか。この例は単純でしたが、NumPy及びSciPyは大規模な行列計算やLegendre多項式などの高水準の数学関数をサポートしている本格的な数値計算ライブラリのため、より高度で複雑な計算を行う事ができます。また、matplotlibは3次元の等高面なども描画が可能です。詳細は各ライブラリのリンク先の公式サイトをご覧ください。普段MATLABなどの高価で高機能な数値計算ソフトウェアを利用しているが、オープンソースでフリーな数値計算ソフトウェアにも興味のある方は、このPython+NumPy +SciPy +matplotlibの組み合わせも有力な候補になるのではないかと思います。

■ 参考文献

 最後にPythonの参考文献をご紹介します。Pythonについてご興味を持ったので、言語仕様と標準ライブラリについて手早く把握したいという方は、Webで無償で公開されているPythonチュートリアルをお読みになることをお勧めします。

 このチュートリアルで勉強して、より高度なPythonの活用方法を知りたい方は、「エキスパートPythonプログラミング」という本に挑戦されるとよいでしょう。チュートリアルを読むだけでは得られない言語仕様とライブラリを駆使した高度なテクニックを身に付けられます。

Comment(0)