Python

Article on other languages:

del.icio.us del.icio.us
Digg Digg
Furl Furl
Reddit Reddit
Rojo Rojo
Add to OnlyWire
Python
パラダイム マルチパラダイム
登場時期 1990年
設計者 グイド・ヴァンロッサム
開発者 パイソンソフトウェア財団
最新リリース 2.6 / 2008年10月1日
型付け 強い動的型付け
主な処理系 CPython, Jython, IronPython, PyPy
影響を受けた言語 ABC, C, Haskell, Icon, Lisp, Modula-3, Perl, Smalltalk, Tcl
影響を与えた言語 Ruby, Boo, Perl, JavaScript
プラットフォーム クロスプラットフォーム
ライセンス Python Software Foundation License
ウェブサイト http://www.python.org
  

Python(パイソン)は、オランダ人のグイド・ヴァンロッサムが作ったオープンソースプログラミング言語オブジェクト指向スクリプト言語の一種であり、Perlとともに欧米で広く普及している。イギリスのテレビ局 BBC が製作したコメディ番組『空飛ぶモンティ・パイソン』にちなんで名付けられた。Pythonは英語で爬虫類ニシキヘビの意味で、Python言語のマスコットやアイコンとして使われることがある。

目次

概要

Pythonは多様な目的に使うことのできる汎用プログラミング言語である。そのカバーする範囲はWebプログラミングから GUIベースのアプリケーションなど、Javaなどと重なっている部分もあるが、一方ではPerlのように日常のちょっとした処理を行わせるのに使うこともできる。スクリプト言語であるがゆえに開発が Java などよりも手軽に行えることや、多くのプラットフォームをサポートしており(動作するプラットフォーム)、豊富なライブラリがあることから、産業界でも利用が増えつつある。豊富なドキュメントをもち、Unicodeによる文字列操作をサポートしており、日本語処理も標準で可能である。ただし、最初からネットワーク利用をメインとして考えられているJavaよりセキュリティについてはやや寛大である。

また、Pythonは純粋なプログラミング言語としてではなく、多くの異なる言語で書かれたモジュールをまとめる(シェルスクリプトのような)グルー言語のひとつとして位置づけることもできる。実際、多くの商用アプリケーションで Python は組み込みのスクリプト言語として採用されている(⇒Pythonを使っている製品あるいはソフトウェアの一覧)。

Pythonは基本的にインタプリタ上で実行されることを念頭において設計されており、以下のような特徴をもっている:

動作するプラットフォーム

Pythonの最初のバージョンはMac OS上で開発されたが、のちに多くのプラットフォーム上で動作するようになっている。

実装

現在のところ、Pythonインタプリタには複数の実装が存在している:

  • CPython - オリジナルのCで書かれたバージョン。通常「Python」といえばこのCPythonを指す。
  • Stackless Python - PythonインタプリタをCスタックを使わずに独自のスタック(Pythonスタック)で実装したもの。
  • Jython - Java仮想マシン上に移植したもの。PythonからJavaのライブラリを使うことができる。
  • IronPython - .NET Framework/Monoで動作するPython。C#で実装されている。.NET Frameworkのライブラリを使うことができる。
  • PyPy - PythonによるPythonインタプリタの実装
  • PyMite - 組み込み向けの実装、AVRなどに対応。

ライセンス

Python のリリースは全てオープンソースであり、PSF(Python Software Foundationライセンス)として配布されている。これはGPL互換とされているが、しかし、GPLと異なり、変更したバージョンを配布する際に変更をオープンソースにしなくてもよいとされている。

歴史

Python の歴史

  • 1990年代始め - オランダにあるStichting Mathematisch Centrum(CWI)で、グイド・ヴァンロッサムによってPythonの初期バージョンが作成される。これはABCと呼ばれる言語の後継言語として生み出された。
  • 1995年 - ヴァンロッサムは米国ヴァージニア州レストンにあるCorporation for National Research Initiatives(CNRI) に移動。ここでPythonの開発に携わり、いくつかのバージョンをリリースする。
  • 2000年3月 - ヴァンロッサムとPythonのコア開発チームは BeOpen.com に移り、BeOpen PythonLabs チームを結成する。同年10月、PythonLabsチームはDigital Creations(現在のZope Corporation) に移る。
  • 2001年 - Pythonに関する知的財産を保有するための非営利組織Python Software Foundation(PSF) が立ち上がる。このときZope CorporationはPSFの賛助会員となる。

Pythonに影響を与えた言語

言語の機能

Pythonは言語自身の機能をできるだけ小さくおさえ、ユーザがいつも必要とする最小限の機能のみを提供するように作られている。これはPerlのTIMTOWTDI(there's more than one way to do it - あることをするのにいくつものやり方がある)という哲学とは対照的であり、Pythonでは多くのユーザによって書かれた同一の仕事をするプログラムは、だいたいどれも同じようなコードに収束する。基本機能にないものの多くはライブラリによって提供されている。

また、Pythonではプログラムの文書化(ソフトウェアドキュメンテーション)が重視されており、言語の基本機能の一部となっている。Pythonはもともと教育用に設計されたためか、読みやすく、それでいて効率もよいコードをなるべく簡単に書けるようにするという思想がすみずみまで浸透しており、Pythonコミュニティでもわかりやすいコードをよしとする傾向が強い。

文法

Pythonの文法は基本的にCやJavaなどとよく似ているが、Python独自の特徴のひとつにインデントを用いたブロック構造の定義がある。これは通常のCなどにおける中カッコによるブロック構造のかわりに、行頭からの空白(インデント)による「見た目のブロック構造」と「実際の論理的な制御構造」を結びつける手法で、視覚に訴えるコードの使用を強制している。なお、C/C++やJavaでは文末に ;(セミコロン)をつける必要があるが、Pythonでは必要ない。ただしPythonでもセミコロンは文末として機能するため、複数の文をつなげる目的で ;(セミコロン)を使ってもかまわない。しかし、if-else構文などは (Python 2.4までは) 本質的に 1行で書くことは不可能であった。Python2.5で導入された条件付評価式 (Conditional Expressions) のif-elseを使用すれば、1つの式として記述できる。

以下にCとPythonで再帰呼び出しを用いて階乗を計算する例を示す:

Python:

def factorial(x):
    if x == 0:
        return 1
    else:
        return x * factorial(x - 1)

きれいなC:

int factorial(int x)
{
    if(x == 0) {
        return 1;
    } else {
        return x * factorial(x - 1);
    }
}

こうして見るとPythonときれいなCプログラムとの間に違いはほとんど見られない。しかしここで重要なのは、上のCの形式は単なるコーディングスタイルのひとつにすぎないということである。そのため、Cではまったく同じプログラムを以下のように書くこともできる:

わかりにくいC:

int factorial(int x) {
 if(x == 0) {return 1;} else
 {return x * factorial(x - 1); } }

Pythonではこうした書き方は許されていない。インデントは単なるスタイルではなく、必須の文法だからである。Pythonではこのような強制を課すことによって、プログラムのスタイルがその書き手にかかわらずほぼ統一したものになり、その結果読みやすくなる、という思想があるが、一部の人々からは、これはプログラマがスタイルを選ぶ自由を制限するものだ、との声もあがっている。


また、空白を適宜にいれて整形されたソースコードは、たしかに読みやすいものとなる。しかし、それだけでは十分ではない。

間違えたC:

if (x > 10)
    x = 10;
    y = 0;

このコードは、文法的には正しいが、おそらく書いた本人が意図した動作をせず、しかも、それを見つけるのが困難である。

多くの人は、どのようなコーディングスタイルであれ、インデントのような空白によって明確に整列されたコードを目安としてソースコードを読むのであって、コンパイラのように構文解析しながらソースを読むものではない。その結果、文法は正しく、見た目も一見正しく見えるのに、不具合を作り込んでしまう危険性がある。

Pythonでは、インデントを文法の一部に組み入れることにより、人間が目視するソースコードの理解と、コンパイラの構文解析の間のミスマッチを少なくすることで、より正確に意図したとおりにコーディングすることができるようになっている。

データ型

Pythonのデータは動的に型付けされる。値自身が型を持っており、変数はすべて値への参照である。

基本的なデータ型として、整数型・多倍長整数型・浮動小数点数型・複素数型・文字列型・Unicode文字列型、そして関数型がある。多倍長整数型は(メモリの許す限り)無制限の桁数で整数計算が可能である。

さらに組み込みのコンテナ型として、リスト型、タプル型、辞書型(連想配列)のほか、値の重複を許さない集合型(Python 2.3以降)がある。

リスト型および辞書型は内部の値をあとから変えられる(mutable、変更可能)が、タプル型は一度構築したら内部の値は変わらない(immutable、変更不能)。タプル型とリスト型は、多くのプログラミング言語では配列と呼ばれるものに類似している。しかし、Pythonではタプル型は辞書のキーとして使うことができるが、リスト型は内容が変わるため辞書のキーとして使うことはできないという理由から、これら 2つの型を区別している。集合型には変更可能なものと変更不能なものの 2種類がある。

多くのオブジェクト指向プログラミング言語と同様、Pythonではユーザが新しく自分の型を定義することも可能である。この場合、組み込み型を含む既存の型を継承して新たな型(クラス)を定義する事も、ゼロから全く新しい型を作り出す事も出来る。

Pythonは基本的にメソッドや関数の引数に型を指定する必要がないので、内部で必要とする演算子やメソッドに対応していれば、関数やオブジェクトの設計時点で意図していなかったオブジェクトを引き渡すことも可能である(いわゆるダック・タイピングが可能)

Pythonはガベージコレクションを内蔵しており、参照されなくなったオブジェクトは自動的にメモリから破棄される。CPythonでは、ガベージコレクションの方式として参照カウント方式とマーク・アンド・スイープ方式を併用している。マーク・アンド・スイープ方式のみに頼っている言語では、オブジェクトがいつ回収されるか保証されないので、ファイルのクローズなどをデストラクタに任せることができない。CPythonは参照カウント方式を併用することで、循環参照が発生しない限り、オブジェクトはスコープアウトした時点で必ずデストラクトされることを保証している。 JythonおよびIronPythonではマーク・アンド・スイープ方式を採用しているためスコープアウトした時点で必ずデストラクトされることが前提のコードだとJythonやIronPythonでは正しく動かない。

イテレータを実装するためのジェネレータが言語仕様に組み込まれており、Pythonでは多くの場面でイテレータを使うように設計されている。イテレータの使用はPython全体に普及していて、プログラミングスタイルの統一性をもたらしている。

オブジェクト指向プログラミング

Pythonでは扱えるデータの全てがオブジェクトである。単純な数値といった基本的なデータ型をはじめ、組み込みのコンテナ型、組み込み関数など、これらは全て統一的な継承関係をもつオブジェクトであり「型」をもっている。これらの組み込み型とユーザ定義型は区別されず、組み込み型を継承したクラスを定義できる。上の「データ型」の項で述べたように Pythonは静的な型チェックを持たないため、Javaのようなインターフェイスという言語上の仕組みは必要とされない。

クラスの継承 (inheritance) メカニズムでは、複数の基底クラスを持つことができ(多重継承)、導出されたクラスでは基底クラスの任意のメソッドをオーバライド(override、上書き)することが可能である。

また、オブジェクトには任意のデータを入れることができる。これらのメソッドやデータは、基本的に、すべてpublicであり、virtual(仮想)である。ただし、先頭にアンダースコアをもつメンバをprivateとすることができる。これは単なるマナーであるが、アンダースコアを2つもつ場合は、クラスの外部からメンバの名前を隠された状態(難号化(mangle))とすることでカプセル化を実現できる。また、ほとんどの組み込み演算子(算術演算子(arithmetic operator)や添字表記)はクラスインスタンスで使うために再定義することが可能となっている。

ライブラリ

Pythonには「電池が付属しています("Battery Included")」の発想があり、プログラマがすぐに使えるようなライブラリや統合環境があらかじめディストリビューションに含まれている。このため標準ライブラリは非常に充実しており、ここには正規表現をはじめOSのシステムコールXML処理系、シリアライゼーションHTTPFTP等の各種通信プロトコル電子メールCSVファイルの処理、データベース接続(SQLiteを標準に含む)、GUIフレームワーク (Tkinter,wxPython)、そしてHTMLやPython自身のコードの構文解析ツールなどが含まれる。

サードパーティによるライブラリも多い。行列演算パッケージのNumeric Pythonや画像処理のためのPython Imaging Library、SDLのラッパであるPyGameなどはよく知られている。ただし、マイナーなものまで含めると多すぎて収拾がつかなくなったため、Python Cheese Shop と呼ばれるライブラリのリポジトリを管理する機構が導入された。

多言語の扱い

Pythonは当初1バイト単位での文字列型のみ扱い、かな漢字のようなマルチバイト文字をサポートしていなかったが、Python 2.0からUnicode文字型が新たに導入された。

Pythonでは文字のバイト列表現(エンコーディング)とUnicodeの内部表現を明確に区別している。Unicode文字はメモリ中に保持される抽象的なオブジェクトであり、画面表示やファイルへの入出力のさいには、変換ルーチン(コーデック)を介して特定のエンコーディングのバイト列表現と相互変換する。また、ソースコード中の文字コードを認識する機能があり、これによって異なる文字コードで書かれたプログラムの動きが異なるという危険を解消している。

Pythonでは変換ルーチンをモジュールとして追加することで、さまざまなエンコーディングに対応できるようになっている。日本語の文字コード (EUC-JP, Shift_JIS, MS932, ISO-2022-JP) に対応したコーデックも作成されている。Python 2.4からは、日中韓国語用のコーデックが標準でディストリビューションに含まれるようになったため、現在では日本語の処理に問題はほとんどなくなった。ただしGUIライブラリであるTkinterや統合開発環境のIDLEは、プラットフォームにもよるが、まだきちんと日本語に対応していないものもある。

UTF-8で記述した日本語を含むCGIプログラムを実行すると、「Internal Server Error 500」が発生することがある。そのときはソース先頭部に、次のようにUTF-8によるコーディングであることを明示する。

#!/usr/bin/python
# coding: utf-8
import cgi

教育用言語としてのPython

でも、私の大好きなPython利用法は、騒ぎ立てずに、言語教育でプログラミングの原理を教えること。それを考えてくれ――次の世代の話だね。(『スラッシュドット・ジャパンでの Guido van Rossum へのインタビュー』より)

Pythonは教育用言語であるABCより発展したプログラミング言語であり、実際にプログラミング言語教育に使用され、成功を収めている。また方針として、「非技術者」向けといった利用方法を視野に入れながら開発され続けている。

ユーザ

Pythonを使っている製品あるいはソフトウェア

Pythonを使っている製品あるいはソフトウェアの一覧を参照のこと。

Pythonを利用している企業・機関

Pythonはおもに欧米の企業でよく使われている。大企業ではマイクロソフトアップルなどのパッケージソフトウェア企業をはじめ、GoogleYahoo!YouTube などの企業も利用している [1]。また携帯電話メーカーのNokiaでは、S60シリーズで Python アプリケーションが動く[2]。研究機関では、NASA[3] や日本の高エネルギー加速器研究機構[4]でPythonが使われている。

  1. ^ "Quotes about Python". 2007-01-15 閲覧。
  2. ^ "Python for S60". 2007-01-17 閲覧。
  3. ^ "Quotes about Python". 2007-01-15 閲覧。
  4. ^ "KEKB: An Asymmetric Electron-Positron Collider for B-Factory in KEK". 2007-01-17 閲覧。

外部リンク

This article is from Wikipedia. All text is available under the terms of the GNU Free Documentation License.


Giant Panda

Mercedes Car
James Bond Guide
This site monitored by SitePinger.net