Python
テンプレート:Infobox プログラミング言語 テンプレート:プログラミング言語
Python(パイソン)は、広く使用されている汎用のスクリプト言語である。コードのリーダビリティが高くなるように言語が設計されていると主張され、その構文のおかげで、Cなどの言語に比べて、より少ないコード行数でプログラムを表現することができる[1][2]と主張されている。小規模なプログラムから大規模なプログラムまで、さまざまなプログラムをクリアに書けるように、多くのコードが提供されている[3]。
Pythonは複数のプログラミングパラダイムをサポートしており、オブジェクト指向、命令型、関数型、手続き型などのスタイルでプログラムを書くことができる。動的型付けである。参照カウントベースの自動メモリ管理(ガベージコレクタ)を持つ。さまざまな領域をカバーする大規模な標準ライブラリを提供している[4]。
他の動的言語と同様に、しばしばスクリプト言語として使われるが、スクリプト以外の幅広い領域でも使用されている。Py2exe や Pyinstaller などのサードパーティ製のツールを使用すれば、スタンドアロンの実行プログラムにパッケージングすることもできる[5]。Pythonのインタープリタは、さまざまなオペレーションシステムで使用することができる。
リファレンス実装のCPythonは、フリーかつオープンソースのソフトウェアであり、コミュニティベースの開発モデルを採用している。その他の代替実装も概ね同様である。CPythonは、非営利団体であるPythonソフトウェア財団が管理している。
Pythonは、オランダ人のグイド・ヴァンロッサムによって開発された。名前の由来は、イギリスのテレビ局 BBC が製作したコメディ番組『空飛ぶモンティ・パイソン』であるが、Pythonという英単語が意味する爬虫類のニシキヘビがPython言語のマスコットやアイコンとして使われることがある。
目次
概要
Pythonは汎用の高水準言語である。プログラマの生産性とコードの信頼性を重視して設計されており、核となるシンタックスおよびセマンティクスは必要最小限に抑えられている反面、利便性の高い大規模な標準ライブラリを備えている。
Unicodeによる文字列操作をサポートしており、日本語処理も標準で可能である。 多くのプラットフォームをサポートしており(動作するプラットフォーム)、また、豊富なドキュメント、豊富なライブラリがあることから、産業界でも利用が増えつつある。
特徴
Pythonはインタプリタ上で実行されることを前提に設計されており、以下のような特徴をもっている:
動作するプラットフォーム
Pythonの最初のバージョンはAmoeba上で開発されたが、のちに多くのプラットフォーム上で動作するようになっている。
- Windows, Windows CE(9x系およびNT系は最新版、Windows 3.1およびMS-DOSは旧版のみ)
- Macintosh(OS 9以前およびOS X以降ともに)
- 各種UNIX
- Linux(Linux Standard Base3.2で標準仕様となった)
- Plan 9(Python 3.xは未移植)
- PalmOS
- S60
- Javaプラットフォーム (Jython)
- .NET Frameworkプラットフォーム (IronPython)
実装
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 (RPython) によるPythonの実装
- Psyco - CPython向けのJITコンパイラ
- PyMite - 組み込み向けの実装、AVRなどに対応。
- tinypy - 同じく組み込み向けの実装。ソースコードが64kb未満と非常に軽量なことが謳われている。
ライセンス
Python のリリースは全てオープンソースであり、PSF(Python Software Foundationライセンス)として配布されている。これはGPL互換であるが、GPLと異なり、変更したバージョンを配布する際に変更をオープンソースにしなくてもよい。
歴史
元々はAmoebaの使用言語であるABC言語に例外処理やオブジェクト指向を対応させるために作られた言語である[6]。
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を参考にして導入している。
2.6以降のバージョンには、2.xから3.xへの移植を助ける「2to3 ツール」と「lib2to3 モジュール」が含まれている[7]。
バージョン | リリース日[8] |
---|---|
2.0 | 2000年10月16日 |
2.1 | 2001年4月15日 |
2.2 | 2001年12月21日 |
2.3 | 2003年7月29日 |
2.4 | 2004年11月30日 |
2.5 | 2006年9月19日 |
2.6 | 2008年10月1日 |
2.7 | 2010年7月4日 |
3.x
2008年、長いテスト期間を経てPython3.0がリリースされた。 開発初期には、西暦3000年にリリース予定の理想のPythonとして、Python 3000と呼ばれていたため、Py3Kと略されることもある。
しかし2.xとの後方互換性が損なわれており、2.xから3.xへの片方向の変換スクリプトが用意されているもののテンプレート:要出典範囲。
バージョン | リリース日[8] |
---|---|
3.0 | 2008年12月3日 |
3.1 | 2009年6月27日 |
3.2 | 2011年2月20日 |
3.3 | 2012年9月29日 |
3.4 | 2014年3月16日 |
- 3.0[9]
- print命令がprint関数へ変更
- Unicodeが全面採用
- 整数をint型に一本化
- 順序付き辞書
- 単体テストフレームワーク「unittest」への機能追加
- TkinterでのTileサポート
- import文のリファレンス実装となる、Pythonで実装されたimportlibモジュール
- ネストされたwith文に対する新たな文法
- 3.2[12]
- 単体テストモジュールのアップデートや拡張モジュール向け stable ABI
- pyc レポジトリディレクトリのサポート
- E-mail パッケージや SSL モジュールの改善
- pdb (Python debugger) の改良
- 3.3
- 3.1リリースから2年間、言語仕様を凍結し変更を行わない「モラトリアム期間」が解除された[13]。
- 新しい文法として、ジェネレーター関数内で別のジェネレータ関数を利用する「yield form」が追加。
- 「u」や「U」といったプレフィックスを用いたUnicodeリテラルシンタックスが復活
- UCS-4文字列にも対応し、文字列表現の柔軟性が強化
- 仮想化されたPython実行環境を導入するためのvirtualenvパッケージの機能が「venv」機能としてコアに取り込まれた。
- オブジェクト指向ファイルシステムパスを提供する「pathlib」モジュールの提供
- 列挙型を扱うためのenumモジュールの標準化
- 統計関数を提供するstatisticsモジュールの導入
- Pythonが割り当てたメモリブロックを追跡するためのデバッグツールのtracemallocモジュールの導入
- 非同期I/Oを扱うためのフレームワークとなるasyncioモジュールの導入
- Pythonの組み込み関数に関する分析情報を得るため機構の実装
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ソフトウェア財団(PSF)が立ち上がる。このときZope CorporationはPSFの賛助会員となる。
Pythonに影響を与えた言語
- ABC(インデントによる構文)
- Modula-2, -3(モジュール機能、オブジェクト指向)
- Icon(辞書、スライス演算子など)
- SETL(リストの内包表現)
- C, C++(基本的な構文)
- Smalltalk(仮想マシン機構、動的性)
- Lisp, Scheme(関数型言語の機能)
言語の機能
Pythonは言語自身の機能をできるだけ小さくおさえ、ユーザがいつも必要とする最小限の機能のみを提供するように作られている。これはPerlのTIMTOWTDI(there's more than one way to do it - あることをするのにいくつものやり方がある)という哲学とは対照的であり、Pythonでは多くのユーザによって書かれた同一の仕事をするプログラムは、だいたいどれも同じようなコードに収束する。基本機能にないものの多くはライブラリによって提供されている。
また、Pythonではプログラムの文書化(ソフトウェアドキュメンテーション)が重視されており、言語の基本機能の一部となっている。
グイド・ヴァンロッサムはPython設計以前に教育用言語であるABCの開発にかかわっているが、Pythonは教育を目的として設計されたわけではない[16]
Pythonには、読みやすく、それでいて効率もよいコードをなるべく簡単に書けるようにするという思想が浸透しており、Pythonコミュニティでもわかりやすいコードをよしとする傾向が強い[17]。
構文
インデント(「オフサイドルール」)が特徴的である。
以下に、階乗を題材にC言語と比較した例を示す。
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;
このコードはC言語の構文規則上は問題無いが、インデントによる見かけのifの範囲と、言語仕様によるifの実際の範囲とが異なっているため、プログラマの意図が曖昧になる。この曖昧さは、検知しにくいバグを生む原因になる。
ソースコードを読む際、多くの人はインデントのような空白によって明確に整列されたコードを目安として読み、コンパイラのように構文解析しながらソースを読むものではない。その結果、一見しただけでは原因を見つけられないバグを作成する危険がある。
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処理系、シリアライゼーション、HTTP、FTP等の各種通信プロトコル、電子メールやCSVファイルの処理、データベース接続 (SQLiteを標準で扱える)、GUIフレームワーク (Tkinter)、そしてHTMLやPython自身のコードの構文解析ツールなどが含まれる。
サードパーティによるライブラリも豊富に存在する。行列演算パッケージのNumPy、画像処理のためのPython Imaging Library、SDLのラッパであるPygameなどがよく知られている。マイナーなものまで含めると多すぎて収拾がつかなくなったため、Python Package Index (PyPI) と呼ばれる公式のパッケージリポジトリが導入された。
多言語の扱い
Pythonは当初1バイト単位での文字列型のみ扱い、かな漢字のようなマルチバイト文字をサポートしていなかったが、Python 2.0からUnicode文字型が新たに導入された[18]。
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からは、日中韓国語用のコーデックが標準でディストリビューションに含まれるようになったため[19]、現在では日本語の処理に問題はほとんどなくなった。ただしGUIライブラリであるTkinterや統合開発環境のIDLEは、プラットフォームにもよるが、まだきちんと日本語に対応していないものもある。
ソースコードの文字コードは、ASCIIと互換性があり、Pythonが対応しているものを使用する。 デフォルトエンコーディング[20]以外の文字コードを使う場合は、ソースファイルの 1行目か 2行目に一定の書式でコメントとして記述することになっており[21]、しばしば以下のようにEmacsやVimなどのテキストエディタにも認識可能な書式で記述される(次の例は Emacs が認識できる書式)。
#! /usr/bin/python
# -*- coding: utf-8 -*-
s = '日本語の文字列'
利用
Pythonはおもに欧米の企業でよく使われている。大企業ではマイクロソフトやアップルなどのパッケージソフトウェア企業をはじめ、Google、Yahoo!、YouTube などの企業も利用している[22]。また携帯電話メーカーのNokiaでは、S60シリーズで Python アプリケーションが動く[23]。研究機関では、NASA[22]や日本の高エネルギー加速器研究機構[24]でPythonが使われている。
適応範囲はWebプログラミング、GUIベースのアプリケーション、CAD、3Dモデリング、数式処理など幅広い分野に及ぶ。さらにスクリプト言語としての特性から、従来Perlやシェルスクリプトが用いられることの多かったシステム管理用のスクリプトとして採用しているOSも複数ある。また、多くの異なる言語で書かれたモジュールをまとめるグルー言語としての利用例も多い。実際、多くの商用アプリケーションで Python は組み込みのスクリプト言語として採用されている。
教育用
Pythonは汎用の言語として設計されており、教育を目的として設計されたわけではない[16]が、教育にも使用されている。また方針として非技術者向けといった利用を視野に入れているとされることもあり[25]、作者が教育用として利用されていることについて期待感を示したこともある。
私の大好きなPython利用法は、騒ぎ立てずに、言語教育でプログラミングの原理を教えること。それを考えてくれ――次の世代の話だね。-- スラッシュドット・ジャパン『 Guido van Rossum へのインタビュー』
脚注
関連項目
テンプレート:Portal テンプレート:Sister テンプレート:Sister
- MyHDL - Python言語ベースのハードウェア記述言語
- スクリプト言語
- オブジェクト指向プログラミング
外部リンク
- Python公式サイト テンプレート:Ref-en
- 日本Pythonユーザ会 - マニュアル日本語訳の配布
- ↑ テンプレート:Cite book
- ↑ テンプレート:Cite web
- ↑ 引用エラー: 無効な
<ref>
タグです。 「AutoNT-7
」という名前の引用句に対するテキストが指定されていません - ↑ 引用エラー: 無効な
<ref>
タグです。 「About
」という名前の引用句に対するテキストが指定されていません - ↑ テンプレート:Cite web
- ↑ 引用エラー: 無効な
<ref>
タグです。 「faq-created
」という名前の引用句に対するテキストが指定されていません - ↑ テンプレート:Cite web
- ↑ 8.0 8.1 テンプレート:Cite web
- ↑ テンプレート:Cite web
- ↑ テンプレート:Cite web
- ↑ テンプレート:Cite web
- ↑ テンプレート:Cite web
- ↑ テンプレート:Cite web
- ↑ テンプレート:Cite web
- ↑ テンプレート:Cite web
- ↑ 16.0 16.1 引用エラー: 無効な
<ref>
タグです。 「not-for-education
」という名前の引用句に対するテキストが指定されていません - ↑ 引用エラー: 無効な
<ref>
タグです。 「PEP20
」という名前の引用句に対するテキストが指定されていません - ↑ 引用エラー: 無効な
<ref>
タグです。 「PEP100
」という名前の引用句に対するテキストが指定されていません - ↑ 引用エラー: 無効な
<ref>
タグです。 「whats-new-in-python-24
」という名前の引用句に対するテキストが指定されていません - ↑ デフォルトのデフォルトエンコーディングは、Python3.xではUTF-8、Python2.xではASCIIである。
- ↑ 引用エラー: 無効な
<ref>
タグです。 「PEP263
」という名前の引用句に対するテキストが指定されていません - ↑ 22.0 22.1 引用エラー: 無効な
<ref>
タグです。 「quotes
」という名前の引用句に対するテキストが指定されていません - ↑ テンプレート:Cite web
- ↑ テンプレート:Cite web
- ↑ 引用エラー: 無効な
<ref>
タグです。 「edu-sig
」という名前の引用句に対するテキストが指定されていません