コンテンツにスキップ

Python

出典: フリー百科事典『ウィキペディア(Wikipedia)』

これはこのページの過去の版です。Tribot (会話 | 投稿記録) による 2012年3月14日 (水) 10:41個人設定で未設定ならUTC)時点の版 (bot: WP:BOTREQ#「継承」へのリンク修正依頼 oldid=41637809)であり、現在の版とは大きく異なる場合があります。

Python
ファイル:Python logo.svg
Pythonのロゴ
パラダイム マルチパラダイム
登場時期 1990年
設計者 グイド・ヴァンロッサム
開発者 パイソンソフトウェア財団
最新リリース 3.2.2 / 2011年9月4日
2.7.2 / 2011年6月11日
型付け 強い動的型付け
主な処理系 CPython, Jython, IronPython, PyPy, Unladen Swallow
影響を受けた言語 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は汎用の高水準言語である。プログラマの生産性とコードの信頼性を重視して設計されており、核となるシンタックスおよびセマンティクスは必要最小限に抑えられている反面、利便性の高い大規模な標準ライブラリを備えている。

Unicodeによる文字列操作をサポートしており、日本語処理も標準で可能である。 多くのプラットフォームをサポートしており(動作するプラットフォーム)、また、豊富なドキュメント、豊富なライブラリがあることから、産業界でも利用が増えつつある。

特徴

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

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

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

実装

Pythonには複数の実装が存在する。

  • CPython - 作者によってC言語で書かれたバージョン。通常「Python」といえばこのCPythonを指す。
  • Stackless Python - Cスタックを使わずに独自のスタック(Pythonスタック)で実装したもの。
  • Unladen Swallow - GoogleのチームによるPythonの実装
  • Jython - Java仮想マシン上に移植したもの。PythonからJavaのライブラリを使うことができる。
  • IronPython - .NET Framework/Monoで動作するPython。C#で実装されている。.NET Frameworkのライブラリを使うことができる。動的言語ランタイム上に構築されているため、既存の.NETアプリケーションへマクロ言語として搭載することも可能となっている。
  • PyPy - PythonによるPythonインタプリタの実装
  • Psyco - CPython向けのJITコンパイラ
  • PyMite - 組み込み向けの実装、AVRなどに対応。
  • tinypy - 同じく組み込み向けの実装。ソースコードが64kb未満と非常に軽量なことが謳われている。

ライセンス

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

歴史

元々はAmoebaの使用言語であるABC言語例外処理オブジェクト指向を対応させるために作られた言語である[1]

0.9x

1991年にヴァンロッサムによってPython.0.90のソースコードが公開された。この時点ですでにオブジェクト指向言語の特徴である継承クラス例外処理メソッドやさらに抽象データ型である文字列リストの概念が導入されている。これはModula-3モジュールを参考にしていた。

1.x

1994年1月、Python1.0がリリースした。主な特徴として関数型言語の基本であるラムダ計算を実装、MAP型REDUCEなどが組み込まれている。

バージョン1.4ではCommon Lispにある機能とよく似たキーワード引数が導入された。また簡易ながら名前修飾を用いたカプセル化も実装された。

2.x

2000年に公開。ガベージコレクションUnicodeリストが導入され一躍メジャーな言語となった。多くの機能をHaskellから参考している。

3.x

2008年、長いテスト期間を経てPython3.0がリリースされた。 開発初期には、西暦3000年にリリース予定の理想のPythonとして、Python 3000と呼ばれていたため、Py3Kと略されることもある。

しかし2.xとの後方互換性が損なわれており使い手がまだまだ少ないのが現状である。

Python の時系列

  • 1990年代始め - オランダにあるStichting Mathematisch Centrum(CWI)で、グイド・ヴァンロッサムによってPythonの初期バージョンが作成される。
  • 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設計以前に教育用言語であるABCの開発にかかわっているが、Pythonは教育を目的として設計されたわけではない[2]

Pythonには、読みやすく、それでいて効率もよいコードをなるべく簡単に書けるようにするという思想がすみずみまで浸透しており、Pythonコミュニティでもわかりやすいコードをよしとする傾向が強い[3]


文法

決してPython独自の特徴ではないが、しばしば代表的な文法的特徴として挙げられるのが、「インデント(字下げ)」である。Pythonではブロック構造を記述するためにインデントを用いる。

ブロック構造は、他のメジャーなプログラミング言語(たとえばC言語など)においては、カーリーブラケット("{ }"。「中括弧」と呼ばれる)を用いて表記されることが多い。しかし、Pythonではこれを行頭からの空白(インデント)によって表記する。これは、「見た目のブロック構造」と「実際の論理的な制御構造」を結びつける手法であり、視覚に訴えるコードの使用を強制する、という意義をもつ。

以下に、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以降)がある。

Python 3.x以降では、整数型が多倍長整数型と統合され、従来の文字列型とUnicode文字列型に代わり、バイト列型と文字列型が導入された。

リスト型および辞書型は内部の値をあとから変えられる(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)、そしてHTMLやPython自身のコードの構文解析ツールなどが含まれる。

サードパーティによるライブラリも豊富に存在する。行列演算パッケージのNumPy、画像処理のためのPython Imaging LibrarySDLのラッパであるPygameなどがよく知られている。マイナーなものまで含めると多すぎて収拾がつかなくなったため、Python Package Index (PyPI) と呼ばれる公式のパッケージリポジトリが導入された。

多言語の扱い

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

Python 3.0では、文字列型がバイト列型に、Unicode文字列型が文字列型に変更された。 従来は文字列の表現方法として2通り(旧文字列型と旧Unicode文字列型)があったが、これを1通り(新文字列型=旧Unicode型)に統一し、旧文字列型は単なるバイト列型として再定義された。 これにより、Python 3.0では、文字列を扱う際には後述の変換処理を必ず行う必要がある。 ファイル入出力など、エンコードを明示しなければ標準エンコードを用いて暗黙に行われる場合も多い。 これにより、多言語の扱いを一貫したものにしている。

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

適応範囲はWebプログラミングGUIベースのアプリケーション、CAD3Dモデリング数式処理など幅広い分野に及ぶ。さらにスクリプト言語としての特性から、従来Perlシェルスクリプトが用いられることの多かったシステム管理用のスクリプトとして採用しているOSも複数ある。また、多くの異なる言語で書かれたモジュールをまとめるグルー言語としての利用例も多い。実際、多くの商用アプリケーションで Python は組み込みのスクリプト言語として採用されている。

教育用

Pythonは汎用言語として設計されているがプログラミングの教育にも使用されている。また方針として非技術者向けといった利用を視野に入れながら開発され続けており[7]、作者も教育用として利用されていることについて期待感を示している。

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

脚注

  1. ^ Why was Python created in the first place?
  2. ^ http://www.rakunet.org/tsnet/TSpython/35/1067.html
  3. ^ The Zen of Python”. import this. 2011年8月5日閲覧。
  4. ^ a b Quotes about Python”. 2007年1月15日閲覧。
  5. ^ Python for S60”. 2007年1月17日閲覧。
  6. ^ KEKB: An Asymmetric Electron-Positron Collider for B-Factory in KEK”. 2007年1月17日閲覧。
  7. ^ EDU-SIG: Python in Education”. 2011年5月16日閲覧。

関連項目

  • MyHDL - Python言語ベースのハードウェア記述言語

外部リンク

Template:Link FA Template:Link GA Template:Link GA